【问题标题】:NUnit - Loads ALL TestCaseSources even if they're not required by current testNUnit - 加载所有 TestCaseSources,即使当前测试不需要它们
【发布时间】:2023-03-28 23:40:01
【问题描述】:

我最近开始使用 NUnit 为我的项目进行集成测试。这是一个很棒的工具,但我发现了一个我似乎无法找到答案的缺点。我所有的集成测试都使用 TestCaseSource 属性并为每个测试指定一个测试用例源名称。现在的问题是准备这些测试用例源需要相当长的时间(约 1 分钟),如果我正在运行单个测试,NUnit 总是会加载每个测试用例源,即使它不是测试的测试用例源我正在运行。

是否可以更改此行为,以便仅加载我正在运行的测试的测试用例源?我想避免每次创建新测试时都创建新程序集(似乎相当多余和繁琐,更不用说,难以维护),因为我读过不同程序集中的测试是单独加载的,但我没有不知道测试用例的来源。值得一提的是,我使用 Resharper 作为测试运行器。

TL;DR:需要告诉 NUnit 只加载当前会话中运行的测试所需的 TestCaseSource。当前的行为是为运行的任何测试加载所有 TestCaseSource。

【问题讨论】:

  • 你能提供一些代码来演示当前的行为吗?
  • 当然,我会尽快编辑原始问题并添加我正在使用的代码。
  • 这演示了我的行为 - 在 VS2013 上运行 ReSharper 6。为格式道歉-我不想将其发布为非答案答案。即使我没有运行TestWhichIAmNotRunning,ReSharper 也会评估InfiniteValues,这将永远返回1(几乎)。 - - - - - public static IEnumerable<int> InfiniteValues { get { while ( DateTime.Now != DateTime.MinValue ) yield return 1; } } [Test, TestCaseSource("InfiniteValues")] public void TestWhichIAmNotRunning(int value) { }
  • 我已经联系了 JetBrains 并链接到了这个问题 - 如果他们回复我,我会在这里发布一些内容。

标签: c# unit-testing nunit resharper integration-testing


【解决方案1】:

您能否通过将源实例化移动到辅助方法并在每组测试的设置方法中调用它们来做到这一点? 我的集成测试套件中经常有一组帮助方法,它们为不同的测试设置共享数据。 我只在 [Setup] 中调用当前套件所需的辅助方法

【讨论】:

  • 您可以这样做,但是您将如何使用 TestCaseSource 属性将测试用例源分配给方法?我的目标是使用 TestCaseSource 属性,因为它负责对象数组到参数数组的转换,并使测试更加模块化。
  • 似乎是个好主意,但它不适用于 TestCase 源属性。我也尝试将其移至测试类的构造函数,但似乎 TestCaseSource 很早就被评估了。对于使用从数据库映射的 TestCaseSources 的集成测试来说,这是一个真正的痛苦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多