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

テストコードを書き始める前に考えるべきテストの話 #DevSumi / Developers_...

nihonbuson
February 13, 2020

テストコードを書き始める前に考えるべきテストの話 #DevSumi / Developers_Summit_2020

以下のイベントの投影資料です。
https://event.shoeisha.jp/devsumi/20200213/session/2364/

発表時の諸注意など
http://nihonbuson.hatenadiary.jp/entry/2020/01/31/090000

お問い合わせは https://twitter.com/nihonbuson まで。

【発表資料中のURL】

P2 Agile Testing Fellow
https://agiletestingfellow.com/

P15 ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2011.J02
http://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2011.J02.pdf

P20 概説テスト分析
http://www.slideshare.net/takashiyamasaki378/ss-55384920

P48 テスト設計チュートリアル U-30クラス向け 2020年度版
http://aster.or.jp/business/contest/doc/2020_U-30_V1.0.0.pdf#page=65

P57 あなたがやっているのはテスティングかチェッキングか?
https://www.infoq.com/jp/news/2009/12/testing-or-checking

P96 [改訂新版]マインドマップから始めるソフトウェアテスト
https://www.amazon.co.jp/dp/4297105063/

P97 ソフトウェアテスト技法ドリル―テスト設計の考え方と実際
https://www.amazon.co.jp/dp/4817193603

P97 ソフトウェアテスト技法練習帳 ~知識を経験に変える40問~
https://www.amazon.co.jp/dp/429711061X/

P98 Agile Testing Condensed: A Brief Introduction (English Edition)
https://www.amazon.co.jp/dp/B07YR4CC4B

P102 JaSST
http://www.jasst.jp/

P103 WACATE
https://wacate.jp/

P106 ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2018.J03
http://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018.J03.pdf

nihonbuson

February 13, 2020
Tweet

More Decks by nihonbuson

Other Decks in Technology

