web-dev-qa-db-ja.com

統合テスト:テストはすべての検証をチェックする必要がありますか?

私はテストを書くのが初めてなので、ワークフローにその習慣を組み込みたいと思っています。たとえば、ユーザーがブログ投稿を作成できるというテストを作成する場合がありますが、それを効果的に行う方法がわかりません。

すべてのフィールドが検証されていることを確認するためのテストケースが必要ですか?

つまり、次のようなテストケースを1つしか記述できませんでした。

  • testThatUsersCanCreateBlog

または...

  • testThatUserCanCreateBlog

  • testThatUserCannotCreateBlogWithoutTitle

  • testThatUserCannotCreateBlogWithoutTags

  • testThatUserCannotCreateBlogWithoutImage

  • 等....

最初のアプローチは「ハッピーパス」を通過しているだけなので役に立たないように見えるので、実際には何もテストしていませんが、2番目のアプローチは、テストが資産ではなく負担になると感じているため、少し侵襲的だと感じています。

理論的には、テスト項目が変更されるたびに適切に記述されたテストを変更する必要はないはずだと聞いたことがありますが、2番目のインスタンスでBlogモデルにフィールドを追加または削除すると、エラーが発生しないように一貫性を保つために、テストで同じ調整を行います。

〜50ページに20以上のフィールドの広範な形式があるため、この画像はどういうわけか間違っているように見えます。何か不足していますか?

1
St0mX

これらは統合テストではありません。これらはユニットテストです。それらは、それらを通過させる運用コードの前に作成する必要があります。それらを書くことは考えた後に冗長であるべきではありません。それはあなたのデザインの表現であるべきです。

そうすれば、運用コードが実装されていても、これらのルールが適用されることが保証されます。これにより、変更によってルールの適用が破られていないことを確信して、実装をリファクタリングすることができます。

テスト駆動開発は、運用コードを開発する前に開始することを目的としています。テストは、それを念頭に置いて設計されていない既存の運用コードに簡単に組み込むことはできません。このようなコードはレガシーコードと呼ばれます。それを使用する必要がある場合は、MichaelFeathersによる「レガシーコードを効果的に使用する」を読むことをお勧めします。彼は、テストを追加するために利用できる古いコードの継ぎ目を見つける方法を教えています。しかし、これは最初からテスト可能なコードを書くのに適した代用ではありません。

フェザーはまた ユニットテストの最良の定義 を与えます:

次の場合、テストは単体テストではありません。

  • データベースと通信します
  • ネットワークを介して通信します
  • それはファイルシステムに触れます
  • 他の単体テストと同時に実行することはできません
  • 実行するには、環境に特別なこと(構成ファイルの編集など)を行う必要があります。

あなたが言及するテストはどれもこれらのルールに違反する必要はないので、統合テストではなく単体テストでなければなりません。

単体テストは高速でなければなりません。コードを入力している間、非常に高速に実行できます。

1
candied_orange

簡単な答えは2番目の例ですが、これはすべてのテストケースのリストではなく、広範囲にわたるテストケースのツリー構造です。アプローチをサポート/バインドするモデルを選択し、それを承認して、別段の指示があるまで固執します。

幅広いユニットからより具体的なユニットのテストに移行し、何も見逃すことはありません。テストケースは、要件が満たされていることを示すために作成する必要があります。テスト結果は、次のテストレベルの裏付けとなる証拠としてまとめられます。

必要に応じてここで停止できます。私の投稿の残りの部分は教育目的のみです。

私の店では、S/W eSAFEアプローチを使用したエンジニアリング(一般にラピッドプロトタイピングとして知られています)のVモデルを使用しています。すべてのテストは、ビジネス要件からすべての要件に並行して記述されています。 S/W派生要件まで。

これはおそらくコントロールの範囲外ですが、「Vモデル」を調べ、「V」を横切る水平線を引き、そのプロセスのどこに座っているかを下げます。その時点から要件とテストを記述し、責任の所在に必要な範囲でVを下げます。

ここに簡単なチュートリアルhttps://www.tutorialspoint.com/sdlc/sdlc_v_model.htmそして、このアプローチはあなたのニーズを満たすために必要な限り縮小します。

0
Michel S