【问题标题】:Best way to split my xUnit tests for testing an extension method拆分我的 xUnit 测试以测试扩展方法的最佳方法
【发布时间】:2018-10-17 11:17:13
【问题描述】:

我正在尝试很好地构建我的单元测试,但我不确定拆分测试的最佳方式。我正在使用 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 的上下文中,以上哪个是最佳实践(希望对此有规则,而这个问题不是基于意见:-))。

提前感谢您的任何指点!

【问题讨论】:

  • 作为初学者做第三个选项。从来没有第二。
  • 我认为当你需要检查你的代码是否适用于枚举的每个值时,最好使用理论,这在此处不适用。

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


【解决方案1】:

实际上,这取决于您到底要测试什么。如果它是您描述的扩展方法,我认为对所有断言使用一个测试就足够了。单元测试应该是快速和可读的,特别是对于像扩展这样的常见服务。如果您需要测试业务逻辑、授权内容以及检查输入错误或某些异常的服务 - 否定测试应该像每个场景中的单独测试一样。恕我直言:)

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

顺便说一句,我不想​​在解决方案项目中为这种扩展编写测试。创建一个包含所有服务功能的单独项目(具有测试覆盖率),制作一个通用的封闭包并将该项目包含到您的业务解决方案中。然后你可以像依赖第三方库一样依赖它。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢莎拉!这是有道理的!
    • 我不相信这个回复应该被接受为答案。 Xunit 旨在通过避免重复测试代码与 MSUnit 和 NUnit 不同。因此这个框架的正确使用是重用测试。如果要隔离测试,请使用 MSUnit 或 NUnit。我很欣赏在大多数现实世界场景中不可接受的事后更改。
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2015-10-01
    • 2011-07-27
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多