少しReactアプリがあり、テストする準備ができています。最初に行う必要があるのは、ランダムデータを含む入力オブジェクトを作成することです。次の2つの方法のいずれかで続行できます。
let car = {
Model: faker.lorem.string(),
Year: faker.number.random(2010, 2020)
}
これを行う利点は、すべての入力フィールドを正確に制御できることです。短所は、偽のデータの各行を書き込むのに時間がかかること(特にオブジェクトが多い場合)、出力の確定性が低いことです。
// inside car.ts...
interface Car {
Model: string
Year: number
}
// in the terminal...
node ./node_modules/intermock/build/src/index.js --files ./car.ts --interfaces "Car"
どのオプションが良いですか?他の長所や短所はありますか?
これら2つの特定のテストユーティリティではなく、一般的な原則について説明します。
さまざまな目的のためのさまざまな種類のテストがあります。
単体テストの目的は、テスト対象が機能しているかどうかをすばやく示すことです。いくつかのサンプル入力をテストし、興味深い境界ケースを含めることができます。
これらのテストは確定的である必要があります。そうでない場合、テストが失敗した場合とテストがケースを正しくチェックしなかった場合とでは、テストが失敗しても通知されません。フレークな単体テストは好きではありません。
これらのテストは、テスト対象を変更するたびに実行できるように、すばやく実行する必要もあります。数秒程度で十分速く、早く、頻繁に実行することをためらわないでしょう。
単体テストは、最も重要なタイプの実装テストの1つです。 [ソフトウェアをエンドユーザーに出荷する場合、全体としてsability testの方が重要な場合があります。]そのため、これらのテストをすばやく作成し、テスト対象を変更して最新の状態に保つことがより重要です。 (たとえば、入力フォームにフィールドを追加する)これらのテストが包括的である場合よりも。
regression testの目的は、過去のバグ修正がまだ修正されているかどうかのテストを含め、テスト対象が既知の良好なケースで引き続き機能することを確認することです。
これらのテストも確定的である必要がありますが、より包括的になるように、単体テストほど速く実行する必要はありません。
A deep test [他の名前が必要です]は、境界ケースと境界付近のケースの組み合わせ、オフバイワンエラーなど、さまざまな入力のテストに長い時間を費やす可能性があります。そしてランダムなテストケース。これが役立つためには、テストプログラムは各テストケースの正しい出力を予測する必要があります(そうでない場合、テスト対象がクラッシュしていないことを確認するだけで、テスト対象がC/C++でない限り、あまり意味がありません)。ランダム入力の実装には時間がかかる場合があります。
ディープテストでは、非決定的な入力を使用することにより、より多くのカバレッジを取得できます。偶発的な誤検知(テストケースが失敗として誤って識別される)がある場合、それはそれほど問題ではありません。いずれにせよ、何が問題だったかをデバッグする必要があり、テストの対象またはテスト出力チェッカーである可能性があります。
不安定な結果ではコードの変更に問題があるかどうかがわからないため、継続的インテグレーションで非決定的テストを実行することは適切ではありません。