根据配置文件动态创建nunit测试用例

时间:2018-01-15 16:35:59

标签: c# unit-testing configuration nunit

我正在寻找一种基于配置文件动态创建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时才有效。根据配置文件动态创建新测试用例的正确方法是什么。

2 个答案:

答案 0 :(得分:2)

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

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

归功于 Charlie Amittai Shapira ,因为NUnit不支持动态测试用例,TestCaseSource需要是静态的。但是,我尝试的代码是最好的解决方案,因为最终结果产生了动态测试用例。

答案 1 :(得分:1)

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

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

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