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

テストコードを書き始める前に考えるべきテストの話(2021年版) #scrumosaka / scrum_fest_osaka_2021

テストコードを書き始める前に考えるべきテストの話(2021年版) #scrumosaka / scrum_fest_osaka_2021

以下のイベントの投影資料です。
https://confengine.com/conferences/scrum-fest-osaka-2021/proposal/15337

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

【発表資料中のURL】
P12 ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2011.J02
http://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018V31.J03.pdf#page=15
※2011年版は現在リンク切れのため、最新版のシラバスのURLを掲載しています

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

P29 システム/ソフトウェア製品品質、利用時の品質
https://www.ipa.go.jp/files/000045962.pdf#page=13

P33 勝手にリデザイン:新宿高層ビルの館内施設案内板
https://note.openvista.jp/2011/redesigning-shinjuku-building-sign

P37 ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2018V3.1.J03
https://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018V31.J03.pdf#page=20

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

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

P76 テストから見えてくるグーグルのソフトウェア開発
https://www.amazon.co.jp/dp/B00IE3B522/

P92 見てわかるテスト駆動開発
https://speakerdeck.com/twada/tdd-live-and-workshop-2019-spring?slide=16

P92 顧客が本当に必要だったものから学ぶこと
https://www.casleyconsulting.co.jp/blog/engineer/4334/

P93 事例から学ぶ実例マッピングのやり方
https://speakerdeck.com/nihonbuson/example-mapping

P93 TODOリストの整理を通じて実行すべきテストを考える
https://speakerdeck.com/nihonbuson/tddbc-2020-online-lt

P93 「テストは単純作業ではなく創造的な活動だ」という意識を浸透させた物語
https://speakerdeck.com/nihonbuson/testing-is-the-creative-activity

P94 継続的テストモデル(改)
https://lisacrispin.com/2020/11/01/shifting-left-right-in-our-continuous-world/

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

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

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

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

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

P101 WACATE
https://wacate.jp/

nihonbuson

June 26, 2021
Tweet

More Decks by nihonbuson

Other Decks in Technology

Transcript

  1. 自己紹介 • 風間裕也(ブロッコリー) • @nihonbuson • 所属 ◦ 株式会社ビズリーチ ◦

    QA基盤推進室 QA Evangelist • 社外活動 ◦ JaSST Review実行委員長 ◦ WACATE実行委員 ◦ 書籍『Agile Testing Condensed』 翻訳
  2. アジェンダ • はじめに • テストの目的 • 何をテストすべきか • どうやってテストケースを作るのか •

    QAはどのように開発者と一緒に仕事をするのか • テストの勉強方法 • まとめ
  3. 注意事項 • 話さない内容 ◦ テストコードの書き方 ◦ TDDのやり方 ◦ 自動テストの設計方法 •

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

    テストの7原則①テストは「欠陥がある」ことしか示せない
 ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2011.J02より
  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. 例題 あなたが考えた • テスト内容 • 気になった内容 • 起こりそうなバグ を書いてください。 ※何個でもOK!

    • パスワードは4文字以上12文字以下の 英数字のみを許容する。 • パスワードを3分以内に4回以上 間違って入力すると、 アカウントを5分間ロックする。 https://www.pexels.com/photo/man-in-brown-shirt-writing-on-noteb ook-3202028/ 引用:概説 テスト分析
  8. テストの目的とは何か?(再掲) • 欠陥の検出 • 対象ソフトウェアの品質レベルが十分なことの確認 • 意思決定のための情報の提示 • 欠陥の作り込みの防止 実装前に行うこともある

    テストの7原則①テストは「欠陥がある」ことしか示せない
 ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2011.J02より http://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2011.J02.pdf
  9. 仕様誤りの修正コスト 要求仕様 設計 実装 テスト リリース後 1倍 5倍 10倍 20倍

    200倍! 出典: Alan M. Davis. ソフトウェア開発 201の鉄則. 日経BP社 修正コストを下げるには…(2) 早い段階で不具合を発見する なぜ実装前にテスト・レビューをするのか(再掲)
  10. テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより)

    参考:ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2018V3.1.J02 何をテスト するか それをどう テストするか テストの実行に 必要なものすべて を準備したか テストスイート を実行する
  11. テストケース名にも役立つ @Test public void _東北地方の場合送料が1000円{ assertThat(calcShipingCost(“青森県”), is(1000)); } @Test public

    void _中国地方の場合送料が510円{ assertThat(calcShipingCost(“広島県”), is(510)); } ハイレベルテストケース ローレベルテストケース
  12. テストケースはいくつ? • テストケースは時間があれば無限にできる。 • サンプリング方法としてテスト設計技法がある。 ◦ テストケースを合理的に少なくするための技法 ▪ 同値分割法、AllPair法 ◦

    多くの欠陥が見つかるようにするための技法 ▪ 境界値分析、エラー推測、探索的テスト ◦ ある観点で漏れなくテストするための技法 ▪ カバレッジ、デシジョンテーブル、 状態遷移、ユースケーステスト
  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. カバレッジは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)); }
  15. カバレッジは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)); }
  16. カバレッジは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)); }
  17. カバレッジは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)); }
  18. Agile Testing Condensedの例 • QA=「Question Asker」という考え方 ◦ 誰も質問しないと思う質問を定期的に出す ◦ 自由回答形式の質問もする

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

    100円硬貨を入れたら 入金額が100円になってほしい ◦ 100円硬貨を入れた後に50円硬貨を入れたら 入金額が150円になってほしい ◦ 1円硬貨は対応しないでほしい
  20. モブプロ体験会の結果 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; } }
  21. テストシナリオをさらに改善する Scenario: 入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

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

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

  23. テストシナリオをさらに改善する Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

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

  24. テストシナリオをさらに改善する 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回投入した時にも
 ちゃんと動くか確認したい
 という意図です。

  25. テストシナリオをさらに改善する 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回目と同じく、
 加算されていく仕組みなので、
 ロジック上は大丈夫です。

  26. テストシナリオをさらに改善する Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

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

  27. テストシナリオをさらに改善する Scenario: 1回投入時の入金額確認 Given 自動販売機がある When 100円を入金 Then 100円が入金されている Scenario:

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

  28. 数年後、テストの意図が分かるのはどっち? 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円が入金されている