Nunit:TestCaseSource 不希望生成所有测试用例吗?
Nunit: TestCaseSource does not expect to generate all test cases?
大家好,我在为 TestCaseSource 生成测试用例时遇到了问题。我写了这段代码用于测试:
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
namespace HeapSort.Tests
{
[TestFixture]
public class Tests
{
[Test, TestCaseSource(typeof(TestsGenerator),"TestCases")]
public void IsEqualCollections(int[] received, int[] expected)
{
CollectionAssert.AreEqual(received, expected);
}
}
public class TestsGenerator
{
public static IEnumerable<TestCaseData> TestCases
{
get
{
for (var i = 0; i < 25; i++)
{
int[] t1 = GenerateCollection(i), t2 = t1.ToArray();
HeapSort.Sort(t1);
Array.Sort(t2);
yield return new TestCaseData(t1, t2);
}
}
}
private static int[] GenerateCollection(int seed)
{
var rnd = new Random(seed+DateTime.Now.Millisecond);
int size = rnd.Next(100, 10000);
int[] array = new int[size];
for (var i = 0; i < size; i++)
array[i] = rnd.Next(-100, 100);
return array;
// return Enumerable
// .Repeat(100, rnd.Next(100, 10000))
// .Select(i => rnd.Next(-100, 100))
// .ToArray();
}
}
}
问题出在哪里?我没有得到 25 个测试,而是从 1 到 8。而且通常在测试的起点,它显示测试是 7/8,最后只有一个测试用例。
我该如何解决这个问题?
UPD1:有趣的是,当我通过控制台进行 运行 测试时,我处理了所有 25 个测试,我如何通过 GUI 获得相同的结果!?
P.S。抱歉我的英语不好。
也许我应该提到我在 RiderUbuntu
工作
DateTime.Now
通常不是很准确。您的循环正在生成许多相同的测试,因为它们都是从同一个种子开始的。你为什么要使用种子而不是简单地让 Random 自己工作?
不同的跑步者会以不同的方式处理相同的测试。如果您指出您正在使用哪个跑步者来执行测试,我可以使用更多信息编辑此答案。但是,一般来说,您肯定不想生成一堆具有相同数据的测试。他们不会为你做任何事!
原因是 TestExplorer 查看测试用例的名称并将具有相同名称的测试用例分组。所以你看不到所有的测试用例结果。由于 TestExplorer 的原因,您没有相同的问题 运行 使用控制台进行测试。查看此 issue 了解详细信息。根据问题有两种解决方案:
- 为您的测试用例创建 class 并覆盖
ToString()
方法
使其成为每个测试用例的 return 个唯一值。
- 使用
TestCaseData
class 及其方法 SetName
为每个测试设置唯一名称。
大家好,我在为 TestCaseSource 生成测试用例时遇到了问题。我写了这段代码用于测试:
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
namespace HeapSort.Tests
{
[TestFixture]
public class Tests
{
[Test, TestCaseSource(typeof(TestsGenerator),"TestCases")]
public void IsEqualCollections(int[] received, int[] expected)
{
CollectionAssert.AreEqual(received, expected);
}
}
public class TestsGenerator
{
public static IEnumerable<TestCaseData> TestCases
{
get
{
for (var i = 0; i < 25; i++)
{
int[] t1 = GenerateCollection(i), t2 = t1.ToArray();
HeapSort.Sort(t1);
Array.Sort(t2);
yield return new TestCaseData(t1, t2);
}
}
}
private static int[] GenerateCollection(int seed)
{
var rnd = new Random(seed+DateTime.Now.Millisecond);
int size = rnd.Next(100, 10000);
int[] array = new int[size];
for (var i = 0; i < size; i++)
array[i] = rnd.Next(-100, 100);
return array;
// return Enumerable
// .Repeat(100, rnd.Next(100, 10000))
// .Select(i => rnd.Next(-100, 100))
// .ToArray();
}
}
}
问题出在哪里?我没有得到 25 个测试,而是从 1 到 8。而且通常在测试的起点,它显示测试是 7/8,最后只有一个测试用例。
我该如何解决这个问题?
UPD1:有趣的是,当我通过控制台进行 运行 测试时,我处理了所有 25 个测试,我如何通过 GUI 获得相同的结果!?
P.S。抱歉我的英语不好。
也许我应该提到我在 RiderUbuntu
工作DateTime.Now
通常不是很准确。您的循环正在生成许多相同的测试,因为它们都是从同一个种子开始的。你为什么要使用种子而不是简单地让 Random 自己工作?
不同的跑步者会以不同的方式处理相同的测试。如果您指出您正在使用哪个跑步者来执行测试,我可以使用更多信息编辑此答案。但是,一般来说,您肯定不想生成一堆具有相同数据的测试。他们不会为你做任何事!
原因是 TestExplorer 查看测试用例的名称并将具有相同名称的测试用例分组。所以你看不到所有的测试用例结果。由于 TestExplorer 的原因,您没有相同的问题 运行 使用控制台进行测试。查看此 issue 了解详细信息。根据问题有两种解决方案:
- 为您的测试用例创建 class 并覆盖
ToString()
方法 使其成为每个测试用例的 return 个唯一值。 - 使用
TestCaseData
class 及其方法SetName
为每个测试设置唯一名称。