首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NUnit中的数据驱动测试?

NUnit中的数据驱动测试?
EN

Stack Overflow用户
提问于 2010-10-28 03:19:46
回答 5查看 23K关注 0票数 15

在MSTest中,您可以执行以下操作:

代码语言:javascript
复制
[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", 
            "testdata.csv", "testdata#csv", DataAccessMethod.Sequential)]
public void TestSomething()
{
    double column1 = Convert.ToDouble(TestContext.DataRow["column1"]);
    ...
    Assert.AreEqual(...);
}

NUnit 2.5中对应的代码是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-28 03:26:54

我会看看parameterized tests documentation in NUnit 2.5,看看你是否能做一些像你在那里做的事情。我不记得NUnit有内置的CSV recall属性来驱动参数化测试。不过,在某个地方可能有一个社区插件。

我还应该指出,如果您正在寻找非MS单元测试框架库来帮助您,xUnit.net确实具有此功能。查看此blog post from Ben Hall

票数 10
EN

Stack Overflow用户

发布于 2011-05-23 18:12:08

我在NUnit中实现了基于csv的数据驱动测试,如下所示:

在测试类中使用封装在返回IEnumerable的私有方法中的csv reader from code project,然后在测试用例上使用TestCaseSource属性引用它。将csv文件包含在项目中,并将"Copy to Output Directory“设置为"Copy Always”。

代码语言:javascript
复制
using System.Collections.Generic;
using System.IO;
using LumenWorks.Framework.IO.Csv;
using NUnit.Framework;

namespace mytests
{
    class MegaTests
    {
        [Test, TestCaseSource("GetTestData")]
        public void MyExample_Test(int data1, int data2, int expectedOutput)
        {
            var methodOutput = MethodUnderTest(data2, data1);
            Assert.AreEqual(expectedOutput, methodOutput, string.Format("Method failed for data1: {0}, data2: {1}", data1, data2));
        }

        private int MethodUnderTest(int data2, int data1)
        {
            return 42; //todo: real implementation
        }

        private IEnumerable<int[]> GetTestData()
        {
            using (var csv = new CsvReader(new StreamReader("test-data.csv"), true))
            {
                while (csv.ReadNextRecord())
                {
                    int data1 = int.Parse(csv[0]);
                    int data2 = int.Parse(csv[1]);
                    int expectedOutput = int.Parse(csv[2]);
                    yield return new[] { data1, data2, expectedOutput };
                }
            }
        }
    }
}

原文来源:http://timwise.blogspot.com/2011/05/data-driven-test-in-nunit-with-csv.html

票数 12
EN

Stack Overflow用户

发布于 2014-04-24 19:55:38

这里是另一个与Tim Abell非常相似的例子,但是没有使用CSV阅读器的框架,并显示了测试的细节。注当您使用TestCaseAttribute时,可以省略TestAttribute。

代码语言:javascript
复制
        [TestCaseSource("GetDataFromCSV")]
    public void TestDataFromCSV(int num1,int num2,int num3)
    {
        Assert.AreEqual(num1 + num2 ,num3);
    }

    private IEnumerable<int[]> GetDataFromCSV()
    {
        CsvReader reader = new CsvReader(path);
        while (reader.Next())
        {
            int column1 = int.Parse(reader[0]);
            int column2 = int.Parse(reader[1]);
            int column3 = int.Parse(reader[2]);
            yield return new int[] { column1, column2, column3 };
        }
    }


public class CsvReader : IDisposable
{
    private string path;
    private string[] currentData;
    private StreamReader reader;

    public CsvReader(string path)
    {
        if (!File.Exists(path)) throw new InvalidOperationException("path does not exist");
        this.path = path;
        Initialize();
    }

    private void Initialize()
    {
        FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
        reader = new StreamReader(stream);
    }

    public bool Next()
    {
        string current = null;
        if ((current = reader.ReadLine()) == null) return false;
        currentData = current.Split(',');
        return true;
    }

    public string this[int index]
    {
        get { return currentData[index]; }
    }


    public void Dispose()
    {
        reader.Close();
    }
}

CSV数据:

10,200,210 20,190,210 30,180,210 40,170,210 50,160,210 60,150,210 70,140,210 80,130,210 90,120,210 100,110,210

注意:第三列是前两列的总和,这将在单元测试中被断言。

结果:

在下面找到一个使用TestCaseData对象并设置返回类型的替代方案(这是必须的)

代码语言:javascript
复制
        [TestCaseSource("GetDataFromCSV2")]
    public int TestDataFromCSV2(int num1, int num2)
    {
        return num1 + num2;
    }

    private IEnumerable GetDataFromCSV2()
    {
        CsvReader reader = new CsvReader(path);
        while (reader.Next())
        {
            int column1 = int.Parse(reader[0]);
            int column2 = int.Parse(reader[1]);
            int column3 = int.Parse(reader[2]);
            yield return new TestCaseData(column1, column2).Returns(column3);
        }
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4036840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档