C# 使用TestCaseSource获取带有参数的测试用例

C# 使用TestCaseSource获取带有参数的测试用例,c#,unit-testing,nunit,C#,Unit Testing,Nunit,为了测试一组NUnit测试,我想从一个文本文件中读取所有测试用例 此文本文件看起来像: 第0行:“testcasename,param0,param1” 第1行:“testcasename,param0,param1,Param2,…” 存在具有不同方法签名的不同测试用例 我的NUnit电话看起来像: [Test, TestCaseSource("TestSelection")] public void Module(String testPath,

为了测试一组NUnit测试,我想从一个文本文件中读取所有测试用例

此文本文件看起来像: 第0行:“testcasename,param0,param1” 第1行:“testcasename,param0,param1,Param2,…”

存在具有不同方法签名的不同测试用例

我的NUnit电话看起来像:

[Test, TestCaseSource("TestSelection")]             
public void Module(String testPath, String testFile, int version)
{
   Test1(testPath, testFile, true, version);
}


public static IEnumerable<TestCaseData> TestSelection()
{
   var path = @"C:\path\TestCases.txt";
            
   foreach (var line in File.ReadAllLines(path))
   {
     yield return new TestCaseData(line.Split(','));
   }
            
}
public static IEnumerable<TestCaseData> TestData()
        {
            var reader = new StreamReader(File.OpenRead(
                @"C:\pathTestCases.txt"));
            
            while (!reader.EndOfStream)
            {
                var list = new List<Object>();
                var line = reader.ReadLine();
                var values = line.Split(',');
                
                for(int i = 0; i < values.Length; i++)
                {
                    if(i == 0 || i == 1)
                    {
                        String arg = values[i];
                        list.Add(arg);
                    }
                    else
                    {
                        int arg = Int32.Parse(values[i]);
                        list.Add(arg);
                    }
                }
                yield return new TestCaseData(list);
                
            }
            
        } 
[Test,TestCaseSource(“TestSelection”)]
公共void模块(字符串testPath、字符串testFile、int版本)
{
Test1(testPath,testFile,true,version);
}
公共静态IEnumerable TestSelection()
{
var path=@“C:\path\TestCases.txt”;
foreach(文件中的var行.ReadAllLines(路径))
{
返回新的TestCaseData(line.Split(','));
}
}
我想为文本文件中的每一行获取一个测试用例。每个测试用例应该包含在同一行内的参数,用逗号分隔。
参数的类型必须正确。因此,即使整行被读取为字符串,TestCaseData中的数字也应该是int。

您的TestCaseSource方法提供了带有三个字符串参数的测试用例。但是您的测试方法需要两个字符串和一个int。您知道这一点,并说“数字应该是int”,但没有代码进行转换

创建
TestCaseData
项时,它必须与方法签名匹配,或者只需要标准的隐式转换。例如,您可以将一个
int
传递给一个需要
long
的方法,而不是相反。除非您自己这样做,否则您绝对不能期望将
字符串
转换为
int

此外,根据您给出的布局,文件行包含测试用例的名称,后跟参数。您的代码不考虑该布局,而是假定整行由参数组成

这里是TestCaseSource方法的修改版本,它解决了其中一些问题。它可能不完整,因为我在猜测你想要完成什么。它也完全缺少任何错误检查

