将外部数据源与NUnit的TestCaseAttribute一起使用

时间:2010-06-07 18:25:37

标签: nunit selenium webdriver

是否可以从外部数据源(如Excel电子表格,CSV文件或数据库)获取TestCaseAttribute的值?即拥有一个.csv文件,每个测试用例包含1行数据,并一次将该数据传递给NUnit。

以下是我想用它的具体情况。我目前正在将一些功能从一个系统合并到另一个系统。这几乎只是从旧系统到新系统的复制和粘贴过程。不幸的是,被移动的代码不仅没有任何测试,而且不是以可测试的方式编写的(即与数据库和其他代码紧密耦合。)花时间使代码可测试是不可能的,因为它是大混乱,我的时间紧迫,整个功能计划在未来6-9个月内从头开始重新编写。但是,由于我不喜欢不对代码进行任何测试的想法,我将使用WebDriver创建一些简单的Selenium测试来通过UI测试页面。虽然这不是理想的,但总比没有好。

有问题的页面有大约10个输入值和大约20个值,我需要在计算完成后断言,其中包含大约30个我想要测试的有效值组合。我已经将数据放在电子表格中,所以能够简单地将其拉出来而不必在Visual Studio中重新输入所有内容是很好的。

2 个答案:

答案 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,“)]”)

然后将列复制/粘贴到代码中。