Slide 1

Slide 1 text

テスト嫌いな自分の 苦手意識がなくなった話 はやしまき PHPカンファレンス北海道2024 1

Slide 2

Slide 2 text

はやし まき        @_mkmk884 NE株式会社 新卒3年目 小田原からきました! 北海道 人生4回目 よく食べるため、前回北海道に来た時、 一緒にいた友達に胃薬を飲ませた経験あり 2

Slide 3

Slide 3 text

テスト書くの苦手で嫌いだった 何を目的にして書けばいいのかわからない 2年目始めの わたし 3 当時のドキュメント

Slide 4

Slide 4 text

うまくいかないときに、 なぜうまくいってないのかが わからない このメソッドが似てるし、 このメソッドのテストコード とりあえずコピーして 書き換えるぞい 似ているプロダクトコードのテストコードを真似て書く なーーーんかわからないけど、とりあえず書いてた 過剰に時間を消耗 4

Slide 5

Slide 5 text

うまくいかないときに、 なぜうまくいってないのかが わからない ????? なんで? 似ているプロダクトコードのテストコードを真似て書く なーーーんかわからないけど、とりあえず書いてた 過剰に時間を消耗 5

Slide 6

Slide 6 text

うまくいかないときに、 なぜうまくいってないのかが わからない 似てるコードも自分のコード も、確認しなきゃ… 似ているプロダクトコードのテストコードを真似て書く なーーーんかわからないけど、とりあえず書いてた 過剰に時間を消耗 6

Slide 7

Slide 7 text

書くルールだから書くという意識 テストコードはおまけという気持ち どうせ手で検証するし、 テストで時間食ってるの もったいない メイン プロダクトコード サブ テストコード 7

Slide 8

Slide 8 text

苦手な思い、約1年間…… 苦手意識(ほぼ)なくなりました 丸1日で 8

Slide 9

Slide 9 text

やったこと テスト特化型のペアプロ 9

Slide 10

Slide 10 text

テスト特化型のペアプロ 実装タスクや実装方法を大体知っている、同じチームの人に 丸一日ついてもらって、 自分が今やっている実装のテストをペアプロしてもらった 依存度次第でー… 実際にdeleteされたか、 呼ばれただけを 見るかなどの判断って… ナビゲーター 10

Slide 11

Slide 11 text

テスト苦手克服のための3つの要素 ● テストケースを洗い出せるようになること ● テストコードの書き順を知ること ● 構成要素の使い方を知ること 11

Slide 12

Slide 12 text

ペアプロを通じて得た内容の一部 ① ● テストケースを洗い出せるようになること → 他の人が見た時に、「この時はこうなるんだな」とわかるようにする 12 単体テストにおいて、各テスト・ケースがすべきことは、そのテストに関わる人 たちにテスト対象のコードが解決しようとしている物語(story)を伝えることな のです。そして、その物語を伝えるためには凝集度(cohesion)を高め、非開発 者でも理解できるようにすることが必要になるのです。 単体テストの考え方/使い方 p.48

Slide 13

Slide 13 text

ペアプロを通じて得た内容の一部 ② ● テストコードの書き順を知ること → テストケースを明確にし、テストのメソッドの中身は下から書く 1. 何をAssertするか(確認 Assert) 2. テスト対象のメソッドを実行(実行 Act) 3. このテストで気にしないでいい部分をスタブ・モック化(準備 Arrange) 13 特に、テスト駆動開発(Test Driven Development: TDD)を取り入れている場 合、〔中略〕想定する振る舞いをテスト・ケースにあらかじめ書き出しておき、 その書き出した想定に見合ったシステムにするためにはどう開発するのか、とい うことを考えるようにします。 単体テストの考え方/使い方 p.59

Slide 14

Slide 14 text

● 構成要素の使い方を知ること ペアプロを通じて得た内容の一部 ③ → スタブとモックの使い分け等 14 ● モックはテスト対象システムからその依存に向かって行われる外部に向かうコ ミュニケーション(出力)を模倣し、そして検証するのに使われる。 〔中略〕 ● スタブは依存からテスト対象システムに向かって行われる内部に向かうコミュ ニケーション(入力)を模倣するのに使われる。 単体テストの考え方/使い方 p.133

Slide 15

Slide 15 text

本で得られるならペアプロしなくていいのでは…? 15 自分の実装ベースでテストと向き合えるので、 1段階目のハードルを越えるのにコスパよかった ペアプロ 本読み

Slide 16

Slide 16 text

[結果] 書き始めが早くなった 16 こんな感じの実装だから、 このメソッドが似てるし… 〇〇の時に△△できること を確かめたいから… 別のテストを見に行ったり、理解したりする 余分な時間を削減

Slide 17

Slide 17 text

期待している戻り値や想定する引数を書いてから 実装を進めることで、プロダクトコードの実装も楽に [結果] プロダクトコードを書くのも楽になった 17 この引数を入れたときに、 この戻り値になるメソッドを 実装するぞ

Slide 18

Slide 18 text

後回しにしていたテストコードを プロダクトコードと並行して 書くようになった [結果] 実装とテストを並行して書けるようになった 18 テストコードはサブ プロダクトコードがメイン プロダクトコードが正しく 動くか今確認できちゃうも んね

Slide 19

Slide 19 text

[結果] コミット単位が見やすくなった 19 プロダクトコードとテストコードを1コミットにまとめる テストだけのコミットがなくなった コミット単位でCIを回すことができるので、 他影響範囲も認識できる \ サヨナラ /

Slide 20

Slide 20 text

[結果] コミット単位が見やすくなった 20 プロダクトコードとテストコードを1コミットにまとめる テストだけのコミットがなくなった コミット単位でCIを回すことができるので、 他影響範囲も認識できる \ サヨナラ /

Slide 21

Slide 21 text

[結果] コミット単位が見やすくなった 21 プロダクトコードとテストコードを1コミットにまとめる テストだけのコミットがなくなった コミット単位でCIを回すことができるので、 他影響範囲も認識できる

Slide 22

Slide 22 text

まとめ 22 ● テストペアプロ、コスパいい ● 苦手克服きっかけの要素 ○ テストケースを洗い出せるようになる ○ テストコードの書き順を知る ○ 構成要素の使い方を知る ● プロダクトコードの実装にも効果あり ● プロダクトコードとテストコードを並行して書くと、CIを都度回せて よりハッピーに!

Slide 23

Slide 23 text

みんな来てね〜 23

Slide 24

Slide 24 text

気持ちのよいテストライフを〜 \ おわり / 24