我正在尝试很好地构建单元测试,但是我不确定拆分测试的最佳方法。我正在使用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的上下文中,上述哪种是最佳实践(希望对此有规则,而这个问题不是基于意见:-))。
感谢您提前提出建议!
答案 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)
我认为单个测试会更有用,因为如果每个测试用例都有自己的测试,那么随着复杂性的提高,故障排除会变得更加容易。另外,在团队中进行开发时,如果将测试分为单个场景,则更容易理解测试。