はじめに
システム開発にとって、切っても切れないことに検証(テスト)があります。
Qiitaに記事を投稿したり、読んでいるエンジニアの方々にとっては、これは釈迦に説法かもしれません。
この記事を書いている私はエンジニアではありません。しかし、一般的に単体テストや総合テストと呼ばれるものに関与しており、テストケースの作成や検証作業を行っています。
その時にいつも思っていることが
これ全部やらないといけないのか!!
いや、わかっているんですよ。検証というのは、全動作を試してみないといけないということは。ただ、全パターンを網羅しようと思うと、とんでもない工数になってしまってしまうことがあるんですよね。。
例えばゲームで壁にあたって通り抜けてしまわないかを試さないといけないとして。ひとえに壁にあたるとしても
- 歩いてあたってみたり
- 走ってあたってみたり
- 乗り物に乗ってあたってみたり
- 飛びながらあたってみたり
- 攻撃技や魔法を使ってあたってみたり
とか可能なパターンをいろいろ試してみないといけなくて。
ましてやそれを全部の壁でやってねって言われたら、、
全部やらないといけないのか!!って思っちゃうじゃないですか!!
もちろんやらないといけないのはわかっているんです。そうは言っても、迫りくる期日、限られるリソース、発生する問題点。。。
これらに直面するたびに、本当に?本当に?全部やらないといけないんですか?って思う気持ちもそりゃあ湧いてきます
ただ全部やる必要ある?なんて聞きづらいし、エンジニアからしたら当然やってほしいって思うはず。。
前置きが長くなってしまいましたが、そんな悩みを聞ける人がいないので、ChatGPTさんにそこんとこどうなのか聞いてみることにしました。
ということで、早速聞いてみましょう。
検証についてChatGPTに聞いてみた
質問
最適な検証の仕方教えて
ChatGPTの回答(クリックで表示)
最適な検証の仕方は、検証する対象や目的によって異なりますが、一般的な手順とベストプラクティスについて以下に示します。
1.目的と目標の設定: 検証の目的と目標を明確に定義します。何を検証するのか、どのような結果を期待するのかを明確にしましょう。
2.検証計画の策定: 検証の手順や方法、必要なリソース、予算、スケジュールなどを計画します。検証の範囲や規模、評価基準を明確にし、実施に必要なリソースを確保します。
3.テスト環境の構築: 検証に必要なテスト環境を準備します。検証対象のシステムや製品を適切にセットアップし、必要なテストデータやテストツールを用意します。
4.テストケースの作成: 目標や要件に基づいて、検証のためのテストケースを作成します。テストケースは、検証すべき機能や振る舞い、条件などを記述したものです。カバレッジの高いテストケースを作成することが重要です。
5.テストの実施: 作成したテストケースに基づいて、実際に検証を実施します。テストケースを順に実行し、検証対象のシステムや製品の振る舞いや性能を観察し、結果を記録します。
6.結果の評価: テスト結果を評価し、目標や要件との一致度を判断します。検証結果の正確性や信頼性を確認するために、複数の評価者が結果を検証することも有用です。
7.問題の特定と修正: 検証中に発見された問題や欠陥を特定し、修正や改善のための対策を立てます。問題の優先度を評価し、重要な問題から順に対処することをおすすめします。
8.レポート作成と報告: 検証結果をまとめ、詳細なレポートを作成します。
思ってた3倍くらいの量の回答が返ってきました!!
長いので要約すると
・想定される工数をもとにリソースを確保し
・カバレッジ(網羅率)の高いテストケースを作成し
・問題があったら、重要なものから修正を行う
というお手本のような回答をいただきました。
まあ、あんなざっくりとした質問をしたら、私でも同じような返答をすると思います。(こんなに理路整然とは言えないけど)
もちろん聞きたかったのは、残念ながらこんなことではないです。
しかし、先ほどの回答の中にあった、「カバレッジの高いテストケース」に活路を見出せそうな気配が。
要はできるだけ広範囲をカバーできているテストケースを作るのがいいってことなんですが、これをどうやって作るの聞いてみました。
カバレッジの高いテストケース
質問
カバレッジの高いテストケースの作り方
ChatGPTの回答(クリックで表示)
カバレッジの高いテストケースを作成するためには、以下の手順や考慮事項に注意すると良いでしょう。
1.要件の理解: 検証対象となるシステムや製品の要件を詳しく理解しましょう。要件は、機能や動作の仕様、制約、期待される結果などを明確に示したものです。
2.テストケースの設計: 要件に基づいて、検証のためのテストケースを設計します。テストケースは、入力データ、操作、予想される結果などを記述したものです。
3.カバレッジの分析: カバレッジの範囲を決定し、既存のテストケースやテストスイートのカバレッジを分析します。これによって、まだカバーされていない領域や未テストの機能を特定できます。
4.カバレッジの優先順位付け: カバレッジの範囲を優先順位付けしましょう。重要な機能やリスクの高い領域に優先的にテストケースを作成することが重要です。
5.カバレッジの網羅: カバレッジの範囲に基づいて、テストケースを作成します。以下のポイントに注意しながら、様々なシナリオや条件を考慮したテストケースを設計しましょう。
・正常系と異常系をカバーする: 正常な動作だけでなく、異常な入力やエラー処理など、異常系のケースも考慮してテストケースを作成します。
・境界値テスト: 境界値周辺のテストケースを作成します。例えば、パラメータの最小値、最大値、境界値、範囲内外の値などを考慮します。
・条件分岐のテスト: 条件分岐がある場合は、条件が真となる場合と偽となる場合の両方をカバーするテストケースを作成します。
・結合テスト: 複数の機能やコンポーネントが連携して動作する場合は、結合テストケースを作成します。システムの各部分が予想通りに連携するかを確認します。
・パフォーマンステスト: システムのパフォーマンスや負荷に関するテストケースを作成します。例えば、大量のデータや同時アクセスなどの負荷条件下での動作をテストします。
・エッジケースの考慮: 特殊なケースや予期しない入力、想定外の状況など、通常の操作では発生しない可能性のあるケースも考慮してテストケースを作成します。6.可読性と再利用性の確保: テストケースは他の人が理解しやすく、再利用しやすいように作成することが重要です。明確なテスト手順、入力データ、予想される結果などを記述し、テストケースの可読性と再利用性を確保しましょう。
7.テストケースの確認: 作成したテストケースをチームや関係者と確認し、適切なカバレッジを網羅しているかを評価します。フィードバックや修正が必要な場合は、それに対応します。
8.テストケースの管理: テストケースの管理は重要です。テストケースの一意の識別子やバージョン管理、関連する要件や結果のトレースなどを行い、効果的なテストケースの管理を行いましょう。
以上が、カバレッジの高いテストケースを作成するための一般的な手順と考慮事項です。特定のプロジェクトやシステムに応じて、適切なテストケースの設計手法やアプローチを適用してください。
これも長いので要約すると
・検証対象を理解(仕様や正しい結果を把握)している人が
・検証範囲と優先度を決めて
・正常操作、異常(エラーとなる)操作、上限値、下限値でのテストや
・複数の機能が関わる結合テスト、負荷などのパフォーマンスのテストを行い
・テストケースが読みやすく、再利用できるとなおよい
それはそうなんですが!! これを全部やらないといけないのか!!って思っちゃうじゃないですか!!(2回目)
ただ、機能を理解している人が、可読性があって再利用できるフォーマットで作れると良いと言うのは間違いない。(それ以外も間違っていない)
じゃあせめて検証範囲は少なくできないのか???(この発想が間違っている)
再度聞いてみたところ
テストケースを少なくしたい
質問
テストケースのケース数をできるだけ少なくするには
ChatGPTの回答(クリックで表示)
テストケースの数をできるだけ少なくするためには、以下のアプローチやテクニックを考慮すると良いでしょう。
1.組み合わせテスト: システムの機能やパラメータの組み合わせを考慮し、一部のテストケースで複数の組み合わせをカバーする方法です。組み合わせテストは、特にパラメータが多く、それらの組み合わせが網羅的にテストできない場合に有効です。
2.別個性テスト: 類似した動作や機能を持つ複数のテストケースの代わりに、それらのテストケースの中で代表的なものを選び、残りのテストケースは省略する方法です。残りのテストケースは、代表的なテストケースで十分にカバーされると判断された場合に適用します。
3.境界値テスト: 入力データの境界値周辺のテストケースを重点的に設計する方法です。データの最小値、最大値、境界値などを考慮し、テストケース数を削減しながらも重要なシナリオをカバーします。
4.テストケースの統合: 類似した機能や操作を持つ複数のテストケースを統合し、一つのテストケースでカバーする方法です。テストケースの統合により、重複するテストケースを削減することができます。
5.テストケースの優先順位付け: カバレッジの高い領域やリスクの高い機能に優先的にテストケースを作成し、他の領域は後回しにする方法です。重要な機能やリスクの高い領域に重点を置くことで、テストケース数を最小限に抑えることができます。
6.レビューとフィードバック: チームや関係者とのテストケースのレビューやフィードバックを通じて、不要なテストケースや重複したケースを特定し、削減することができます。
つまり
・類似のケースは省いて
・重要な機能やリスクの高い機能から優先的に行い
・上限値と下限値で試すことで、その間の結果は正しいとする
という感じですかね。
序盤の前置きで話をしたゲームの壁にあたる検証で例えると
- 車であたって大丈夫なら他の乗り物でも問題ないとして
- その場面で頻繁に使う操作(歩きや攻撃など)に重点を置き
- 一番速度の遅い方法(歩いたり走ったり)と早い方法(車や飛行機など)で問題なければ、それ以外の方法でも問題ないとする
という感じになるかと思います。
いままでも無意識にと言いますか、何となく似たようなことをやっていたのかなと。
ちゃんと言葉にされると、ああこれこれと胸にストンと落ちる気がしますね。
ただ、全部じゃないにしても、、やっぱり一通りはやらないといけない!!(当たり前)
それでも時間がないときはどうすればいいのか、一縷の望みをかけて聞いてみました。
時間がない時どうする
質問
テストケースを全て検証する時間がない時どうしたらいい
ChatGPTの回答(クリックで表示)
テストケースをすべて検証するために時間が足りない場合、以下のアプローチを検討することができます。
1.リスクベースのテスト: テストケースの中で、リスクが高いとされる機能や領域に重点を置きます。リスクアセスメントや優先順位付けを行い、リスクが高いと判断された箇所に対して優先的にテストを実施します。
2.カバレッジベースのテスト: システムのカバレッジレベルに応じて、テストケースの網羅度を決定します。カバレッジベースのテストでは、重要な機能や領域に焦点を当て、カバレッジの低い箇所や未テストの機能に対してテストを実施します。
3.パフォーマンステストの絞り込み: パフォーマンステストや負荷テストなど、時間がかかるテスト項目については、簡略化や代表的なケースのみを選んで実施することを検討します。重要なパフォーマンス上の問題を特定するために、重要なシナリオや負荷条件に焦点を当てます。
4.テスト自動化: テストケースの中で繰り返し実施されるテストや、大量のデータを使ったテストなど、自動化が可能なテスト項目については、テスト自動化を検討します。自動化により、短い時間で多くのテストを実行することができます。
5.テストチームの協力: テストチームのメンバーや関係者と協力し、テストリソースやタイムラインの再評価を行います。プロジェクトの優先順位やリソースの制約を考慮しながら、テスト範囲や目標を再調整することが重要です。
6.部分的なテストサイクルの実施: テストケースを複数のサイクルに分割し、最初のサイクルでは重要なテスト項目やリスクが高い領域に集中します。その後のサイクルでは、テスト結果や優先順位に基づいて追加のテストを実施します。
7.テスト報告の重要項目に絞る: テスト結果の報告やドキュメント化において、重要な項目に絞ります。重要なバグや重大な問題、リスクの高い機能の状態やテストカバレッジの状況など、主要な情報にフォーカスして報告を行います。
8.ユーザーのフィードバックを活用する: システムのユーザーやステークホルダーからのフィードバックを収集し、それに基づいてテストの優先順位を再評価します。ユーザーが最も重視する機能や問題に集中することで、限られた時間内で最大の価値を提供することができます。
9.テストケースの再利用: 類似した機能や操作を持つテストケースを再利用し、適用範囲やデータのバリエーションを調整することで、時間を節約できます。テストケースの再利用は、効率的なテストカバレッジの達成に役立ちます。
10.テスト優先順位の適用: テストケースに優先順位を設定し、最も重要なテストケースから順に実施することで、時間を効果的に活用します。優先順位は、リスク、重要性、ビジネス上の要件などに基づいて設定します。
11.テストの拡張と継続的な改善: 残ったテストケースやテスト項目については、テストプロセスの拡張や継続的な改善を行います。テストカバレッジの改善や追加のテストサイクルの計画など、将来のテスト活動の向上に向けた措置を講じます。
これらのアプローチやテクニックを組み合わせることで、テストケースを効果的に絞り込みながらも、重要な機能やリスク領域をカバーすることが可能となります。プロジェクトの要件や制約に応じて、最適な選択肢を検討してください。
さすがにこれがあったか!!というような革新的な回答は得られず。。。
重要な機能やリスクの高い機能に絞って、類似するケースは省くという手法で短縮するしかなさそうでした。(当たり前)
目新しいところとしては、検証の自動化という記載。
繰り返し処理や大量のデータを利用する場合は、検証自体の自動化を検討するという内容です。
手動操作では出来えない範囲の検証や同じ操作の繰り返しの場合はぜひ自動化を念頭に置いておきたいところです。
最後に
余談として、もうChatGPTさんが一緒に検証してくれないかなあ
とダメもとで聞いてみたんですが
質問
検証についてChatGPTは何か手伝ってくれる?
ChatGPTの回答(クリックで表示)
はい、検証に関してもChatGPTはお手伝いすることができます。以下に、ChatGPTが検証においてサポートできるいくつかの方法を示します。
1.テストケースの作成: ChatGPTは要件や仕様に基づいてテストケースを作成する際にアイデアやサンプルを提供できます。テストケースの目的やカバレッジの確保、エッジケースの考慮などに関して相談することができます。
2.テストシナリオの構築: ChatGPTは特定のテストシナリオやユースケースに基づいて、テストケースのフローを提案できます。テスト対象のアプリケーションやシステムの操作手順、期待される結果などを詳細に話し合い、適切なテストシナリオを作成できます。
3.バグの特定と再現: ChatGPTは問題点やバグの特定にも役立ちます。バグの再現手順や条件、予想される結果などについて相談することで、テスト対象のシステムやアプリケーションに関連する問題点を特定する支援が可能です。
4.テスト優先順位の設定: ChatGPTとの対話を通じて、リスクや重要度に基づいてテストの優先順位を設定することができます。ChatGPTは、テスト対象のシステムの特性やプロジェクトの制約について情報を提供し、効果的なテスト戦略の立案に役立ちます。
5.テスト計画の策定: ChatGPTとの対話を通じて、テスト計画の策定やテスト戦略の決定に関してアドバイスや意見を提供できます。テストのスコープや目標、テストリソースの割り当てなどについて相談し、計画を作成するサポートが可能です。
ただし、注意点として、ChatGPTは情報を提供するツールとして活用するため、最終的な判断や意思決定は人間が行う必要があります。また、ChatGPTは訓練データに基づいて情報を生成するため、正確性や完全性には限定があります。
むしろ、ChatGPTは、テストプロセス全体をサポートするための補完的なツールとして利用することが推奨されます。以下のような場面での活用が考えられます。
1.テストケースのアイデアの発展: ChatGPTとの対話を通じて、新しいテストケースのアイデアを得ることができます。ChatGPTは幅広い知識と経験を持っており、クリエイティブなテストケースの提案や未知のテストシナリオの考察に貢献できます。
2.ドキュメントや手順の作成支援: ChatGPTは手順書やテストケースのドキュメント作成においても役立ちます。例えば、特定の操作手順の記述やテストケースの説明文の作成に関して相談することができます。
3.問題解決のサポート: バグやエラーが発生した際に、ChatGPTとの対話を通じて問題解決のサポートを受けることができます。バグの再現手順や原因の特定、対策の提案などについて相談し、解決策を探ることができます。
4.テストデータの生成: ChatGPTはテストデータの生成にも活用できます。特定のデータパターンや条件に基づいてデータを生成する方法や、異常なデータの生成方法についてアドバイスを受けることができます。
5.テスト結果の分析: ChatGPTとの対話を通じて、テスト結果の分析や評価についてのアドバイスを受けることができます。テストカバレッジの評価や不具合の傾向の分析、テスト品質の向上策などに関して相談することができます。
最終的には、ChatGPTを利用しながらも、専門家の知識やチームの意見を活用し、最適な検証プロセスを確立することが重要です。ChatGPTはサポートツールとして活用することで、より効率的な検証作業を実現できるでしょう。
まさかの手伝ってくれるそうなので、今度これも試してみたいなと思います。