2

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

[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 服务的多个部署版本运行此测试(这是一个功能测试,所以没有任何东西被模拟 - 即它很可能是针对部署到多个网站的 codedui 测试主机)。

[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 个部署位置,并且在测试方法的数据源中有 2 个值,我应该得到 4 个测试。

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

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

谁能指出一些可能帮助我解决我的这个问题的信息?

4

1 回答 1

3

更新!这适用于 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.
}
于 2011-11-09T10:08:43.250 回答