现在,如果你有一个看起来像这样的测试:
[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
中的部署项进行测试运行,因为它们可以并且将针对运行测试的每个人进行不同的定义,我不想强制重建测试代码,以便运行测试,或者爆炸测试数据文件的数量。每个测试可能/应该能够指定它要测试的位置(类型在编译时是已知的,而不是物理位置)。
同样,无法为每个部署位置创建测试,因为部署位置可以并且在位置和数量上都是动态的。
有人能指出一些可能有助于我解决这个问题的信息吗?
答案 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.
}