public static IEnumerable<TestCaseData> TestSelection()
{
   var path = @"C:\path\TestCases.txt";
        
   foreach (var line in File.ReadAllLines(path))
   {
     var data = line.Split(',');
     // Ignoring data[0]
     yield return new TestCaseData(data[1], data[2], int.Parse(data[3]));
   }    
}
公共静态IEnumerable TestSelection()
{
var path=@“C:\path\TestCases.txt”;
foreach(文件中的var行.ReadAllLines(路径))
{
var数据=行分割(',');
//正在忽略数据[0]
返回新的TestCaseData(数据[1],数据[2],int.Parse(数据[3]);
}    
}

您的TestCaseSource方法提供了带有三个字符串参数的测试用例。但是您的测试方法需要两个字符串和一个int。您知道这一点,并说“数字应该是int”,但没有代码进行转换

创建
TestCaseData
项时,它必须与方法签名匹配,或者只需要标准的隐式转换。例如,您可以将一个
int
传递给一个需要
long
的方法,而不是相反。除非您自己这样做,否则您绝对不能期望将
字符串
转换为
int

此外,根据您给出的布局,文件行包含测试用例的名称,后跟参数。您的代码不考虑该布局,而是假定整行由参数组成

这里是TestCaseSource方法的修改版本,它解决了其中一些问题。它可能不完整,因为我在猜测你想要完成什么。它也完全缺少任何错误检查

public static IEnumerable<TestCaseData> TestSelection()
{
   var path = @"C:\path\TestCases.txt";
        
   foreach (var line in File.ReadAllLines(path))
   {
     var data = line.Split(',');
     // Ignoring data[0]
     yield return new TestCaseData(data[1], data[2], int.Parse(data[3]));
   }    
}
公共静态IEnumerable TestSelection()
{
var path=@“C:\path\TestCases.txt”;
foreach(文件中的var行.ReadAllLines(路径))
{
var数据=行分割(',');
//正在忽略数据[0]
返回新的TestCaseData(数据[1],数据[2],int.Parse(数据[3]);
}    
}

为了澄清我的问题,这里有另一个描述

我的主要信息源是一个文本文件,我的所有测试用例都存储在这个文件中。 此类文本文件的一个示例可能是:

第0行:|“Testpath0”、“Testname0”、“param0”| 第1行:|“Testpath1”、“Testname1”、“param0”、“param1”、“param2”| 等等

重要的是,每一行可以包含不同数量的参数(当然,我必须为每一数量的参数编写正确的testmethod)。 另一个事实:前两个信息(testpath和testname)是字符串,所有其他参数都是int

现在我想阅读这些行并将它们转换成测试用例。TestCaseSource应该是有用的

我当前执行此操作的方法如下所示:

[Test, TestCaseSource("TestSelection")]             
public void Module(String testPath, String testFile, int version)
{
   Test1(testPath, testFile, true, version);
}


public static IEnumerable<TestCaseData> TestSelection()
{
   var path = @"C:\path\TestCases.txt";
            
   foreach (var line in File.ReadAllLines(path))
   {
     yield return new TestCaseData(line.Split(','));
   }
            
}
public static IEnumerable<TestCaseData> TestData()
        {
            var reader = new StreamReader(File.OpenRead(
                @"C:\pathTestCases.txt"));
            
            while (!reader.EndOfStream)
            {
                var list = new List<Object>();
                var line = reader.ReadLine();
                var values = line.Split(',');
                
                for(int i = 0; i < values.Length; i++)
                {
                    if(i == 0 || i == 1)
                    {
                        String arg = values[i];
                        list.Add(arg);
                    }
                    else
                    {
                        int arg = Int32.Parse(values[i]);
                        list.Add(arg);
                    }
                }
                yield return new TestCaseData(list);
                
            }
            
        } 
公共静态IEnumerable TestData()
{
var reader=new StreamReader(File.OpenRead(
@“C:\pathTestCases.txt”);
而(!reader.EndOfStream)
{
var list=新列表();
var line=reader.ReadLine();
var值=行分割(',');
for(int i=0;i
TestMethods是问题的另一部分,但首先我必须正确读取数据


如果我运行这个,它就不工作了。澄清我的问题有点令人沮丧,这里是另一种描述

我的主要信息源是一个文本文件,我的所有测试用例都存储在这个文件中。 此类文本文件的一个示例可能是:

第0行:|“Testpath0”、“Testname0”、“param0”| 第1行:|“Testpath1”、“Testname1”、“param0”、“param1”