私はランダムテストを支持し、それらを記述します。ただし、それらが特定のビルド環境で適切かどうか、およびそれらを含める必要があるテストスイートは、より微妙な問題です。
ローカルで(たとえば、開発ボックスで一晩)実行します。ランダム化されたテストにより、バグが明白で不明確であることが判明しました。あいまいなものは難解なので、ランダムなテストが実際にそれらをフラッシュする唯一の現実的なものだったと思います。テストとして、ランダム化されたテストで発見された見つけにくいバグを1つ選び、クラックの開発者にその機能(約数行のコード)をレビューしてもらいました。誰もそれを検出することができませんでした。
ランダム化されたデータに対するあなたの議論の多くは、「テストは再現可能ではない」というフレーバーです。ただし、適切に記述されたランダム化テストでは、ランダム化シードを開始するために使用されるシードがキャプチャされ、失敗すると出力されます。手でテストを繰り返すことができるだけでなく、これにより、そのテストのシードをハードコーディングすることにより、特定の問題をテストする新しいテストを簡単に作成できます。もちろん、そのケースをカバーする明示的なテストを手動でコーディングする方がおそらく良いでしょうが、遅延にはその長所があり、これにより、失敗したシードから新しいテストケースを本質的に自動生成することもできます。
私が議論することはできませんが、あなたがする1つのポイントは、それがビルドシステムを壊すということです。ほとんどのビルドおよび継続的インテグレーションテストは、テストが毎回同じことを実行することを期待しています。したがって、ランダムに失敗するテストは混乱を引き起こし、ランダムに失敗し、無害な変更に指を向けます。
その場合の解決策は、ビルドおよびCIテストの一部としてランダム化されたテストを実行することですが、固定されたシードを使用して、固定された反復回数で実行します。したがって、テストは常に同じことを行いますが、それでも入力スペースの束を調査します(複数の反復で実行した場合)。
ローカルで、たとえば、関係するクラスを変更する場合、より多くの反復または他のシードで自由に実行できます。ランダム化されたテストがますます普及するようになると、ランダムであることがわかっているテストの特定のスイートを想像することもできます。テストはさまざまなシードで実行できるため(時間の経過とともにカバレッジが増加します)、失敗が同じことを意味しない場合もあります。確定的CIシステムとして(つまり、実行はコードの変更と1対1で関連付けられていないため、問題が発生したときに特定の変更を指差す必要はありません)。
ランダム化されたテスト、特に適切に記述されたテストについては、言うべきことがたくさんあります。