我正在寻找一种基于配置文件动态创建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中的任何更改。该代码仅在TestCaseData
为static
时才有效。根据配置文件动态创建新测试用例的正确方法是什么。
答案 0 :(得分:2)
在研究this帖后,我发现问题不在于代码,而在于配置文件。当我通过命令行运行测试时,测试.dll
没有引用我的App.config
,而是另一个文件。
当我编译项目时,我注意到它根据项目名称生成了一个配置文件。因此,标题为MyTestProject
的测试项目将生成一个名为MyTestProject.dll.config
的文件。因此,当我对那个配置文件进行更改时,我的测试用例反映了这些更改,而没有重新编译项目。
归功于 Charlie 和 Amittai Shapira ,因为NUnit不支持动态测试用例,TestCaseSource
需要是静态的。但是,我尝试的代码是最好的解决方案,因为最终结果产生了动态测试用例。
答案 1 :(得分:1)
TestCaseSource
方法需要是静态的。如果你需要它,有几种方法,但我认为在你的情况下使用静态没有问题。仅仅因为方法是静态的,并不意味着它必须始终返回相同的值。
更改配置文件时,没有理由重新编译代码。但是,您必须重新加载测试程序集才能读取配置中的新值。在某些环境中,比如在VS下,可能更容易重新编译以强制发生这种情况。
基本上,我说你已经找到了最好的方法,尽管我的个人倾向是使用平面文件而不是配置文件。