web-dev-qa-db-ja.com

xUnit-理論メンバーデータのテスト名を表示します(TestCase)

私はテストにNUnitを使用してきましたが、テストケースが本当に好きです。 NUnitでは、TestCaseDataクラスのSetName関数を使用して、テストケースの各テスト名を簡単に設定できます。

XUnitにはこれと同様の機能がありますか?

現在、テストケースに6つのテストがある場合でも、テストエクスプローラーに表示できるテストは1つだけです。

xUnitテスト

public class LogHandler : TestBase
{
    private ILogger _logger;

    public LogHandler()
    {
        //Arrange
        LogAppSettings logAppSettings = GetAppSettings<LogAppSettings>("Log");

        IOptions<LogAppSettings> options = Options.Create(logAppSettings);

        LogService logService = new LogService(new Mock<IIdentityService>().Object, options);

        LogProvider logProvider = new LogProvider(logService);

        _logger = logProvider.CreateLogger(null);
    }

    public static IEnumerable<object[]> TestCases => new[]
    {
        new object[] { LogLevel.Critical,
            new EventId(),
            new Exception(),
            1 },
        new object[] { LogLevel.Error,
            new EventId(),
            new Exception(),
            1 },
        new object[] { LogLevel.Warning,
            new EventId(),
            new Exception(),
            0 },
        new object[] { LogLevel.Information,
            new EventId(),
            new Exception(),
            0 },
        new object[] { LogLevel.Debug,
            new EventId(),
            new Exception(),
            0 },
        new object[] { LogLevel.Trace,
            new EventId(),
            new Exception(),
            0 },
        new object[] { LogLevel.None,
            new EventId(),
            new Exception(),
            0 }
    };

    [Theory, MemberData(nameof(TestCases))]
    public void Test(LogLevel logLevel, EventId eventId, Exception exception, int count)
    {
        //Act
        _logger.Log<object>(logLevel, eventId, null, exception, null);

        //Assert
        int exceptionCount = Database.Exception.Count();

        Assert.Equal(exceptionCount, count);
    }
}

xUnitテストウィンドウ

enter image description here

ここでは1つではなく6つのテストが必要です。 (GetOrganisationStatusesは無視してください)。

NUnitテストケース

public static IEnumerable TestDatabaseCases
{
    get
    {
        yield return new TestCaseData(LogLevel.Critical,
            new EventId(1),
            new Exception("Exception"),
            0,
            1).SetName("InsertException_Should_Insert_When_LogLevel_Critical");

        yield return new TestCaseData(LogLevel.Error,
            new EventId(1),
            new Exception("Exception"),
            0,
            1).SetName("InsertException_Should_Insert_When_LogLevel_Error");

        yield return new TestCaseData(LogLevel.Warning,
            new EventId(1),
            new Exception("Exception"),
            0,
            0).SetName("InsertException_Should_Not_Insert_When_LogLevel_Warning");

        yield return new TestCaseData(LogLevel.Information,
            new EventId(1),
            new Exception("Exception"),
            0,
            0).SetName("InsertException_Should_Not_Insert_When_LogLevel_Information");

        yield return new TestCaseData(LogLevel.Debug,
            new EventId(1),
            new Exception("Exception"),
            0,
            0).SetName("InsertException_Should_Not_Insert_When_LogLevel_Debug");
    }
}

NUnitテストウィンドウ

enter image description here

これは私がxUnitに欲しいものです!

xUnitでテストケースの各テストに名前を設定するにはどうすればよいですか?

9
Reft

現在、テストケースに6つのテストがある場合でも、テストエクスプローラーに表示できるテストは1つだけです。

これは、テストデータがxUnit.netによってシリアル化可能と見なされないためです。この問題を参照してください: https://github.com/xunit/xunit/issues/147

顕著な詳細は次のとおりです。

短い答え

理論データの一部をxUnit.netで「シリアル化」できない場合は、VisualStudioテストランナーで実行する必要があるテストケースのシリアル化にカプセル化できません。

長い答え

Visual Studioテストランナーでは、テストケースはあるプロセスで検出され、別のプロセスで実行されます。したがって、テストケースを実行するには、修飾されていない文字列表現(別名「シリアル化」)に変換できる必要があります。タイプとメソッド名(両方の文字列)を知っているだけなので、テストメソッドレベルでシリアル化することもできます。データをミックスに入れ始めるとき、そのデータをシリアル化する方法を知っていることを確認する必要があります。理論のデータのallをシリアル化できない場合は、フォールバックする必要があります単一のメソッド(シリアル化できることがわかっている)に。

完全な答えには、より詳細が含まれています。

NUnitでは、TestCaseDataクラスのSetName関数を使用して、テストケースの各テスト名を簡単に設定できます。

xUnitにはこれと同様の機能がありますか?

現時点ではありません。

6
Brad Wilson

実際には、変更されていないテストで機能するはずの配管コードを必要とする実用的なソリューションがあります。カスタムTheoryAttribute、カスタムTheoryDiscoverer、およびカスタムTestCaseクラスの実装が必要です。ソリューション全体は、MITこのリポジトリのライセンス DjvuNet/DjvuNet.Shared.Tests で利用できます。

実装に必要なファイルは次のとおりです。 DjvuTheoryAttributeDjvuTheoryDiscovererDjvuNamedDataRowTestCaseDjvuDataRowTestCase

使用法は簡単です。上記のファイルをテストアセンブリに直接含めるか、別のアセンブリとしてコンパイルし、コードで次のように使用します follows

    [DjvuTheory]
    [ClassData(typeof(DjvuJsonDataSource))]
    public void DirmChunk_Theory(DjvuJsonDocument doc, int index)
    {
        int pageCount = 0;
        using (DjvuDocument document = DjvuNet.Tests.Util.GetTestDocument(index, out pageCount))
        {
            DjvuNet.Tests.Util.VerifyDjvuDocument(pageCount, document);
            DjvuNet.Tests.Util.VerifyDjvuDocumentCtor(pageCount, document);

            // DirmChunk is present only in multi page documents
            // in which root form is of DjvmChunk type
            if (document.RootForm.ChunkType == ChunkType.Djvm)
            {
                DirmChunk dirm = ((DjvmChunk)document.RootForm).Dirm;

                Assert.NotNull(dirm);

                Assert.True(dirm.IsBundled ? doc.Data.Dirm.DocumentType == "bundled" : doc.Data.Dirm.DocumentType == "indirect");

                var components = dirm.Components;
                Assert.Equal<int>(components.Count, doc.Data.Dirm.FileCount);
            }
        }
    }

理論関数の引数の1つはxUnitでシリアル化できませんが、それにもかかわらず、理論テストは個別に表示され、番号が付けられます。理論関数の最初の引数が文字列型の場合、関数呼び出しの引数であるだけでなく、テストの名前として使用されます。

このアイデアの功績は他の開発者にあります-私は彼のコードへのリンクを見つける必要があります-しかしそれはDjvuNetプロジェクトのために最初から再実装されました。

1