如何在不违反单一责任原则的情况下编写类似的测试用例?

Bas*_*aso 2 c# tdd unit-testing single-responsibility-principle solid-principles

我为不同的输入创建了一个单元测试,以确保输出正确.

[TestMethod]
    public void CountInversionTest()
    {
        #region Arrange
        int[] sourceArray = {4, 3, 2, 1};
        int correctInversionCount = 6;
        int[] sourceArray2 = { 1, 3, 5, 2, 4, 6};
        int correctInversionCount2 = 3;
        int[] sourceArray3 = { 5, 6, 2, 3, 1, 4, 7 };
        int correctInversionCount3 = 10;
        #endregion

        #region Act
        Sorter sorter = new Sorter();
        int inversionCount = sorter.CountInversion(sourceArray);
        int inversionCount2 = sorter.CountInversion(sourceArray2);
        int inversionCount3 = sorter.CountInversion(sourceArray3);
        #endregion

        #region Assert
        Assert.AreEqual(correctInversionCount, inversionCount);
        Assert.AreEqual(correctInversionCount2, inversionCount2);
        Assert.AreEqual(correctInversionCount3, inversionCount3);
        #endregion
    }
Run Code Online (Sandbox Code Playgroud)

因为案例非常相似,我把它们放在一个测试方法中.这种行为是否正常还是违反了单一责任原则?如果它破坏SRP,什么是更好的解决方案?

Mar*_*ann 5

使用适当的单元测试框架(如xUnit.net),您可以编写参数化测试:

[Theory]
[InlineData(new[] { 4, 3, 2, 1 }, 6)]
[InlineData(new[] { 1, 3, 5, 2, 4, 6 }, 3)]
[InlineData(new[] { 5, 6, 2, 3, 1, 4, 7 }, 10)]
public void ParameterizedCountInversionTest(int[] input, int expected)
{
    Sorter sut = new Sorter();
    var actual = sut.CountInversion(input);
    Assert.Equal(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)

这将运行三个测试,而不是一个,使您可以更好地了解哪个特定测试用例失败(如果有任何失败).

这样的测试也更具可读性.

NUnit也有这个功能,但MSTest没有(我上次看过).