【问题标题】:Data driven testing in C# using arrays使用数组在 C# 中进行数据驱动测试
【发布时间】:2013-07-23 05:36:05
【问题描述】:

我有一个测试方法,它将两个 XML 文件作为输入并进行比较。我在.NET 4.5 上使用Microsoft.VisualStudio.TestTools.UnitTesting 框架。我想修改测试方法,使其需要多个 XML 文件(一次两个),运行测试并分别给出结果。

我尝试了以下代码,但它只提供一个输出,并且在任何一对输入文件未通过测试时停止。

 string[] source = {file1, file2, file3, file4....};
 string[] target = {fileA, fileB, fileC, fileD....};

 [Test Method]
 public void TestCase01()
 {
      TestLogic testObj = new TestLogic(); //class containing the comparison method
      for (int i = 0; i < source.Length; i++)
      {
            Assert.IsTrue (testObj.VerifyFiles(source[i], target[i]));
      }
 }

经过一番研究,我发现可以使用DataSource 属性。但我不知道如何将两个数组(或单个二维数组)传递给DataSource 属性。 我宁愿使用 Microsoft.VisualStudio.TestTools.UnitTesting 进行测试,而其他 3rd 方框架(如 NUnit)仅作为最后的手段。

编辑: 我不知道输入文件的数量。我以 4 个文件为例。 在将文件传递给 TestMethod 之前,我使用它们的 ID 对它们进行配对。所以我首先从两个不同的文件夹中读取了两组文件,根据它们的ID进行配对,然后将配对后的文件传递给测试用例进行测试。我现在这样做的方式是将配对的文件名(源和目标)保存在一个数组或列表中,然后将它们传递给测试用例。显然这种方法不起作用,我遇到了上述问题。

【问题讨论】:

    标签: c# unit-testing mstest .net-4.5


    【解决方案1】:

    您可以将DataSource 用作具有两列(一列用于源,一列用于目标)的csv 文件。然后在您的测试中按如下方式使用它:

    [TestClass]
    public class TestCase
    {
        [TestMethod]
        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "files.csv", "files#csv", DataAccessMethod.Sequential)]
        public void TestCase()
        {
            TestLogic testObj = new TestLogic();
    
            string source = (string) TestContext.DataRow["source"]; // get the value from the 'source' column
            string target = (string) TestContext.DataRow["target"]; // get the value from the 'target' column
    
            Assert.IsTrue(testObj.VerifyFiles(source, target));
        }
    
       public TestContext TestContext{ get; set; }
    }
    

    测试将遍历 DataSource 的行,并为每一行运行一次。

    查看here了解更多详情。

    【讨论】:

    • 因此,使用这种方法,我将不得不从两个文件夹中读取文件,根据它们的 ID 对它们进行配对,然后将配对的文件名保存在我由测试用例读取的 CSV 文件中。有更直接的方法吗?像直接将数组传递给 DataSource 一样?
    • 在你的问题中你没有提到任何关于配对的事情。他们似乎已经配对了。只是字符串数组(我建议路径),所以我的解决方案是将这些数组(成对的路径)放在一个 scv 中并从那里读取它们。这样,您无需复制测试用例并添加更多配对路径,而无需更改代码。如果您在测试中有额外的功能,请编辑您的问题。
    • 顺便说一句,我的答案不仅限于 4 个文件。如果您在任何时候想要添加一个新对,您只需编辑 csv 并添加一个新行。就这样。测试用例也会执行这一行
    • 我已经用细节更新了这个问题。抱歉不够清楚。
    • @Schaliasos 是的,我认为您的解决方案肯定会奏效。只是想知道是否有更直接的方法,因为随着项目的进展,不同类型的文件会增加更多的复杂性,我必须为这些文件编写不同的 TestClass。
    【解决方案2】:

    我遇到了类似的问题,最后还是按照this blog post的建议,

    我们使用匿名类型数组来存储我们的一组条件,然后使用 LINQ 的 ForEach() 方法循环遍历数组并对每个元素运行测试。

    【讨论】:

    • 这看起来与他试图避免的 OP 的原始解决方案相同,例如“它只提供一个输出并在任何一对输入文件未通过测试时停止”
    【解决方案3】:

    简单地等同可以工作 Datasource instance=Array。 循环中的数据源行和行值作为数组实例。

    【讨论】:

    • 你能详细说明一下吗?也许给它一些演示代码。
    猜你喜欢
    • 2010-11-18
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多