Nunit:TestCaseSource不期望生成所有测试用例吗?

时间:2018-04-29 12:58:41

标签: c# .net nunit rider testcasesource

大家好我在为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。抱歉我的英语不好。

也许我应该提一下,我在Rider的Ubuntu下工作

2 个答案:

答案 0 :(得分:1)

Char.IsDigit()通常不太准确。你的循环正在生成许多相同的测试,因为它们都是从同一个种子开始的。为什么你使用种子而不是简单地让Random自己工作?

不同的跑步者将以不同的方式处理相同的测试。如果您指明用于执行测试的跑步者,我可以使用更多信息编辑此答案。但是,一般来说,您肯定不希望使用相同的数据生成一堆测试。他们不为你做任何事情!

答案 1 :(得分:0)

原因是TestExplorer会查看测试用例的名称,并用相同的名称进行分组。因此,您不会看到所有测试用例的结果。由于原因是TestExplorer,因此使用控制台运行测试不会遇到相同的问题。有关详细信息,请查看此issue。根据问题,有两种解决方案:

  1. 为您的测试用例创建类并覆盖ToString()方法 使其为每个测试用例返回唯一的值。
  2. 使用TestCaseData类及其方法SetName为每个测试设置唯一的名称。