我正在尝试为我的dotnet核心项目中的测试创建测试用例。但是resharper显示它们没有在resharper的“单元测试会话”窗口中分组。
我的代码:
public class Calculator
{
public static int Multiply(int x, int y)
{
return x * y;
}
}
[TestFixture]
public class CalculatorTests
{
private static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(3, 4, 12).SetName("Multiply 3 and 4 should be 12");
yield return new TestCaseData(4, 5, 20).SetName("Multiply 4 and 5 should be 20");
}
}
private static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(0, 4, 12).SetName("Multiply 0 and 4 should be 0");
yield return new TestCaseData(5, 0, 20).SetName("Multiply 5 and 0 should be 0");
}
}
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseDataWithZero))]
public void Calculate_Success(int x, int y, int expected)
{
Calculator.Multiply(x, y).Should().Be(expected);
}
}
在dotnet核心项目共享工具中显示
在dotnet框架中显示
在框架中测试分组。我在dotnet核心应用中需要它。
有人可以帮助我吗?
我正在使用:
更新
遇难者无法识别我的测试的情况
public class Calculator
{
public static int Multiply(MyInt x, MyInt y)
{
return x.Value * y.Value;
}
}
[TestFixture]
public class CalculatorTests
{
private static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(new MyInt(3), new MyInt(4), new MyInt(12)).SetName("2132");
yield return new TestCaseData(new MyInt(4), new MyInt(5), new MyInt(20)).SetName("123123asdas");
}
}
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
public void Calculate_Success(MyInt x, MyInt y, MyInt expected)
{
Calculator.Multiply(x, y).Should().Be(expected.Value);
}
}
public class MyInt
{
public int Value;
public MyInt(int value)
{
Value = value;
}
}
答案 0 :(得分:0)
我不知道为什么,但是在使用Resharper时,使用.SetName()
的{{1}}方法似乎会使测试有些混乱。测试有时显示为不确定。
为了正确地对单元测试进行分组(即,不仅显示测试类,还显示测试方法),我决定进行如下重构:
TestCaseData
.SetName()
我使用Arrange-Act-Assert模式重构了测试方法。现在可以使用Fluent断言设置测试消息:
public static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(3, 4, 12);
yield return new TestCaseData(4, 5, 20);
}
}
public static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(0, 4, 12);
yield return new TestCaseData(5, 0, 20);
}
}
答案 1 :(得分:0)
您是否对dotnet Core和dotnet框架中显示的区别有建议?我需要命名测试用例。默认命名基于ToString,我必须在测试用例类中使用的所有命名都覆盖它
代替使用.SetName()
的方法TestCaseData
,您可以创建一个测试用例对象并覆盖.ToString()
方法,如下所示:
public class CalculatorTestData
{
public CalculatorTestData(int x, int y, int expected)
{
X = x;
Y = y;
Expected = expected;
}
public int X { get; }
public int Y { get; }
public int Expected { get; }
/// <inheritdoc />
public override string ToString()
{
return $"Multiply {X} and {Y} should be {Expected}";
}
}
使用CalculatorTestData
对象:
public static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(new CalculatorTestData(3, 4, 12));
yield return new TestCaseData(new CalculatorTestData(4, 5, 20));
}
}
public static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(new CalculatorTestData(0, 4, 12));
yield return new TestCaseData(new CalculatorTestData(5, 0, 20));
}
}
最后,重构测试方法以使用CalculatorTestData
对象:
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseDataWithZero))]
public void Calculate_Success(CalculatorTestData data)
{
// arrange/act
int result = Calculator.Multiply(data.X, data.Y);
// assert
result.Should().Be(data.Expected, because: $"{data.X} * {data.Y} should be {data.Expected}");
}