3

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

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

有问题的页面有大约 10 个输入值和大约 20 个值,我需要在计算完成后对其进行断言,还有大约 30 个我想测试的有效值组合。我已经将数据保存在电子表格中,因此能够简单地将其提取出来,而不必在 Visual Studio 中重新输入所有数据,那就太好了。

4

2 回答 2

6

我终于能够使用 NUnit 的TestCaseSource 属性完成我想要的。代码看起来有点难看,但它可以工作。

这是从 .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 ......)中提取数据应该相当简单

于 2010-07-22T17:01:31.750 回答
0

您始终可以在 excel 或任何电子表格工具中打开 csv 文件,然后添加一个新列,将输入/输出值连接到测试用例语法中。

类似于: =CONCATENATE("[TestCase(", A1, ",", B1, ",", C1, ",", D1, ",", E1, ")]")

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

于 2010-06-07T18:51:19.343 回答