テスト駆動での実装の使い所
第157回 PHP勉強会
@docomo R&D OPEN LAB ODAIBA
2023年10月25日 新倉涼太
Copyright© M&Aクラウド
niisan -i
2
AI(Stable Diffusion)君に作ってもらった自分の似顔絵
Copyright© M&Aクラウド
お品書き
3
Copyright© M&Aクラウド
テスト駆動開発やってますか?
4
Copyright© M&Aクラウド
テスト駆動開発やってますか?
5
すんません
やってないっす
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
そもそもテスト駆動開発ってなんだっけ?
6
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
テスト「駆動」とはどういうことか
7
まず、ゴール地点を定める( やりたいこと・TODOリストの作成 )
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
テスト「駆動」とはどういうことか
8
やりたいことから一つを選び、テストを書く。この時、テストが失敗していることを確認することで、実装が必要なことを確認する
テスト
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
テスト「駆動」とはどういうことか
9
テストが通るように実装をする。テストが通ることを確認することで、やりたいこと・TODOの一つを確実にクリアすることができる。
テスト
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
テスト「駆動」とはどういうことか
10
実装を修正し、コードを整理して綺麗にすることで、可読性を改善したり、動作効率を良くしたりする。
テストが通った状態を維持しているので、やりたいことは達成できている
テスト
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
テスト「駆動」とはどういうことか
11
ゴールまで実装しきれば、タスク完了
テスト
テスト
タスク完了!!
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
テスト「駆動」とはどういうことか
12
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
いや、お前、テスト駆動やっていない言うたやんけ
13
…
Copyright© M&Aクラウド
テスト駆動開発ってなんだっけ
なぜテスト駆動をやっていないのか
14
一発でいけるよ
テスト
テスト
テストに駆動してもらわなくても、実装できるケースが多いので、結局テスト駆動でやらないことが多い
Copyright© M&Aクラウド
テスト駆動で実装したい時
15
Copyright© M&Aクラウド
テスト駆動開発で実装したい時
16
テスト駆動開発をしているわけではないが、たまにテスト駆動で実装することはある
Copyright© M&Aクラウド
テスト駆動で実装したい時
たまに現れる実装方針がわからんやつ
17
?
?
?
Copyright© M&Aクラウド
テスト駆動で実装したい時
たまに現れる実装方針がわからんやつ
18
💡
テスト
テスト駆動で着実に実装を前進させれば、完成に迎えるはず
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
19
https://gist.github.com/niisan-tokyo/613a12edb2e71fe3f755ad06dd475033
実際のコードを例にして、実装の方針が立てにくい場合でも、実装を着実に前進させることをみてみよう
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
20
全文検索エンジンのElasticSearchのクエリビルダを作ろう!
https://www.elastic.co/jp/elasticsearch
RESTチックなAPIを利用して、インデックスから全文検索を実行し、結果を得ることができ。検索クエリはJSONで指定できる
ここが検索クエリの部分。人間の手でここを書くのが面倒なので、今回はここを生成するphp製のビルダを実装する
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
21
こんな感じで使えるようになればいいね!
連想配列をjsonに変換すればクエリとして使える
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
22
?
?
?
そもそもクエリビルダってどう作るの?
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
23
やりたいことは大体わかっている
でも、実装の方針が立たない
手が止まってしまう
とりあえず、TODOリストは作れるので、作ってしまえ!
そこからテストを作って、実装の起点にしていこう!
💡
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
24
実装方針が立たないけど、とりあえず、やりたいことをリストにしてみる
ElasticSearchのクエリビルだってことで大体こんなことくらいはやりたいかな?
・ ワード検索ができる
・ IDなどで検索ができる
・ 複数のIDのどれかに一致する検索ができる
・ AND検索ができる
・ OR検索ができる
・ 特定のIDを除外する検索ができる
・ 値の範囲検索ができる
・ 部分的にOR検索ができる
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
25
適当に空のテストを書いてみる
./vendor/bin/phpunit tdd/ElasticSearch/QueryBuilderTest.php --testdox
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
26
まずは、ワード検索のテストを書いてみる
テストが失敗しているのを確認できる。
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
27
テストが通るように実装する
テスト成功!次に進もう
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
28
どんどん進めていくぞ!
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
29
どんどん進めていくぞ!
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
30
and検索行きたいが・・・
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
31
一気に配列の階層が増えているので、これに対応しなければならないな
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
32
テストが通ったぞ!これで先に・・・
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
33
今までのテストが全部落ちたー!?
AND検索はできるようになったけど、これまでのテストが落ちてる。
何らかの対応が必要だ!
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
34
現れる二つの選択肢
現在の仕様に合わせ、条件を一つだけ指定した場合と、複数指定した場合で返却する方法を変えるか
とりあえず、条件の数に関わらず、
[‘bool’ => [‘must’ => [...]]]
という形で出力するように実装するか
( テストを修正する必要がある )
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
35
クエリーの数に従って返却値を修正する
これで前進したぞ!
Copyright© M&Aクラウド
テスト駆動で実装したい時
実際の例: ElasticSearchのクエリビルダ
36
実装を進め、全部テスト通ったらタスク完了!
改善点とか、まだやるべきところはあるけど、一旦今回は完了になる
Copyright© M&Aクラウド
テスト駆動で実装したい時
テスト駆動での実装
37
Copyright© M&Aクラウド
テスト駆動で実装したい時
テスト駆動での実装の超重要なこと
38
コードを書く手が止まらない
Copyright© M&Aクラウド
まとめ
まとめ
39
Copyright© M&Aクラウド
おまけ
バグ修正はテスト先に書くのがおすすめ
40
Copyright© M&Aクラウド
乙
41
Copyright© M&Aクラウド