拆分xUnit测试以测试扩展方法的最佳方法

时间:2018-10-17 11:17:14

标签: c# unit-testing testing xunit xunit.net

我正在尝试很好地构建单元测试,但是我不确定拆分测试的最佳方法。我正在使用C#和xUnit。

出于这个问题的目的,我正在测试以下简单的扩展方法代码:

public static bool IsNullOrEmpty(this string str)
{
    return string.IsNullOrEmpty(str);
}

我在测试方面有几种选择,我不知道什么是正确的。我可以写事实或理论。

理论 我应该使用理论吗? 一种测试为阳性,一种测试为阴性?

[Theory, IsUnit]
[InlineData(null)]
[InlineData("")]
public void Test_IsNullOrEmpty_Positive(string value)
{
     Assert.True(value.IsNullOrEmpty());
}

[Theory, IsUnit]
[InlineData("TEST")]
[InlineData(" ")]    
public void Test_IsNullOrEmpty_Negative(string value)
{ 
     Assert.False(value.IsNullOrEmpty());
}

事实 我应该使用事实吗? 正面与负面合二为一:

[Fact, IsUnit]
public void Test_IsNullOrEmpty()
{
    // Positive testing.
    string myString = null;
    Assert.True(myString.IsNullOrEmpty());

    myString = "";
    Assert.True(myString.IsNullOrEmpty());

    // Negative testing.
    myString = " ";
    Assert.False(myString.IsNullOrEmpty());

    myString = "TEST";
    Assert.False(myString.IsNullOrEmpty());
}

或者我应该进行一次测试:

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Null()
{
    string myString = null;
    Assert.True(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Empty()
{
    var myString = "";
    Assert.True(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Space()
{
    var myString = " ";
    Assert.False(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Word()
{
    var myString = "TEST";
    Assert.False(myString.IsNullOrEmpty());
}

我不是经验丰富的写作测试人员,并且想遵循最佳实践,所以我只想知道在C#和xUnit的上下文中,上述哪种是最佳实践(希望对此有规则,而这个问题不是基于意见:-))。

感谢您提前提出建议!

2 个答案:

答案 0 :(得分:3)

实际上,这取决于您要测试的内容。如果是您所描述的扩展方法,那么对所有断言使用一个测试,我认为应该足够了。单元测试应该是快速且可读的,尤其是对于诸如扩展之类的常见服务。如果您需要测试业务逻辑,授权内容以及使用错误的输入或某些异常来检查服务-否定测试应像每种情况下的单独测试一样。恕我直言:)

[Fact]
public void StringExtension_IsNullOrEmpty_CommonBehaviour()
{
    Assert.True(((string)null).IsNullOrEmpty());
    Assert.True(string.Empty.IsNullOrEmpty());
    Assert.True("   ".IsNullOrEmpty());
    Assert.False("MyTestString".IsNullOrEmpty());
}

顺便说一句,我宁愿在解决方案项目中为这种扩展编写测试。创建一个包含所有服务功能的单独项目(具有测试范围),制作一个通用的封闭式包装,然后将此项目包含在您的业务解决方案中。然后,您可以像依赖第三方库一样依赖它。

答案 1 :(得分:2)

我认为单个测试会更有用,因为如果每个测试用例都有自己的测试,那么随着复杂性的提高,故障排除会变得更加容易。另外,在团队中进行开发时,如果将测试分为单个场景,则更容易理解测试。