【发布时间】:2018-04-29 12:58:40
【问题描述】:
大家好,我在为 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 获得相同的结果!?
附注对不起我的英语不好。
也许我应该提到我在 Rider 中的 Ubuntu 下工作
【问题讨论】:
-
一些不相关的提示:使用
nameof(TestsGenerator.TestCases),而不是“TestCases”字符串。将Random变量移动到该属性中(只需使用默认构造函数),并将该变量作为参数传递给GenerateCollection方法。 -
另外,Test 和 TestCaseSource 之间的分离似乎不太正确。据我所知,您正在尝试检查堆排序和数组排序是否以相同的顺序返回具有相同元素的集合。所以 TestCaseSource 应该只是 yield 返回它应该测试的集合:
t1,t2 = t1.ToArray(); HeapSort.Sort(t1); Array.Sort(t2);应该在测试中,因为这是测试正在测试的,它不是测试用例的一部分。 -
@Richardissimo 感谢您的建议,我会使用它们,关于测试,您当然是对的
-
如果您在 TestCaseData 中使用复杂对象,请始终确保它们构造正确。 Nunit 不会对你大喊大叫,它只会忽略失败的测试用例。
标签: c# .net nunit rider testcasesource