使用列名(来自 CSV 文件)作为使用 Nunit 的测试的名称
Use a column name (from a CSV file) as the name of a test using Nunit
我正在尝试使用列值作为测试名称,以便所有行都显示在 Visual Studio 的“测试资源管理器”窗格中,每行显示一次。
以下是我使用 CSV 文件中的数据进行的测试。我尝试使用 "TestName" 属性和切片(“{15:16}”)我想用作测试名称的字符串部分的默认名称。我现在肯定做对了,因为它只是给我方法名称的名称。
第二种方法是我的读取操作。此外,我不喜欢必须将我的数据分配给变量然后再传递它们。我真的在寻找一种更优雅的方法来解决读取和使用 CSV 数据进行命名和测试的问题,所以如果有人有任何经验或想法,我很乐意听取他们的意见。
如果有,请告诉我我遗漏了任何可以进一步阐明我的目标的信息。
class MegaTests
{
[TestCase(TestName = "{15:16}")]
[Test, TestCaseSource("GetTestData")]
public void MyExample_Test(string TestName, string json, string ExpectedResult, string Environment, string ChannelMessage, string ChannelSubject, string MessageCenterMessage, string MessageCenterSubject)
{
Console.WriteLine(TestName + " " + json + " " + ExpectedResult + " " + Environment + " " + ChannelMessage + " " + ChannelSubject + " " + MessageCenterMessage + " " + MessageCenterSubject);
}
private static IEnumerable<string[]> GetTestData()
{
//using (var csv = new CsvReader(new StreamReader(@"../../csv/data.csv"), true))
using (var csv = new CsvReader(new StreamReader(@"DataDriveFromCSV/csv/data.csv"), true))
{
while (csv.ReadNextRecord())
{
string TestName = csv[0];
string json = csv[1];
string ExpectedResult = csv[2];
string Environment = csv[3];
string ChannelMessage = csv[4];
string ChannelSubject = csv[5];
string MessageCenterMessage = csv[6];
string MessageCenterSubject = csv[7];
yield return new[] { TestName, json, ExpectedResult, Environment, ChannelMessage, ChannelSubject, MessageCenterMessage, MessageCenterSubject };
}
}
}
[TestCase]
和 [TestCaseSource]
是为测试获取数据的替代正交方法。尽管您可以使用两者以两种不同的方式获取数据,但它们不会以任何方式合作。
如果您使用 [TestCase(TestName="{15:16}")]
,您将创建一个没有参数且名称为“{15:16}”的测试。使用 TestCaseSource 是做您想做的事情的正确方法。
如果仔细考虑,您会发现不能将测试名称作为参数传递给测试。测试必须存在才能首先调用它,一旦存在,它就已经有了名称。
您应该 return 一个 TestCaseData
的实例,而不是 return 参数数组,这将允许您传递参数以及设置测试名称.
对于任何对此有疑问的人...
{
using (var csv = new CsvReader(new StreamReader("PATH TO YOUR CSV FILE"), false))
{
List<string> Lines = new List<string>();
int counter = 0;
while (csv.ReadNextRecord())
{
if (counter == 0)
{
for (int i = 0; i < csv.FieldCount; i++)
{
Lines.Add(csv[i]);
}
}
else
{
Dictionary<string, string> testData = new Dictionary<string, string>();
for (int i = 0; i < Lines.Count; i++)
{
testData.Add(Lines[i], csv[i]);
}
yield return new TestCaseData(testData).SetName(csv[0].ToString());
}
counter++;
}
}
}
我正在尝试使用列值作为测试名称,以便所有行都显示在 Visual Studio 的“测试资源管理器”窗格中,每行显示一次。
以下是我使用 CSV 文件中的数据进行的测试。我尝试使用 "TestName" 属性和切片(“{15:16}”)我想用作测试名称的字符串部分的默认名称。我现在肯定做对了,因为它只是给我方法名称的名称。
第二种方法是我的读取操作。此外,我不喜欢必须将我的数据分配给变量然后再传递它们。我真的在寻找一种更优雅的方法来解决读取和使用 CSV 数据进行命名和测试的问题,所以如果有人有任何经验或想法,我很乐意听取他们的意见。
如果有,请告诉我我遗漏了任何可以进一步阐明我的目标的信息。
class MegaTests
{
[TestCase(TestName = "{15:16}")]
[Test, TestCaseSource("GetTestData")]
public void MyExample_Test(string TestName, string json, string ExpectedResult, string Environment, string ChannelMessage, string ChannelSubject, string MessageCenterMessage, string MessageCenterSubject)
{
Console.WriteLine(TestName + " " + json + " " + ExpectedResult + " " + Environment + " " + ChannelMessage + " " + ChannelSubject + " " + MessageCenterMessage + " " + MessageCenterSubject);
}
private static IEnumerable<string[]> GetTestData()
{
//using (var csv = new CsvReader(new StreamReader(@"../../csv/data.csv"), true))
using (var csv = new CsvReader(new StreamReader(@"DataDriveFromCSV/csv/data.csv"), true))
{
while (csv.ReadNextRecord())
{
string TestName = csv[0];
string json = csv[1];
string ExpectedResult = csv[2];
string Environment = csv[3];
string ChannelMessage = csv[4];
string ChannelSubject = csv[5];
string MessageCenterMessage = csv[6];
string MessageCenterSubject = csv[7];
yield return new[] { TestName, json, ExpectedResult, Environment, ChannelMessage, ChannelSubject, MessageCenterMessage, MessageCenterSubject };
}
}
}
[TestCase]
和 [TestCaseSource]
是为测试获取数据的替代正交方法。尽管您可以使用两者以两种不同的方式获取数据,但它们不会以任何方式合作。
如果您使用 [TestCase(TestName="{15:16}")]
,您将创建一个没有参数且名称为“{15:16}”的测试。使用 TestCaseSource 是做您想做的事情的正确方法。
如果仔细考虑,您会发现不能将测试名称作为参数传递给测试。测试必须存在才能首先调用它,一旦存在,它就已经有了名称。
您应该 return 一个 TestCaseData
的实例,而不是 return 参数数组,这将允许您传递参数以及设置测试名称.
对于任何对此有疑问的人...
{
using (var csv = new CsvReader(new StreamReader("PATH TO YOUR CSV FILE"), false))
{
List<string> Lines = new List<string>();
int counter = 0;
while (csv.ReadNextRecord())
{
if (counter == 0)
{
for (int i = 0; i < csv.FieldCount; i++)
{
Lines.Add(csv[i]);
}
}
else
{
Dictionary<string, string> testData = new Dictionary<string, string>();
for (int i = 0; i < Lines.Count; i++)
{
testData.Add(Lines[i], csv[i]);
}
yield return new TestCaseData(testData).SetName(csv[0].ToString());
}
counter++;
}
}
}