0

我正在 Nunit 中编写新的测试。我希望测试从 excel 表(数据驱动测试)中获取它们的 TestCaseSource 值。

但是,我注意到 [SetUp] 方法实际上是在输入 [Test] 方法之后访问的,因此我无法初始化从 TestCaseSource 中的 excel 表读取的数据。

在每个测试运行之前,如何从 excel 文件中初始化我的 TestCaseSource?

谢谢

我尝试使用像 MyFactoryClass 这样的单独类,然后使用

[Test, TestCaseSource(typeof(MyFactoryClass), "TestCases")]

但是,这是在[Setup]方法之前达到的,并且无法识别以每个测试名称命名的 excel 文件的名称。

4

1 回答 1

0

在使用 NUnit 时,了解测试在加载和运行时所经历的阶段非常重要。因为我不知道您在每个阶段都在做什么,所以我将从概述这些阶段开始。在您发布一些显示您的工厂类、[SetUp]方法和实际测试正在做什么的代码后,我将添加到这个答案中。

简而言之,NUnit在运行测试之前加载它们。它实际上可能会为每个负载运行多个测试——这取决于所使用的运行器的类型。例子:

  1. NUnit-console 加载一次测试并运行一次,然后退出。

  2. TestCentric GUI 加载测试一次,然后在您每次选择测试并单击运行时运行它们。它也可以使用菜单选项重新加载它们。

  3. TestExplorer 使用 NUnit 3 测试适配器加载测试,然后在您每次单击运行时运行它们。

理想情况下,您应该编写测试,以便它们可以在任何运行程序下工作。为此,您应该假设它们将为每个负载运行多次。不要在加载时编写代码,您希望每次运行都重复这些代码。如果您遵循此规则,您将获得更强大的测试。

那么...... NUnit 在每个阶段都做了什么?这里是...

正在加载...

  • [TestCaseSource]您执行的所有代码。

跑步...

  • 对于每个TestFixture(为简单起见,我将忽略SetUpFixtures

    • 运行任何[OneTimeSetUp]方法

    • 对于每个TestTestCase

      • 运行任何[SetUp]方法
      • 运行测试本身
      • 运行任何[TearDown]方法
    • 运行任何[OneTimeTearDown]方法

正如您所注意到的,您为任何步骤编写的代码只能依赖于已经执行的步骤。特别是,加载测试时采取的操作不能依赖于运行它的操作。如果您认为“加载”实际上意味着创建将要运行的测试,这是有道理的。

如果您[TestCaseSource]事先知道要创建什么对象,您应该只调用创建对象的工厂。通常,最好的方法是初始化那些将用于创建对象的参数。然后根据您的目标对象生命周期,[OneTimeSetUp]这些用于实际创建对象。[SetUp]

这已经足够(也许太多)概括了!如果您发布一些代码,我会在这个答案中添加更具体的建议。

于 2019-10-25T14:26:36.270 回答