6

ここでは、例を挙げて問題を説明します。元の質問は、問題をより抽象的に示しています。といっても読む必要はありません。

更新:例としての質問

int[] の最小値を見つけるために、このバグのある関数を実装したとしましょう。

public int MyMin(int[] data)
{
    int min = 1000;

    for (int i = 1; i < data.Length; i++)
    {
        if (data[i] < min)
        {
            min = data[i];
        }
    }

    return min;
}

この関数で Intellitest を実行すると、次の結果が得られます。 ここに画像の説明を入力

テスト #4 と #6 では、実装にバグがあるため、関数が最小値を正しく計算していないことに注意してください。ただし、これらのテストはパスしており、望ましくありません。

インテリテストは、意図した動作を魔法のように判断MyMinして、これらの入力で失敗するようにテストを作成することはできません。ただし、これらのテストの目的の結果を手動で指定できれば、非常に便利です。

@ michał-komorowski のソリューションは実現可能ですが、テスト ケースごとにPexAssumes に関して入力を繰り返す必要があります。テスト入力に必要な出力を指定する、よりエレガントでクリーンな方法はありますか?

元の質問

Intelitest は、変更可能なパラメーター化されたテストを生成し、そこに一般/グローバル アサーションを追加できます。また、コード カバレッジを最大化する最小数の入力を生成します。Intellitest は入力を個別の単体テストとして保存し、それぞれが細工された入力を使用してパラメーター化されたテストを呼び出します。

入力ごとにアサーションを追加する方法を探しています。

各入力は単体テスト関数として.g.csファイルに保存されるため、そこにアサーションを追加できます。問題は、これらの関数は、その後の実行で Intellitest によって上書きされるため、ユーザーがカスタマイズすることを想定していないことです。

各単体テストにアサーションを追加する推奨される方法は何ですか?

4

2 に答える 2

0

この回答は、前の回答に基づいています。尋ねられた質問に対してより具体的です。

Pex はすべてのコード パスのテストを生成しますが、コードについては何も知りません。PUT (パラメーター化された単体テスト) で手配/動作/アサートを実行して、コードがどのように機能するかを Pex に伝える必要があります。さらに、アレンジの前に想定を追加して、パターンが想定/アレンジ/行為/アサートになるようにすることもできます。

あなたの例では、この PUT から始めます。

    [PexMethod(MaxRunsWithoutNewTests = 200)]
    [PexAllowedException(typeof(NullReferenceException))]
    public int  MyMin([PexAssumeUnderTest]Class1 target, int[] data)
    {
        //assume
        PexAssume.IsTrue(data.Length == 1);
        //arrange
        data[0] = 0;

        //act
        int result = target.MyMin(data);

        //assert
        PexAssert.AreEqual(0, result);
        return result;
    }

結果は、3/8 ブロックのみがカバーされ、テスト 2 が予期された '0' で失敗し、'1000' を取得したことを示しています

これは、1000 になった理由を理解するためにコードを調べる必要があることを示しています。

for ループを 0 ではなく 1 で開始していることがわかります。そのため、コードを修正して IntelliTest を再度実行します。

今回は 2 つの合格テストが得られました。これは良いことです。しかし、テストされたのは 6/8 ブロックだけです。何かが足りない。

Pex がこのようなデータを生成できるようにする新しい PUT を作成します。

    [PexMethod(MaxRunsWithoutNewTests = 200)]
    [PexAllowedException(typeof(NullReferenceException))]
    public int MyMin2([PexAssumeUnderTest]Class1 target, int[] data)
    {
        //assume

        //act
        int result = target.MyMin(data);

        //assert
        return result;
    }

これで、すべてのコード パスを実行し、すべてのテストに合格する 7 つの単体テストができました。

各 PUT が独自のテスト セットを生成することに気付くでしょう。

于 2016-04-12T17:05:05.957 に答える