gpt4 book ai didi

c# - 使用多个事实或单一理论

转载 作者:行者123 更新时间:2023-11-30 22:59:01 25 4
gpt4 key购买 nike

我目前正在用 xUnit 编写一些单元测试。到目前为止,我一直在为 UT 使用 MSTest,因此每个测试用例都是文件中的单个测试。通过 xUnit,我可以使用参数化测试。我不确定在使用它们时,更常见的是什么,或者我应该使用更多。

我正在测试的方法很简单 - 它采用十进制数并将其转换为具有特定属性的字符串。测试总是有相同的代码,只是输入和输出不同。下面的例子是简化版的,但我觉得还是表达了意思。

[Fact]
public void valueIsZero()
{
var formattedValue = Formatter.Format(0m);

Assert.Equal("0", formattedValue);
}

[Fact]
public void valueIsOne()
{
var formattedValue = Formatter.Format(1m);

Assert.Equal("1", formattedValue);
}

这是我在 MSTest 中编写测试的方式,但在 xUnit 中我可以用这样的理论编写这些测试:

public static IEnumerable<object[]> Data =>
new List<object[]>
{
new object[] { 0m, "0" },
new object[] { 1m, "1" }
};

[Theory]
[MemberData(nameof(Data))]
public void multipleValue(decimal value, string expectedResult)
{
var formattedValue = Formatter.Format(value, true, false, true);

Assert.Equal(expectedResult, formattedValue);
}

第一种或第二种方法有什么好处或坏处吗?或者哪种方法更常见?

最佳答案

测试代码应该像生产代码一样对待。所以 SOLID、DRY 等一般原则也适用。xUnit 中的 Theory 构造有助于避免重复测试代码。这使得将来的维护更容易(只有一个地方可以更改逻辑)。考虑您的程序逻辑是否会因需求变化而发生变化。然后调整程序逻辑和测试。更改一个 Theory-Test 比更改多个 Fact-Test 的工作更少。

对于您的示例,我建议像这样使用 InlineData:

[Theory]
[InlineData("0", "0")]
[InlineData("1", "1")]
public void multipleValue(string value, string expectedResult)
{
var formattedValue = Formatter.Format(Convert.ToDecimal(value), true, false, true);

Assert.Equal(expectedResult, formattedValue);
}

这导致在 VisualStudio 的 Testrunner 中显示良好,因为分析器将每个 InlineData 识别为单个单元测试并将它们显示为一个组。

关于c# - 使用多个事实或单一理论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52568975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com