在MSTest中,您可以执行以下操作:
[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV",
"testdata.csv", "testdata#csv", DataAccessMethod.Sequential)]
public void TestSomething()
{
double column1 = Convert.ToDouble(TestContext.DataRow["column1"]);
...
Assert.AreEqual(...);
}
Run Code Online (Sandbox Code Playgroud)
NUnit 2.5中的等效代码是什么?
DUnit通常的工作方式是编写一些已发布的方法,而DUnit将它们作为测试运行.我想做的是有点不同.我想在运行时根据数据创建测试.我正在尝试测试处理输入文件的特定模块以创建输出文件.我有一组测试输入文件,其中包含相应的已知良好输出文件.我们的想法是为每个输入文件动态创建一个测试,处理输入并根据已知的好输出检查输出.
然而,这里的实际数据来源并不重要.困难在于使DUnit以数据驱动的方式运行.为了解决这个问题,假设数据源只是一个随机数生成器.这是一个解决困难核心的示例具体问题:
在运行时创建一些测试对象(TTestCase或其他),比如10个,每个测试对象
从DUnit的设计来看,它的设计看起来具有足够的灵活性,使这些事情成为可能.我不确定它是不是.我试图通过继承TAbstractTest和ITest来创建我自己的测试类,但是一些关键的方法无法访问.我也尝试从TTestCase继承,但是这个类与运行已发布方法的想法密切相关(并且测试以方法命名,所以我不能只调用一个,比如'go',因为那时候我所有的测试都会被称为'go',我希望我的所有测试都被单独命名).
或者,是否有一些替代DUnit可以做我想要的?
我知道我可以使用文件中的数据来驱动单元测试,例如csv或xml文件中的数据.
例如:
[TestMethod]
[DataSource(
"Microsoft.VisualStudio.TestTools.DataSource.CSV",
"Data.csv",
"Data#csv",
DataAccessMethod.Sequential)]
public void TestData() {}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种方法,而不是使用文件,我可以使用已经在内存中的数据结构来驱动测试.
就像是:
// this structure has the data to use in the unit test
var DataList = new List<string>();
[TestMethod]
[DataSource(
"Microsoft.VisualStudio.TestTools.DataSource.IEnumerable",
"DataList",
"DataList",
DataAccessMethod.Sequential)]
public void TestData() {}
Run Code Online (Sandbox Code Playgroud) 我有以下CSV文件,用于我的数据驱动单元测试:
File;expected
Resources.resx;default
Resources.de.resx;de
AttachmentDetail.ascx.it.resx;it
SomeOtherFile.rm-CH.resx;rm-CH
Run Code Online (Sandbox Code Playgroud)
"文件"和"预期"是标题.但是,如果我想在代码中得到"文件"列
TestContext.DataRow["File"].ToString();
Run Code Online (Sandbox Code Playgroud)
我收到了错误
System.ArgumentException:列'File'不属于表..
当我通过测试方法属性将CSV文件添加到现有测试用例时,似乎"文件"列在其名称前面有一些奇怪的符号,就像编码问题一样.但是,如果我用记事本,Notepad ++甚至TextMate(在Mac上)打开CSV文件,我没有看到任何这样的迹象,我无法摆脱它们.
有人可以给我一个关于这个问题的建议吗?
我正在尝试使用MSTest/Selenium在C#中使用数据驱动测试.以下是我尝试设置的一些代码的示例:
[TestClass]
public class NewTest
{
private ISelenium selenium;
private StringBuilder verificationErrors;
[DeploymentItem("GoogleTestData.xls")]
[DataSource("System.Data.OleDb",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=GoogleTestData.xls;Persist Security Info=False;Extended Properties='Excel 8.0'",
"TestSearches$", DataAccessMethod.Sequential)]
[TestMethod]
public void GoogleTest()
{
selenium = new DefaultSelenium("localhost", 4444, "*iehta", http://www.google.com);
selenium.Start();
verificationErrors = new StringBuilder();
var searchingTerm = TestContext.DataRow["SearchingString"].ToString();
var expectedResult = TestContext.DataRow["ExpectedTextResults"].ToString();
...
Run Code Online (Sandbox Code Playgroud)
这是我的错误:错误3非静态字段,方法或属性'Microsoft.VisualStudio.TestTools.UnitTesting.TestContext.DataRow.get'E:\ Projects\SeleniumProject\SeleniumProject\MaverickTest.cs 32需要对象引用33 SeleniumProject
该错误强调了两个语句的"TestContext.DataRow"部分.我真的一直在努力解决这个问题,谢谢!
我目前正在使用googles单元测试框架为嵌入式应用程序编写单元测试.现在我的老板很不高兴我测试的数据(即我调用被测试类的方法的值)在测试中是硬接线的.他要求从文件中读取此数据.他的论点是,为一个以前被遗忘的角落案件添加另一个测试会更容易.我不是单位测试的经验,但到目前为止,我不是这样做的.所以我试着弄清楚最好的方法是什么 - 即使这样做是个好主意.我很快就遇到了DDT(数据驱动测试)方法.
谷歌单元测试框架有一个他们称之为" 价值参数化测试 "的功能.有了它,我的测试夹具成为模板类,我可以传入参数.但是,我看到了一些问题:
我会想象像谷歌测试框架那样成熟的东西让它变得更容易.但是,他们写道
值参数化测试很方便[当]你想通过各种输入(又称数据驱动测试)测试你的代码.此功能很容易被滥用,所以请在锻炼时锻炼你的良好感觉!
此外还有这篇博客文章TotT:Data Driven Traps,也警告我(滥用)数据驱动的单元测试.
所以我的问题归结为:
我并不是真的要googletest,而且基本上可以自由选择任何我喜欢的框架.
编辑
我在googletest常见问题解答的FAQ条目中找到了以下声明
一般来说,Google Test对数据驱动的测试还没有很好的支持.我们希望很快能够在这方面做出改进.
我有一个非常简单的测试:
def "setContent_activity_finished"(Status editStatus) {
// Variables.........................
given:
activity.getStatus() >> editStatus.toString()
when:
handler.setContent(activityId,jsonString)
then:
0*view.appendPossible(_)
where:
editStatus |_
FINISHED |_
CANCELED |_
}
Run Code Online (Sandbox Code Playgroud)
根据文档http://spock-framework.readthedocs.org/en/latest/data_driven_testing.html 数据表必须至少有两列.单列表可以写成:
where:
a | _
1 | _
7 | _
0 | _
Run Code Online (Sandbox Code Playgroud)
我遵循这条规则,但得到的错误如下图所示:
Groovy:Date variable '_' needs to be declared as method parameter
Run Code Online (Sandbox Code Playgroud)

所以,请告诉我这里的问题是什么?
多年来我一直在寻找这个,我想我终于在"MSTest V2"中找到了一个真正的方法(意思是.netcore附带的那个,并且在Visual Studio 2017中才能真正正确处理).请参阅我的解决方案.
这对我来说解决的问题是我的输入数据不容易序列化,但是我的逻辑需要用许多这些输入进行测试.有很多原因可以解释为什么这样做更好,但那对我来说是个噱头; 我被迫进行了一次巨大的单元测试,并通过我的输入进行for循环.到现在.
我试图在自动化测试中使用来自 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) 我正在进行这样的测试:
[DataTestMethod]
[DataRow("example1")]
[DataRow("example2")]
public void Test_Example(string name)
{
// test logic
}
Run Code Online (Sandbox Code Playgroud)
[TestCleanup]我们的日志系统目前在基础中以单一方法实现[TestClass]。
我可以通过属性访问测试方法的名称TestContext,但不包含有关数据行参数的任何信息。
是否有可能以某种方式获得这些值?在[TestCleanup]或在[TestInitialize]就可以了。