拆分 xUnit 测试以测试扩展方法的最佳方法
Best way to split my xUnit tests for testing an extension method
我正在尝试很好地构建我的单元测试,但我不确定拆分测试的最佳方法。我正在使用 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 上下文中的最佳实践(希望这个问题和这个问题有规则不是基于意见:-)).
感谢提前指点!!
我认为单个测试更有用,因为随着复杂性的增加,如果每个测试用例都有自己的测试,则故障排除会变得更容易。另外,当你在团队中开发时,如果将它们拆分为单个场景,则更容易理解测试。
实际上,这取决于您要测试的内容。如果它是您描述的扩展方法,我认为对所有断言使用一个测试应该足够了。单元测试应该快速且可读,尤其是对于扩展等常见服务。如果您需要测试业务逻辑、授权内容,并检查带有错误输入或某些异常的服务——负面测试应该像每个场景一样单独进行。恕我直言:)
[Fact]
public void StringExtension_IsNullOrEmpty_CommonBehaviour()
{
Assert.True(((string)null).IsNullOrEmpty());
Assert.True(string.Empty.IsNullOrEmpty());
Assert.True(" ".IsNullOrEmpty());
Assert.False("MyTestString".IsNullOrEmpty());
}
顺便说一句,我不想在解决方案项目中为这种扩展编写测试。创建一个包含所有服务功能的单独项目(具有测试覆盖率),制作一个通用的封闭包并将该项目包含到您的业务解决方案中。然后你可以像依赖第三方库一样依赖它。
我正在尝试很好地构建我的单元测试,但我不确定拆分测试的最佳方法。我正在使用 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 上下文中的最佳实践(希望这个问题和这个问题有规则不是基于意见:-)).
感谢提前指点!!
我认为单个测试更有用,因为随着复杂性的增加,如果每个测试用例都有自己的测试,则故障排除会变得更容易。另外,当你在团队中开发时,如果将它们拆分为单个场景,则更容易理解测试。
实际上,这取决于您要测试的内容。如果它是您描述的扩展方法,我认为对所有断言使用一个测试应该足够了。单元测试应该快速且可读,尤其是对于扩展等常见服务。如果您需要测试业务逻辑、授权内容,并检查带有错误输入或某些异常的服务——负面测试应该像每个场景一样单独进行。恕我直言:)
[Fact]
public void StringExtension_IsNullOrEmpty_CommonBehaviour()
{
Assert.True(((string)null).IsNullOrEmpty());
Assert.True(string.Empty.IsNullOrEmpty());
Assert.True(" ".IsNullOrEmpty());
Assert.False("MyTestString".IsNullOrEmpty());
}
顺便说一句,我不想在解决方案项目中为这种扩展编写测试。创建一个包含所有服务功能的单独项目(具有测试覆盖率),制作一个通用的封闭包并将该项目包含到您的业务解决方案中。然后你可以像依赖第三方库一样依赖它。