这是一个非常简单但令人烦恼的行为,我遇到了NUnit:
我有一些像这样的测试:
[Test]
[TestCase( 1, 2, "hello" )]
[TestCase( 3, 5, "goodbye" )]
public void MyClass_MyMethod( int a, int b, string c )
{
Assert.IsTrue( a < b );
}
这很好用,在ReSharper NUnit窗格中,我可以看到每个TestCase在结果中得到自己的响应。
我有第二个看起来像这样的TestCase:
[Test]
[TestCase( 1, 2, new long[] { 100, 200 })]
[TestCase( 5, 3, new long[] { 300, 500 })]
public void MyClass_MyOtherMethod( long a, long b, long[] bunchOfNumbers )
{
Assert.IsTrue( a < b );
}
当我运行它时,我看到了:
一个或多个子测试有错误Exception没有stacktrace
public void MyClass_MyOtherMethod(5,3,System.Int64 [])失败
不同之处在于,在我的其他测试中,它将每个TestCase抽取为测试列表上的一个单独的复选框,而这一个没有显示,我没有详细信息,直到我在调试器中运行它以确定出错了什么哪里。我有点担心这个测试在构建机器上的表现。有谁知道发生了什么以及为什么?
答案 0 :(得分:30)
从this bug at JetBrains开始,看起来这里的解决方案就是在不同情况下使用TestName
属性:
[Test]
[TestCase( 1, 2, new long[] { 100, 200 }, TestName="Test 1" )]
[TestCase( 5, 3, new long[] { 300, 500 }, TestName="Test 2" )]
public void MyClass_MyOtherMethod( long a, long b, long[] bunchOfNumbers )
{
Assert.IsTrue( a < b );
}
如果我的某个测试失败,现在所有内容都在ReSharper中正确显示。
答案 1 :(得分:4)
另一种方法是为数组使用字符串:
[TestCase( 1, 2, "100, 200")]
[TestCase( 5, 3, "300, 500")]
public void MyClass_MyOtherMethod(long a, long b, string bunchOfNumbersString)
{
var bunchOfNumbers= bunchOfNumbersString.Split(',')
.Select(long.Parse)
.ToArray();
...
}
这种方法的好处在于它会在测试人员中呈现出来。
附注:使用[Test]
时不需要[TestCase]
,或者至少我没有看到它解决了问题。
答案 2 :(得分:2)
对于包含字符串的数组,请使用带有object
属性的TestCase
数组:
[Test]
[TestCase(new object[] {"foo", "bar", "baz"})]
[TestCase(new object[] {"300", "500", "700"})]
public void MyClass_SomeOtherMethod(string[] bunchOfStrings)
{
// assert something...
}
答案 3 :(得分:0)
这在带有NUnit 3.11.0的VS 2017中有效
[TestCase(new long[] {5, 6, 942135153})]
public void DummyTest(long[] values)
{
Assert.That(values != null);
}
答案 4 :(得分:0)
我遇到了一个问题,其中参数的顺序很重要。使用 Rider 2020.1.4
[TestCase(new string[] { "ABC", "DEF" }, false)]
public void SomeTestWithParams(string[] stringArr, bool someBool) {}
给了我一个错误,但是
[TestCase(false, new string[] { "ABC", "DEF" })]
public void SomeTestWithParams(bool someBool, string[] stringArr) {}
工作得很好