Upgrade to Pro — share decks privately, control downloads, hide ads and more …

もう少しテストを書きたいんじゃ〜 #phpstudy

もう少しテストを書きたいんじゃ〜 #phpstudy

第173回 PHP勉強会@東京でのメイン発表枠の資料です
https://phpstudy.connpass.com/event/344583/

hideki kinjyo

February 26, 2025
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. 自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h / 𝕏

    : @o0h_ • 好きなFWはCakePHP • アイコンは美味しい鮭親子丼の写真です • 最近はPodcastをやっています • ハッシュタグ: #readlinefm  
  2. 状態ベース・テスト [文献] 単体テストの考え方/使い方 (6章) • 何らかの操作を行い、対象の状態を検査 する • ファイルへの書き込みやDBのデータ更新 も、この範疇

    • 「計算して結果を直接返す」ことが出来 ないが、「結果が何処か別の所で観察で きる」場合などに使う   
  3. コミュニケーション・ 
 ベース・テスト [文献] 単体テストの考え方/使い方 (6章) • テスト対象から、その協力オブジェクト への入力を検査する •

    結果を返してもくれないし、かつ影響 (変更)を観測できない場合に使う • モックやスパイ等のテクニックが必要   
  4. ディシジョンテーブルテスト [文献] はじめて学ぶソフトウェアのテスト技法 (5章) • 「入力」「出力」のバリエーションを表形式で整理し、組み合わせの 漏れをなくす • 1列 =

    1ケースとして扱う   έʔε1 έʔε2 έʔε3 έʔ ೖྗ Ωϟϯϖʔϯظؒத y y y ݶఆ඼ n y n Ωϟϯϖʔϯର৅Ձ֨ Ҏ্ Ҏ্ ະຬ ظ଴ Ձ֨ -10% ±0% ±0% ϙΠϯτ 5% 5% 3%
  5. そのテスト、駄目そう • 機能: 指定されたIDのユーザーを消す • テスト: • id=1を入力して、操作を実行する • ユーザー(id=1)が消えていることを確認する

    • テスト2[三角測量]: • ユーザー(id=2)が消えていないことを確認する • 取りうるIDは「指定されたID」か「指定されていないID」だけなので、 
 それらの同値クラスを代表する値を1つずつ確かめられていればOK  
  6. こんなテスト、どうする? • 機能: 入力されたメッセージを、世界中の市役所に送信する • テスト: • メッセージを実際に入力して • 「送信されたかな」を確認する

    • 問題: • 「世界中の市役所が壊れていたら」という挙動を確認できない • シナリオ1: 入力が正しく、送信先も正常な場合、成功   テスト対象 クラス 世界市役所 
 クライアント ココがOK ココもOK
  7. こんなテスト、どうする? • 機能: 入力されたメッセージを、世界中の市役所に送信する • テスト: • メッセージを実際に入力して • 「送信されたかな」を確認する

    • 問題: • 「世界中の市役所が壊れていたら」という挙動を確認できない • シナリオ1: 入力が正しく、送信先も正常な場合、成功 • シナリオ2: 入力が正しくなくて、失敗   テスト対象 クラス 世界市役所 

  8. こんなテスト、どうする? • 機能: 入力されたメッセージを、世界中の市役所に送信する • テスト: • メッセージを実際に入力して • 「送信されたかな」を確認する

    • 問題: • 「世界中の市役所が壊れていたら」という挙動を確認できない • シナリオ1: 入力が正しく、送信先も正常な場合、成功 • シナリオ2: 入力が正しくなくて、失敗 • シナリオ3: 入力が正しく、送信先が異常な場合、???   テスト対象 クラス 世界市役所 
 クライアント ココがOK ココがNG
  9. こんなテスト、どうする? • 機能: 入力されたメッセージを、世界中の市役所に送信する • テスト: • メッセージを実際に入力して • 「送信されたかな」を確認する

    • 問題: • 「世界中の市役所が壊れていたら」という挙動を確認できない • シナリオ1: 入力が正しく、送信先も正常な場合、成功 • シナリオ2: 入力が正しくなくて、失敗 • シナリオ3: 入力が正しく、送信先が異常な場合、???   これも 
 「要素」×「状態」 
 で洗い出せる
  10. こんなテスト、ダミーオブジェクトを使う • モックとかスタブとか • 「もし、こうなったら?」を 
 ハリボテ化する • これらは、 


    テストを簡単にするための方法 • 簡単 = テストの実装をシンプルに • 簡単 = テストの意図をわかりやすく   テスト対象 クラス 世界市役所 
 クライアント ココがOK ココがNG スタブ!
  11. カバレッジの練習 カバレッジだけで見えてこないもの 
 => まだ欠陥があるかも 例: • お弁当2つ以上でお茶が全部無料にな るバグ •

    あらゆる条件でお茶が無料にならない バグ • あらゆる条件でお茶が1本無料になる バグ  
  12. 参考書籍 • Vladimir Khorikov 著ほか. 単体テストの考え方/使い方, マイナビ出 版, 2022.12, (Compass

    Programming). 978-4-8399-8172-3. • リー・コープランド 著ほか. はじめて学ぶソフトウェアのテスト技 法, 日経BP社, 2005.11. 4-8222-8251-1. • Kent Beck 著ほか. テスト駆動開発, オーム社, 2017.10. 978-4-274- 21788-3.