web-dev-qa-db-ja.com

xunitテストファクトを複数回

提案を行うためにいくつかのランダムな計算に依存するいくつかの方法があり、問題がないことを確認するためにファクトを数回実行する必要があります。

テストしたいファクト内にforループを含めることもできますが、これを実行したいテストがいくつかあるため、junitのRepeat属性のようなよりクリーンなアプローチを探しました: http:// www .codeaffine.com/2013/04/10/running-junit-tests-repeatedly-without-loops /

このようなものをxunitに簡単に実装できますか?

18
rjlopes

同じテストを複数回実行するようにxunitに指示するには、新しいDataAttributeを作成する必要があります。

これは、junitの同じアイデアに従ったサンプルです。

public class RepeatAttribute : DataAttribute
{
    private readonly int _count;

    public RepeatAttribute(int count)
    {
        if (count < 1)
        {
            throw new ArgumentOutOfRangeException(nameof(count), 
                  "Repeat count must be greater than 0.");
        }
        _count = count;
    }

    public override IEnumerable<object[]> GetData(MethodInfo testMethod)
    {
        return Enumerable.Repeat(new object[0], _count);
    }
}

このコードを配置したら、FactTheoryに変更し、次のようにRepeatを使用する必要があります。

[Theory]
[Repeat(10)]
public void MyTest()
{
    ...
}
29
Marcio Rinaldi

同じ要件がありましたが、受け入れられた回答コードはテストを繰り返さなかったので、私はそれを次のように適応させました:

public sealed class RepeatAttribute : Xunit.Sdk.DataAttribute
{
    private readonly int count;

    public RepeatAttribute(int count)
    {
        if (count < 1)
        {
            throw new System.ArgumentOutOfRangeException(
                paramName: nameof(count),
                message: "Repeat count must be greater than 0."
                );
        }
        this.count = count;
    }

    public override System.Collections.Generic.IEnumerable<object[]> GetData(System.Reflection.MethodInfo testMethod)
    {
        foreach (var iterationNumber in Enumerable.Range(start: 1, count: this.count))
        {
            yield return new object[] { iterationNumber };
        }
    }
}

前の例ではEnumerable.Repeatが使用されていましたが、テストは1回しか実行されませんでしたが、どういうわけかxUnitはテストを繰り返していません。おそらく彼らが少し前に変えた何か。 foreachループに変更することで、各テストを繰り返すことができますが、「反復回数」も提供します。テスト関数で使用する場合は、テスト関数にパラメーターを追加し、次に示すようにTheoryとして装飾する必要があります。

[Theory(DisplayName = "It should work")]
[Repeat(10)]
public void It_should_work(int iterationNumber)
{
...
}

これはxUnit2.4.0で機能します。

NuGet package を作成して、誰かが興味を持った場合にこれを使用します。

9
MarcolinoPT