web-dev-qa-db-ja.com

動的に生成された入力データまたは静的データでテストする方が良いですか?

少しReactアプリがあり、テストする準備ができています。最初に行う必要があるのは、ランダムデータを含む入力オブジェクトを作成することです。次の2つの方法のいずれかで続行できます。

  1. Faker.jsなどを使用して、1行ずつ独自の偽のデータを作成できます。これにより、テストを実行するたびに新しい偽のデータが作成されます。例えば:
    let car = {
      Model: faker.lorem.string(),
      Year: faker.number.random(2010, 2020)
    }

これを行う利点は、すべての入力フィールドを正確に制御できることです。短所は、偽のデータの各行を書き込むのに時間がかかること(特にオブジェクトが多い場合)、出力の確定性が低いことです。

  1. intermock のようなものを使用して、すべての入力を前もって自動的に生成できます。長所は、これは最初の選択よりも労働集約的ではないことです。欠点は、生成されるデータの一部の制御が失われることです。
    // 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"

どのオプションが良いですか?他の長所や短所はありますか?

1
elimist3

これら2つの特定のテストユーティリティではなく、一般的な原則について説明します。

さまざまな目的のためのさまざまな種類のテストがあります。

単体テストの目的は、テスト対象が機能しているかどうかをすばやく示すことです。いくつかのサンプル入力をテストし、興味深い境界ケースを含めることができます。

これらのテストは確定的である必要があります。そうでない場合、テストが失敗した場合とテストがケースを正しくチェックしなかった場合とでは、テストが失敗しても通知されません。フレークな単体テストは好きではありません。

これらのテストは、テスト対象を変更するたびに実行できるように、すばやく実行する必要もあります。数秒程度で十分速く、早く、頻繁に実行することをためらわないでしょう。

単体テストは、最も重要なタイプの実装テストの1つです。 [ソフトウェアをエンドユーザーに出荷する場合、全体としてsability testの方が重要な場合があります。]そのため、これらのテストをすばやく作成し、テスト対象を変更して最新の状態に保つことがより重要です。 (たとえば、入力フォームにフィールドを追加する)これらのテストが包括的である場合よりも。

regression testの目的は、過去のバグ修正がまだ修正されているかどうかのテストを含め、テスト対象が既知の良好なケースで引き続き機能することを確認することです。

これらのテストも確定的である必要がありますが、より包括的になるように、単体テストほど速く実行する必要はありません。

A deep test [他の名前が必要です]は、境界ケースと境界付近のケースの組み合わせ、オフバイワンエラーなど、さまざまな入力のテストに長い時間を費やす可能性があります。そしてランダムなテストケース。これが役立つためには、テストプログラムは各テストケースの正しい出力を予測する必要があります(そうでない場合、テスト対象がクラッシュしていないことを確認するだけで、テスト対象がC/C++でない限り、あまり意味がありません)。ランダム入力の実装に​​は時間がかかる場合があります。

ディープテストでは、非決定的な入力を使用することにより、より多くのカバレッジを取得できます。偶発的な誤検知(テストケースが失敗として誤って識別される)がある場合、それはそれほど問題ではありません。いずれにせよ、何が問題だったかをデバッグする必要があり、テストの対象またはテスト出力チェッカーである可能性があります。

不安定な結果ではコードの変更に問題があるかどうかがわからないため、継続的インテグレーションで非決定的テストを実行することは適切ではありません。

4
Jerry101