复制数据驱动测试的行为

时间:2011-08-04 14:38:44

标签: visual-studio-2010 testing mstest functional-testing data-driven-tests

现在,如果你有一个看起来像这样的测试:

[TestMethod]
[DeploymentItem("DataSource.csv")]
[DataSource(
    Microsoft.VisualStudio.TestTools.DataSource.CSV, 
    "DataSource.csv", 
    "DataSource#csv", 
    DataAccessMethod.Sequential)]
public void TestSomething()
{
    string data = TestContext.DataRow["ColumnHeader"].ToString();
    /* 
    do something with the data
    */
}

执行此测试时,您将获得与数据值一样多的测试运行。

我想要做的是在代码中复制这种行为,同时仍然拥有数据源。例如:假设我想针对Web服务的多个部署版本运行此测试(这是一个功能测试,因此没有任何模拟 - 即。它很可能是对部署到多个网站的编码测试主机)。

[TestMethod]
[DeploymentItem("DataSource.csv")]
[DataSource(
    Microsoft.VisualStudio.TestTools.DataSource.CSV, 
    "DataSource.csv", 
    "DataSource#csv", 
    DataAccessMethod.Sequential)]
public void TestSomething()
{
    var svc = helper.GetService(/* external file - NOT a datasource */);
    string data = TestContext.DataRow["ColumnHeader"].ToString();
    /* 
    do something with the data
    */
}

现在,如果我在外部文件中列出了2个部署位置,并且在testmethod的数据源中有2个值,那么我应该进行4次测试。

您可能会问为什么我不只是将值添加到数据源。外部文件中的数据将通过.testsettings中的部署项进行测试运行,因为它们可以并且将针对运行测试的每个人进行不同的定义,我不想强​​制重建测试代码,以便运行测试,或者爆炸测试数据文件的数量。每个测试可能/应该能够指定它要测试的位置(类型在编译时是已知的,而不是物理位置)。

同样,无法为每个部署位置创建测试,因为部署位置可以并且在位置和数量上都是动态的。

有人能指出一些可能有助于我解决这个问题的信息吗?

1 个答案:

答案 0 :(得分:3)

<强> UPDATE!这适用于Visual Studio 2010,但似乎无法在2012和2013上运行。

我遇到了类似的问题,我想在数据驱动测试中使用一堆文件作为测试数据。我在执行数据驱动测试之前通过生成CSV文件解决了这个问题。生成发生在使用ClassInitialize属性修饰的静态方法中。

我猜你基本上可以做类似的事情并将你当前的数据源与你的“外部文件”合并,然后输出你的数据驱动测试使用的新的CSV数据源。

public TestContext TestContext { get; set; }
const string NameColumn = "NAME";
const string BaseResourceName = "MyAssembly.UnitTests.Regression.Source";

[ClassInitialize()]
public static void Initialize(TestContext context)
{
    var path = Path.Combine(context.TestDeploymentDir, "TestCases.csv");
    using (var writer = new StreamWriter(path, false))
    {
        // Write column headers
        writer.WriteLine(NameColumn);

        string[] resourceNames = typeof(RegressionTests).Assembly.GetManifestResourceNames();
        foreach (string resourceName in resourceNames)
        {
            if (resourceName.StartsWith(BaseResourceName))
            {
                writer.WriteLine(resourceName);
            }
        }
    }
}

[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\TestCases.csv", "TestCases#csv", DataAccessMethod.Random)]
public void RegressionTest()
{
    var resourceName = TestContext.DataRow[NameColumn].ToString();
    // Get testdata from resource and perform test.
}