是否可以从外部数据源(如Excel电子表格,CSV文件或数据库)获取TestCaseAttribute的值?即拥有一个.csv文件,每个测试用例包含1行数据,并一次将该数据传递给NUnit。
以下是我想用它的具体情况。我目前正在将一些功能从一个系统合并到另一个系统。这几乎只是从旧系统到新系统的复制和粘贴过程。不幸的是,被移动的代码不仅没有任何测试,而且不是以可测试的方式编写的(即与数据库和其他代码紧密耦合。)花时间使代码可测试是不可能的,因为它是大混乱,我的时间紧迫,整个功能计划在未来6-9个月内从头开始重新编写。但是,由于我不喜欢不对代码进行任何测试的想法,我将使用WebDriver创建一些简单的Selenium测试来通过UI测试页面。虽然这不是理想的,但总比没有好。
有问题的页面有大约10个输入值和大约20个值,我需要在计算完成后断言,其中包含大约30个我想要测试的有效值组合。我已经将数据放在电子表格中,所以能够简单地将其拉出来而不必在Visual Studio中重新输入所有内容是很好的。
答案 0 :(得分:5)
我终于能够使用NUnit的TestCaseSource attribute完成我想要的任务。代码看起来有点难看,但它的工作原理。
以下是从.csv文件中拉取数据并将其传递给测试方法的示例。该测试用于简单计算器的Add方法,该计算器采用两个整数,将它们相加并返回总和。
从文件加载测试数据的类。
public class TestData
{
public int number1 { get; set; }
public int number2 { get; set; }
public int sum { get; set; }
public static IEnumerable TestCases
{
get
{
string inputLine;
using(FileStream inputStream =
new FileStream("C:\\Code\\TestData\\TestData.csv",
FileMode.Open,
FileAccess.Read))
{
StreamReader streamReader = new StreamReader(inputStream);
while((inputLine = streamReader.ReadLine()) != null)
{
var data = inputLine.Split(',');
yield return new TestData {
number1 = Convert.ToInt32(data[0])
,number2 = Convert.ToInt32(data[1])
,sum = Convert.ToInt32(data[2])
};
}
streamReader.Close();
inputStream.Close();
}
}
}
}
带有实际测试的类:
[TestFixture]
public class CalculatorTests
{
[Test]
[TestCaseSource(typeof(TestData), "TestCases")]
public void AddTwoNumbers(TestData data)
{
int sum = Calculator.Add(data.number1, data.number2);
sum.ShouldEqual(data.sum);
}
}
TestData.csv的内容
4,4,8
15,20,35
8,8,16
5,5,10
42,13,55
修改TestData类中的get属性以从任何所需的数据源(即数据库,Web服务,Excel ......)中提取数据应该相当简单
答案 1 :(得分:0)
您可以随时在Excel或任何电子表格工具中打开csv文件,然后添加一个新的列,将输入/输出值连接到测试用例语法中。
类似于:= CONCATENATE(“[TestCase(”,A1,“,”,B1,“,”,C1,“,”,D1,“,”,E1,“)]”)
然后将列复制/粘贴到代码中。