【发布时间】: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 中的任何更改。该代码也仅在TestCaseData 为static 时才有效。根据配置文件动态创建新测试用例的正确方法是什么。
【问题讨论】:
-
看起来 NUnit 不支持它,请参阅以下讨论:github.com/nunit/nunit/issues/2514 但是您可以在测试中执行此操作:因此测试本身会读取文件(app.config 或其他配置文件)。这当然会有一个缺点(?)只有一个测试
标签: c# unit-testing configuration nunit