どちらも。
決定論的テストと非決定論的テストには、異なるユースケースとスイートに対する異なる値があります。一般的に非決定論決定論テストと同じ精度を提供することはできません。これは誤りです。それらはそれほど正確ではないかもしれませんが、はるかに広くなる可能性があり、独自の利点があります。
例を見てみましょう。整数のリストをソートする関数を作成します。あなたが有用だと思う決定論的な単体テストは何でしょうか?
- 空のリスト
- 要素が1つだけのリスト
- すべて同じ要素のリスト
- 複数の一意の要素を持つリスト
- いくつかが重複している複数の要素を持つリスト
- とリスト
NaN
、INT_MIN
とINT_MAX
- すでに部分的にソートされているリスト
- 10,000,000要素のリスト
そして、それは単なるソート関数です!確かに、これらのいくつかは不必要である、またはこれらのいくつかは非公式の推論で除外できると主張することができます。しかし、私たちはエンジニアであり、非公式の推論が顔を出しているのを見てきました。私たちは、構築したシステムを完全に理解したり、頭の中で複雑さを完全に維持したりするほど頭が良くないことを知っています。そもそもテストを書く理由です。非決定論的なテストを追加することは、事前に良いテストのすべてを知るのに必ずしも十分に賢くないかもしれないと言うだけです。セミランダムデータを関数にスローすることで、見落としたエッジケースを見つける可能性が高くなります。
もちろん、それは決定論的なテストも除外しません。非決定論的なテストは、プログラムの膨大な範囲でバグを見つけるのに役立ちます。ただし、バグを発見したら、それを修正したことを示す再現可能な方法が必要です。そう:
- コードのバグを見つけるには、非決定的テストを使用します。
- 確定的テストを使用して、コードの修正を確認します。
これは、単体テストに関する多くの堅実なアドバイスが必ずしも非決定論的なテストに適用されるわけではないことに注意してください。たとえば、高速でなければなりません。低レベルのプロパティテストは高速である必要がありますが、「ユーザーがWebサイトのボタンをランダムにクリックしてシミュレートし、500エラーが発生しないことを確認する」などの非決定的テストは、速度よりも包括性を優先する必要があります。ビルドプロセスとは独立して実行するようなテストを行うだけで、開発が遅くなることはありません。たとえば、専用のステージングボックスで実行します。