Transcript

  1. 自己紹介 • 株式会社ビズリーチ ◦ QA基盤推進室 ◦ QA Evangelistチーム • 社外活動

    ◦ WACATE実行委員 ◦ JaSST Review 実行委員長 ◦ ASTER正会員 ◦ Agile Testing Fellow会員 ▪ https://agiletestingfellow.com/ ↓Twitterアイコン 風間 裕也(@nihonbuson)
  2. この発表の注意事項 • テストの話にかける時間数 ◦ 社内の新人研修…丸2日 ◦ デブサミ …45分 • 本来話したい内容の1/15程度しかありません!

    • もっと詳しく話を聞きたい方、 今日参加してない人にも伝えたい方、 講演後、お気軽に話しかけてください!
  3. この発表の注意事項 • 話さない内容 ◦ テストコードの書き方 ◦ TDDのやり方 ◦ 自動テストの設計方法 •

    話す内容 ◦ テストの目的とは何か ◦ テストファーストで行うことの本当の良さ ◦ 何をテストすれば良いのか
  4. テストの目的とは何か? 欠陥の検出 対象ソフトウェアの品質レベルが十分であることの確認 意思決定のための情報の提示 欠陥の作り込みの防止 実装前に行うこともある ISTQBテスト技術者資格制度 Foundation Level シラバス

    日本語版 Version 2011.J02より http://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2011.J02.pdf TDDでの検知、リリース判断、ユーザーの利用判断など… テストの7原則①テストは「⽋陥がある」ことしか⽰せない
  5. なぜ実装前にテスト・レビューをするのか 仕様誤りの修正コスト 要求仕様 設計 実装 テスト リリース後 1倍 5倍 10倍

    20倍 200倍! 出典: Alan M. Davis. ソフトウェア開発 201の鉄則. 日経BP社 修正コストを下げるには…(1) 素早くリリースしてフィードバックをもらい、 すぐに修正できる体制にする
  6. なぜ実装前にテスト・レビューをするのか 仕様誤りの修正コスト 要求仕様 設計 実装 テスト リリース後 1倍 5倍 10倍

    20倍 200倍! 出典: Alan M. Davis. ソフトウェア開発 201の鉄則. 日経BP社 修正コストを下げるには…(2) 早い段階で不具合を発見する
  7. 例題 http://www.slideshare.net/takashiyamasaki378/ss-55384920 あなたが考えた • テスト内容 • 気になった内容 • 起こりそうなバグ をどこかにメモして

    ください。 • パスワードは4文字以上12文字以下の 英数字のみを許容する。 • パスワードを3分以内に4回以上 間違って入力すると、 アカウントを5分間ロックする。 https://www.pexels.com/photo/man-in-brown-shirt-writing-on- notebook-3202028/
  8. なぜ実装前にテスト・レビューをするのか(再掲) 仕様誤りの修正コスト 要求仕様 設計 実装 テスト リリース後 1倍 5倍 10倍

    20倍 200倍! 出典: Alan M. Davis. ソフトウェア開発 201の鉄則. 日経BP社 修正コストを下げるには…(2) 早い段階で不具合を発見する
  9. カバレッジは100%だけど… public boolean judge (int x) { if( x <

    3 ){ return false; } else if( x > 13 ){ return false; } return true; } @Test public void test_short_password{ assertThat( judge(2), is(false)); } @Test public void test_long_password{ assertThat( judge(15), is(false)); } @Test public void test_valid_password{ assertThat( judge(7), is(true)); }
  10. カバレッジは100%だけど… public boolean judge (int x) { if( x <

    3 ){ return false; } else if( x > 13 ){ return false; } return true; } @Test public void test_short_password{ assertThat( judge(2), is(false)); } @Test public void test_long_password{ assertThat( judge(15), is(false)); } @Test public void test_valid_password{ assertThat( judge(7), is(true)); }
  11. カバレッジは100%だけど… public boolean judge (int x) { if( x <

    3 ){ return false; } else if( x > 13 ){ return false; } return true; } @Test public void test_short_password{ assertThat( judge(2), is(false)); } @Test public void test_long_password{ assertThat( judge(15), is(false)); } @Test public void test_valid_password{ assertThat( judge(7), is(true)); }
  12. カバレッジは100%だけど… public boolean judge (int x) { if( x <

    3 ){ return false; } else if( x > 13 ){ return false; } return true; } @Test public void test_short_password{ assertThat( judge(2), is(false)); } @Test public void test_long_password{ assertThat( judge(15), is(false)); } @Test public void test_valid_password{ assertThat( judge(7), is(true)); }
  13. カバレッジは100%だけど… public boolean judge (int x) { if( x <

    3 ){ return false; } else if( x > 13 ){ return false; } return true; } @Test public void test_short_password{ assertThat( judge(2), is(false)); } @Test public void test_long_password{ assertThat( judge(15), is(false)); } @Test public void test_valid_password{ assertThat( judge(7), is(true)); }
  14. Agile Testing Condensedの例 QA=「Question Asker」という考え方 • 誰も質問しないと思う質問を定期的に出す • 自由回答形式の質問もする ◦

    隠れた仮定が明らかになる ◦ 質問例 ▪ 実装しても問題解決できない可能性はあるか? ▪ この機能の使用前にユーザーは何をするか? ▪ その後、ユーザーは何をするか?
  15. モブプロ体験会のお題 • 題材は自動販売機 • Cucumber + JUnit • 与えられた要求は下記の3つ ◦

    100円硬貨を入れたら 入金額が100円になってほしい ◦ 100円硬貨を入れた後に50円硬貨を入れたら 入金額が150円になってほしい ◦ 1円硬貨は対応しないでほしい
  16. モブプロ体験会の結果 Scenario: 入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    入金額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 入金額確認 Given 自動販売機がある When 1円を入金 Then 0円が入金されている public class VendingMachine { int currentMoney = 0; public void insertCoin(int money) { if (money == 50 || money==100) { currentMoney += money; } } public int getCurrentMoney() { return currentMoney; } }
  17. テストシナリオをさらに改善する Scenario: 入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    入金額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 入金額確認 Given 自動販売機がある When 1円を入金 Then 0円が入金されている
  18. テストシナリオをさらに改善する Scenario: 入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    入金額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 入金額確認 Given 自動販売機がある When 1円を入金 Then 0円が入金されている すべてシナリオ名が 『⼊⾦額確認』になってますね。 同じ名前はどうかと思うので 変えたほうが良い気がしてます。 なるほど。 そしたらこんな感じですかね。 (テストシナリオを編集する)
  19. テストシナリオをさらに改善する Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    2回投入時の入金額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 使用不可の硬貨投入 Given 自動販売機がある When 1円を入金 Then 0円が入金されている すべてシナリオ名が 『⼊⾦額確認』になってますね。 同じ名前はどうかと思うので 変えたほうが良い気がしてます。 なるほど。 そしたらこんな感じですかね。 (テストシナリオを編集する)
  20. テストシナリオをさらに改善する Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    2回投入時の入金額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 使用不可の硬貨投入 Given 自動販売機がある When 1円を入金 Then 0円が入金されている なるほど。ちなみに、 2つ⽬のテストの意図って なんですかね︖ コインを1回だけではなく、 2回投⼊した時にも ちゃんと動くか確認したい という意図です。
  21. テストシナリオをさらに改善する Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    2回投入時の入金額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 使用不可の硬貨投入 Given 自動販売機がある When 1円を入金 Then 0円が入金されている なるほどー。 そしたら『2回投⼊時』と 書いていますが、 3回⽬はどうなるのでしょうか︖ 3回⽬は2回⽬と同じく、 加算されていく仕組みなので、 ロジック上は⼤丈夫です。
  22. テストシナリオをさらに改善する Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    2回投入時の入金額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 使用不可の硬貨投入 Given 自動販売機がある When 1円を入金 Then 0円が入金されている ということは、気にしているのは 2回投⼊の⾦額ではなく、 複数回の投⼊時の加算 なんですね。 あー、確かにそうですね。 (テストシナリオを編集する)
  23. テストシナリオをさらに改善する Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    複数回投入時の入金加算額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 使用不可の硬貨投入 Given 自動販売機がある When 1円を入金 Then 0円が入金されている ということは、気にしているのは 2回投⼊の⾦額ではなく、 複数回の投⼊時の加算 なんですね。 あー、確かにそうですね。 (テストシナリオを編集する)
  24. 数年後、テストの意図が分かるのはどっち? Scenario: 入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

    入金額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 入金額確認 Given 自動販売機がある When 1円を入金 Then 0円が入金されている Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario: 複数回投入時の入金加算額確認 Given 自動販売機がある When 100円を入金 And 50円を入金 Then 150円が入金されている Scenario: 使用不可の硬貨投入 Given 自動販売機がある When 1円を入金 Then 0円が入金されている
  25. テストケース名にも役立つ @Test public void _東北地方の場合送料が1000円{ assertThat(calcShipingCost(“青森県”), is(1000)); } @Test public

    void _中国地方の場合送料が510円{ assertThat(calcShipingCost(“広島県”), is(510)); } ハイレベルテストケース ローレベルテストケース
  26. 使用デザイン • スライドデザイン ◦ Professional Google Slides Template ▪ https://slidesmash.com/professional-google-slides-template/

    • アイコン画像 ◦ Lynny Icon Set ▪ https://dribbble.com/shots/1925069-Lynny-Icon-Set-Free