1. ホーム
  2. unit-testing

[解決済み] Unit Testsでランダムデータ?

2022-04-24 01:27:51

質問

フィールドをランダムなデータで埋めるオブジェクトのユニットテストを書いている同僚がいます。彼の理由は、通常のテストが単一の静的な値しか使用しないのに対して、多くの異なる値をテストするので、より広い範囲のテストを提供することです。

私は彼にこれに対するさまざまな理由を説明しましたが、主なものは次のとおりです。

  • ランダムな値は、テストが本当に再現可能でないことを意味します(これは、テストがランダムに失敗する可能性がある場合、ビルドサーバー上でそれが起こり、ビルドが壊れる可能性があることも意味します)。
  • ランダムな値でテストが失敗した場合、a) オブジェクトを修正し、b) 毎回その値でテストするように自分自身に強制する必要がある、そうすれば、それが動作することがわかるが、ランダムなので、その値が何だったかはわからない

もう一人の同僚が追加しました。

  • 例外をテストしている場合、ランダムな値では、テストが期待される状態で終了することを保証できません。
  • ランダムなデータは、システムのフラッシュアウトや負荷テストに使用され、ユニットテストには使用されません。

このようなことを止めさせるために、私が彼に言える追加の理由を、誰か追加できますか?

(あるいは、これはユニットテストの書き方として許容できるもので、私やもう一人の同僚は間違っているのでしょうか?)

解決方法は?

妥協案がある。あなたの同僚は実は何かを掴んでいるのですが、そのやり方が間違っているようです。完全にランダムなテストがあまり有用であるとは思えませんが、無効でないことは確かです。

プログラム(またはユニット)仕様とは、それを満たす何らかのプログラムが存在するという仮説である。そして、プログラムそのものがその仮説の証拠となる。ユニットテストのあるべき姿は、そのプログラムが仕様通りに動作することを反証する試みである。

さて、単体テストを手で書くこともできますが、これは本当に機械的な作業です。自動化することもできます。仕様書を書くだけで、機械があなたのコードを壊そうとする単体テストを大量に生成してくれるのです。

どのような言語を使っているのかわかりませんが、こちらをご覧ください。

ジャワ http://functionaljava.org/

Scala (またはJava) http://github.com/rickynils/scalacheck

ハスケル http://www.cs.chalmers.se/~rjmh/QuickCheck/

.NETを使用しています。 http://blogs.msdn.com/dsyme/archive/2008/08/09/fscheck-0-2.aspx

これらのツールは、整形された仕様を入力とし、自動生成されたデータを使って、必要なだけの単体テストを自動的に生成します。これらのツールは、あなたのコードを破壊する最も単純なテストケースを見つけ、それがエッジケースをうまくカバーすることを確認するために、quot;shrinking" 戦略(あなたが調整することができます)を使用します。

Happy testing!