Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据驱动单元测试的优缺点(Excel数据源)_C#_Visual Studio 2010_Unit Testing_Data Driven Tests - Fatal编程技术网

C# 数据驱动单元测试的优缺点(Excel数据源)

C# 数据驱动单元测试的优缺点(Excel数据源),c#,visual-studio-2010,unit-testing,data-driven-tests,C#,Visual Studio 2010,Unit Testing,Data Driven Tests,从最近几天开始,我一直在从事数据驱动的单元测试。我使用Excel电子表格作为数据源。虽然它减少了我的测试方法中的冗余代码(而不是在测试方法中写入所有测试数据并每次调用相同的函数),但另一方面,我认为它使我的单元测试变得复杂(配置设置、解析Excel中的数据、意外异常等等)。谁能解释一下每种方法的利弊吗。为了更好地理解,我在下面写了一个有数据源和无数据源的示例测试方法: 有数据源 [TestMethod] [DataSource("CompanyAddressInfo_DataSource")]

从最近几天开始,我一直在从事数据驱动的单元测试。我使用Excel电子表格作为数据源。虽然它减少了我的测试方法中的冗余代码(而不是在测试方法中写入所有测试数据并每次调用相同的函数),但另一方面,我认为它使我的单元测试变得复杂(配置设置、解析Excel中的数据、意外异常等等)。谁能解释一下每种方法的利弊吗。为了更好地理解,我在下面写了一个有数据源和无数据源的示例测试方法:

有数据源

[TestMethod]
[DataSource("CompanyAddressInfo_DataSource")]
[DeploymentItem("CoreUnitTests\\CompanyUnitTests\\CompanyTestData.xlsx")]
public void CompanyAddressInfo_GetItem_Test()
{
    if (TestContext.DataRow["Company_No"] != DBNull.Value)
    {
        bool expected = false;
        bool actual=false;

        if (TestContext.DataRow["Expected"].ToString() == "Y")
        expected = true;
        long Company_No = Convert.ToInt64(TestContext.DataRow["Company_No"]);

        CompanyAddressInfo obj = CompanyAddressInfo.GetItem(Company_No);

        if (obj != null)
        {actual = (obj.Company_No == Company_No);}

        Assert.AreEqual(expected,actual);
    }
}
[TestMethod]
public void CompanyAddressInfo_GetItem_Test()
{
    bool actual=false;

    long Company_No;

    Company_No = 20;
    CompanyAddressInfo obj = CompanyAddressInfo.GetItem(Company_No);
    actual = (obj.Company_No == Company_No);
    Assert.AreEqual(true,actual);

    Company_No = 23;
    CompanyAddressInfo obj = CompanyAddressInfo.GetItem(Company_No);
    actual = (obj.Company_No == Company_No);
    Assert.AreEqual(false,actual);

    ..............so on

}
无数据源

[TestMethod]
[DataSource("CompanyAddressInfo_DataSource")]
[DeploymentItem("CoreUnitTests\\CompanyUnitTests\\CompanyTestData.xlsx")]
public void CompanyAddressInfo_GetItem_Test()
{
    if (TestContext.DataRow["Company_No"] != DBNull.Value)
    {
        bool expected = false;
        bool actual=false;

        if (TestContext.DataRow["Expected"].ToString() == "Y")
        expected = true;
        long Company_No = Convert.ToInt64(TestContext.DataRow["Company_No"]);

        CompanyAddressInfo obj = CompanyAddressInfo.GetItem(Company_No);

        if (obj != null)
        {actual = (obj.Company_No == Company_No);}

        Assert.AreEqual(expected,actual);
    }
}
[TestMethod]
public void CompanyAddressInfo_GetItem_Test()
{
    bool actual=false;

    long Company_No;

    Company_No = 20;
    CompanyAddressInfo obj = CompanyAddressInfo.GetItem(Company_No);
    actual = (obj.Company_No == Company_No);
    Assert.AreEqual(true,actual);

    Company_No = 23;
    CompanyAddressInfo obj = CompanyAddressInfo.GetItem(Company_No);
    actual = (obj.Company_No == Company_No);
    Assert.AreEqual(false,actual);

    ..............so on

}

请注意,上述代码只是一个示例。另外,我认为数据驱动单元测试的另一种替代方法是创建一个调用dll的通用函数,并将测试数据传递给该函数(从而减少冗余)

让我们来看看下面的另一种选择:但是您正在测试的到底是什么呢?
CompanyAddressInfo.GetItem
函数是否工作,或者底层数据是否都在那里?如果是前者,您只需要测试3个案例——未定义的公司编号、有效的公司编号和无效的公司编号。如果是后者,那么您可能不是在进行单元测试。@StephenByrne:我只是在尝试进行前者(使用有效..无效和未定义的数据进行单元测试)。但正如我上面所说的,这只是一个例子,让我的问题更清楚。我需要检查的参数数量(不仅是公司编号),随着参数数量的增加,测试数据的组合数量也会增加。有效的公司编号,但无效的公司地址……反之亦然。我明白你的意思。但是,你可以考虑将测试数据文件加载到所有测试之前,而不是每次测试都必须单独处理。您是否考虑过使用fitNesse之类的产品这将使您专注于编写特定参数化测试的测试线束,并将测试数据的提供作为QA的一项单独工作,等。@StephenByrne.。我知道没有替代工具,但目前我的问题不是替代方法是什么,而是上面哪种方法更好。