几年前为 VisualStudio2010 提出了类似的问题,但从未在这里回答:
如何在 Visual Studio 2010 中并行化数据驱动的单元测试?
我希望这个功能现在可能存在于 VS2012 中。
我的情况和上面一样,我有一个数据驱动的登录测试,它为多个客户端运行相同的测试。
我通过在 ClassInitialize 和 TestInitialize 中触发线程,并在清理之前等待所有测试完成,尝试了不同的线程解决方案。我尝试过的任何方法都不适用于这些数据驱动的测试。
我担心尝试这与 MSTest 与 dd 测试的工作方式从根本上是错误的。基本上,我发现下一个数据集在 TestCleanup 完成之前不会运行,并且 TestCleanup 不会在没有完成测试并记录测试结果的情况下完成。所以基本上,在记录了之前的测试结果之前,不能开始下一个测试。真的吗?或者有没有办法使用 MSTest 框架并行化这些?
谢谢!
c# mstest data-driven-tests parallel-testing visual-studio-2012
我试图在自动化测试中使用来自 JSON 文件的数据。因为我找到了如何使用它,感谢@jeroenh,我以正确的方式离开了这里。我希望,它会对某人有所帮助。
-- JSON 文件 (testDataCo.Json):
{
"DataCo": [
{
"url": "https://dodo.com",
"user": "test@test.com",
"password": "uawe",
}
]
}
Run Code Online (Sandbox Code Playgroud)
-- 将数据确定为 JSON 文件的类
sing System.Globalization;
using Newtonsoft.Json.Converters;
using System.IO;
using Newtonsoft.Json;
namespace DataFromJson
{
public partial class DataJson
{
[JsonProperty("DataCo")]
public DataCo[] DataCo { get; set; }
}
public partial class DataCo
{
[JsonProperty("url")]
public string Url { get; set; }
[JsonProperty("user")]
public string User { get; set; }
[JsonProperty("password")]
public string Password { get; set; }
}
public …Run Code Online (Sandbox Code Playgroud) 这是我的场景,我想进行数据驱动的单元测试,并且与环境无关我想在我的程序集中嵌入数据文件.我怎样才能在单元测试的DataSourceAttribute中引用呢?
我正在尝试使用Microsoft Jet OleDB提供程序访问Excel 2003文件.当文件在硬盘驱动器中时,单元测试工作正常,但在我尝试访问嵌入式组装文件时则不行.这是我的例子:
原版的
[DeploymentItem("IHRM.Infrastructure.EFRepositories.Tests\DataDriven.xls"),DataSource("System.Data.OleDb","Provider = Microsoft.Jet.OLEDB.4.0; Data Source = | DataDirectory |\DataDriven.xls;扩展属性= \"Excel 8.0 \"","Sheet1 $",DataAccessMethod.Sequential),TestMethod]
建议
[DataSource("System.Data.OleDb","Provider = Microsoft.Jet.OLEDB.4.0; Data Source = "这里放什么" ;扩展属性= \"Excel 8.0 \"","Sheet1 $",DataAccessMethod. Sequential),DeploymentItem("IHRM.Infrastructure.EFRepositories.Tests\DataDriven.xls"),TestMethod]
我有一些数据驱动的单元测试在Visual Studio 2010中运行得很好.这些测试使用以下模式实现.
[TestMethod()]
[DeploymentItem("path_to_data_dir_relative_to_solution\\my_data.xml")]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\my_data.xml", "Token", DataAccessMethod.Sequential)]
public void MyTestMethod()
{
// Arrange
const string EXPECTED_PARAM_NAME = "table";
string data = TestContext.DataRow["Data"].ToString();
var sut = new MyClassUnderTest();
// Act
sut.DoSomething(data);
// Assert
Assert.IsTrue(sut.DidSomething);
}
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案结构.
当我在Visual Studio 2012中运行相同的测试时,它们失败并显示以下错误消息.
结果消息:单元测试适配器无法连接到数据源或读取数据.有关解决此错误的详细信息,请参阅MSDN Library中的"数据驱动单元测试疑难解答"(http://go.microsoft.com/fwlink/?LinkId=62412).错误详细信息:对象引用未设置为对象的实例.
为什么我的单元测试突然失败了?
c# data-driven-tests visual-studio-2010 deploymentitem visual-studio-2012
我找不到在使用不同DataSource的同一测试类中运行不同单元测试的方法.
以下是测试类的示例:
namespace Calc.Tests
{
[TestClass]
public class CalcTests
{
private static TestContext Context { get; set; }
[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
Context = context;
}
[TestMethod]
[DeploymentItem("AddedValues.csv")]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", @"|DataDirectory|\AddedValues.csv", "AddedValues#csv", DataAccessMethod.Sequential)]
public void Add_UsingValuesWithinCsv()
{
Calc calc = new Calc();
// Arrange
int firstValue = Convert.ToInt32(Context.DataRow["firstValue"]);
int secondValue = Convert.ToInt32(Context.DataRow["secondValue"]);
int expectedResult = Convert.ToInt32(Context.DataRow["expectedResult"]);
// Act
int result = calc.Add(firstValue, secondValue);
// Assert
Assert.AreEqual<int>(result, expectedResult);
}
[TestMethod]
[DeploymentItem("AddedValues.xml")]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", @"|DataDirectory|\AddedValues.xml", …Run Code Online (Sandbox Code Playgroud) 我有一些数据驱动的单元测试,基本完成如下所述:
http://msdn.microsoft.com/en-us/library/ms182527.aspx
对于给定的测试运行,我可以得到如下结果:
IOrderedEnumerable<ITestCaseResult> runDetails = WebApiApplication.TeamProject.TestRuns.Find(testRunId).QueryResults().OrderBy(r=>r.Outcome);
Run Code Online (Sandbox Code Playgroud)
在每个ITestCaseResult中,我可以通过以下方式获取错误消息:
testCaseResult.ErrorMessage
Run Code Online (Sandbox Code Playgroud)
太棒了,但是当有数据驱动测试的结果时,我无法弄清楚如何获得迭代结果.它们出现在生成的.trx文件中,但不在ITestCaseResult中的任何位置.

有关如何通过API获取它们的任何想法?
我的目标是在每个单元测试迭代中都有"嵌套"数据.我想这样做,所以我可以有一组要调用的数据,以及一系列动作(由字符串描述),然后在我的测试中解释和执行.我目前通过测试资源管理器在VS2013中运行测试,使用非嵌套数据(例如,无数据/操作子项组).
例如,我的数据可能是:
<TestData>
<Iteration>
<Data>
<LoginName>admin</LoginName>
<Password>admin</Password>
</Data>
<Actions>
<Action>EnterText_LoginName</Action>
<Action>EnterText_Password</Action>
<Action>ClickButton_Login</Action>
</Actions>
</Iteration>
</TestData>
Run Code Online (Sandbox Code Playgroud)
我想按照正常的非嵌套测试(dataElements["element"])访问Data中的元素,但是,我希望在列表中包含Actions元素.我试过以下但没有成功:
var data = TestContext.DataRow.GetChildRows("Iteration_Data");
var actions = TestContext.DataRow.GetChildRows("Iteration_Actions");
Run Code Online (Sandbox Code Playgroud)
GetChildRows似乎是正确的方法,但我无法在返回的对象中看到任何类似于我的XML元素的数据 - 我只得到1个DataRow具有ItemArray3个值(0,{},0)的对象.如何检索我的Action元素列表,以便我可以访问该文本:
我有一个接收ContactForm对象和收件人地图的方法.所以我写了以下规范,根据表单的查询,返回Map中正确的收件人:
def "Correct recipients for first inquiry"() {
setup:
def form = Mock(ContactForm)
form.getInquiry() >> "Subject 1"
expect:
sut.getRecipients(form, recipientsTestMap) == ["recipient1"]
}
def "Correct recipients for second inquiry"() {
setup:
def form = Mock(ContactForm)
form.getInquiry() >> "Subject 2"
expect:
sut.getRecipients(form, recipientsTestMap) == ["recipient2"]
}
// and so on ...
Run Code Online (Sandbox Code Playgroud)
是否有数据驱动的方式来做到这一点?不幸的是,没有传递表单,但查询字符串本身现在不是一个选项,因为这将需要大量重构.我很好奇Spock是否有可能做这个数据驱动,尽管在每次测试之前必须更改模拟.
我想在 JUnit 中创建一个数据驱动的参数化方法。
我看到的例子对整个类进行了参数化。
例如
@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {
Run Code Online (Sandbox Code Playgroud)
但是,我想参数化单个测试方法,而不是整个类。
在 TestNG 中,类似的东西看起来像这样:
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
}
// This test will run 4 times since we have 5 parameters defined
@Test(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
System.out.println(inputNumber + " " + expectedResult);
Assert.assertEquals(expectedResult,
primeNumberChecker.validate(inputNumber));
}
Run Code Online (Sandbox Code Playgroud)
JUnit 中可能有这样的事情吗?
编辑:
最优雅/干燥的方法是使用单个方法级注释 …
我有一个方法,其中有很多条件:
public bool IsLegalSomething(Order order)
{
var item0 = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCode0");
var item1 = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCode1");
...
var itemN = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCodeN");
return ((item0.Status == Status.Open) && (item1.Status == Status.Closed)
&& ...
&& (itemN.Status == Status.Canceled));
}
Run Code Online (Sandbox Code Playgroud)
我想对这个函数进行单元测试,但是条件太多了,如果考虑每一个组合,单元测试的数量就会变得疯狂。该 return 语句中有 16 个条件,并且由于每个条件都是 true/false,因此我需要检查 2^16 种不同的组合。我真的需要在此处创建 2^16 个不同的单元测试以确保利用每个条件吗?请注意,这是一个简单的例子。由于法律要求,我的一些功能具有复杂的条件:
return (condition0 && condition1 && (condition2 || condition3)
&& (condition4 || (condition5 && condition6)) ...)
Run Code Online (Sandbox Code Playgroud)
通过我的一些函数的数学计算,条件可以产生的不同组合的数量是数百万种!我研究了数据驱动单元测试(DDUT)以及参数化单元测试(PUT),但这只是使单元测试成为“填空”风格。我仍然需要提供所有的各种组合和预期的结果!例如:
// Parameterized Unit Test
[TestCase(..., Result = true)] …Run Code Online (Sandbox Code Playgroud)