【问题标题】:Dynamically create nunit test cases based off config file基于配置文件动态创建 nunit 测试用例
【发布时间】:2018-06-24 07:55:03
【问题描述】:

我正在寻找一种基于配置文件动态创建 nunit 测试用例的方法。在我的App.config 中,我有一个文件名列表及其预期操作。我希望能够添加一个新条目并根据它动态创建一个测试用例。我的代码如下:

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!--syntax is filename#operation where 0 = Valid File, 1 = Missing Column, 2 = Invalid File-->
    <add key="FILENAME_0" value="C:\Users\me\Desktop\file_0.csv#0" />
    <add key="FILENAME_1" value="C:\Users\me\Desktop\file_1.csv#1" />
    <add key="FILENAME_2" value="C:\Users\me\Desktop\file_2.csv#2" />
  </appSettings>
</configuration>

在我的测试夹具中,我初始化了一个测试用例数据列表,它是通过解析App.config 文件创建的,如下所示:

[TestFixture]
public class MyTests
{
    public enum Operation
    {
        ValidFile = 0,
        MissingColumns = 1,
        InvalidFile = 2
    };

    /// <summary>
    /// Gets test case data with the file name and an enum of the expected operation.
    /// </summary>
    private static IEnumerable<TestCaseData> FilenameCases()
    {
        int i = 0;
        bool moreFilesToTest = true;
        var files = new Dictionary<string, Operation>();
        while (moreFilesToTest)
        {
            string filenameAndOp = ConfigurationManager.AppSettings[$"FILENAME_{i}"];
            if (filenameAndOp == null)
                moreFilesToTest = false;
            else
            {
                string filename = filenameAndOp.Split('#')[0];
                int operation = Int32.Parse(filenameAndOp.Split('#')[1]);
                Operation op = (Operation)operation;
                    files.Add(filename, op);
            }
            i++;
        }

        foreach (var pair in files)
            yield return new TestCaseData(pair.Key, pair.Value);
    }

    [Test, TestCaseSource("FilenameCases")]
    public void ShouldLoadFiles(string FILENAME, Operation expected)
    {
        // ... run test cases
    }    
}

但是,这可行,但每次都需要重新构建项目才能识别 App.config 中的任何更改。该代码也仅在TestCaseDatastatic 时才有效。根据配置文件动态创建新测试用例的正确方法是什么。

【问题讨论】:

  • 看起来 NUnit 不支持它,请参阅以下讨论:github.com/nunit/nunit/issues/2514 但是您可以在测试中执行此操作:因此测试本身会读取文件(app.config 或其他配置文件)。这当然会有一个缺点(?)只有一个测试

标签: c# unit-testing configuration nunit


【解决方案1】:

在研究this 的帖子后,我发现问题不在于代码,而在于配置文件。当我通过命令行运行测试时,测试.dll 没有引用我的App.config,而是另一个文件。

当我编译我的项目时,我注意到它根据项目名称生成了一个配置文件。所以一个名为MyTestProject 的测试项目会生成一个名为MyTestProject.dll.config 的文件。因此,当我对 那个 配置文件进行更改时,我的测试用例反映了这些更改,而无需重新编译项目。

感谢 CharlieAmittai Shapira,因为 NUnit 不支持动态测试用例,TestCaseSource 需要是静态的。但是,我尝试的代码是最好的解决方法,因为最终结果确实产生了动态测试用例。

【讨论】:

    【解决方案2】:

    TestCaseSource 方法必须是静态的。如果您需要,有几种方法可以解决这个问题,但我认为在您的情况下使用 static 没有问题。仅仅因为方法是静态的,并不意味着它必须始终返回相同的值。

    当您更改配置文件时,您没有理由重新编译您的代码。但是,您必须重新加载测试程序集才能读取配置中的新值。在某些环境中,例如在 VS 下,重新编译以强制发生这种情况可能更容易。

    基本上,我想说您已经找到了最好的方法,尽管我个人倾向于使用平面文件而不是配置文件。

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多