【问题标题】:Nunit: TestCaseSource does not expect to generate all test cases?Nunit:TestCaseSource 不希望生成所有测试用例?
【发布时间】: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 返回它应该测试的集合:t1t2 = t1.ToArray(); HeapSort.Sort(t1); Array.Sort(t2); 应该在测试中,因为这是测试正在测试的,它不是测试用例的一部分。
  • @Richardissimo 感谢您的建议,我会使用它们,关于测试,您当然是对的
  • 如果您在 TestCaseData 中使用复杂对象,请始终确保它们构造正确。 Nunit 不会对你大喊大叫,它只会忽略失败的测试用例。

标签: c# .net nunit rider testcasesource


【解决方案1】:

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

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

【讨论】:

  • 我在 JetBrains Rider 中从 gui 运行测试
  • 有趣的是,当我通过控制台运行测试时,我处理了所有 25 个测试,如何通过 GUI 获得相同的结果
  • @Aiswe 由于控制台运行正常,我猜这不是 NUnit 问题。考虑为这个问题添加一个rider 标签,让合适的人看到它。
  • 无论如何,我建议您更改代码,以免生成具有相同数据的测试。这对你没有任何帮助!
【解决方案2】:

原因是 TestExplorer 会查看测试用例的名称并将具有相同名称的测试用例分组。所以你看不到所有的测试用例结果。原因是 TestExplorer 使用控制台运行测试没有相同的问题。详情请看issue。根据问题有两种解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2016-03-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多