2016-02-02 89 views
1

我打算将所有测试用例存储在一个excel文件中,其中的列指示测试方法名称,参数和预期结果;但是,我发现TestCaseSource只是将所有测试用例分配给每个测试方法。我想知道是否有任何方法可以根据我放入电子表格的方法名称为NUnit选择测试用例的方法?NUnit:TestCaseSource将测试分配给特定的测试方法

谢谢。

+0

您是否希望使用一个'TestCaseSource'作为不同的测试方法,以便每个测试只会根据其名称运行特殊的测试用例组? – Kote

+0

是的!更确切地说,我会把TestCaseSource属性放在所有的测试方法上。 –

回答

1

有一种方法可以做到这一点。例如,正如你所提到的,你可以创建一个自定义属性。
这个想法是通过测试的名称TestCaseSource
您可以通过创建TestCaseSource作为单独的类来实现。

首先,TestCaseSource类:

public class SpreadSheetTestCaseSource 
{ 
    [ThreadStatic] 
    public static string TestName = String.Empty; 

    public static IEnumerable TestCases 
    { 
     get 
     { 
      SpreadSheetTestCaseProvider.GetTestCases() 
       .Where(testCase => testCase.TestName == TestName); 
     } 
    } 
} 

再到属性:

public class MyTestCaseSourceAttribute : TestCaseSourceAttribute 
{ 
    public MyTestCaseSourceAttribute(Type sourceType, string sourceName, 
     [CallerMemberName] string name = null) 
     : base(sourceType, sourceName) 
    { 
     SpreadSheetTestCaseSource.TestName = name; 
    } 

    //Another two members impl. 
} 

和测试:

[TestFixture] 
public class TestClass 
{ 
    [MyTestCaseSource(typeof(SpreadSheetTestCaseSource), "TestCases")] 
    public void TestMethod() 
    { 
     //Test logic 
    } 
} 

SpeadSheetTestCaseSource.TestName是线程静态的。所以你可以并行运行测试。

+0

比我的想法更清洁的实现。 +1 –

+0

非常感谢您的回复。只是一个问题,我如何实现SpreadSheetTestCaseSource类。 SpreadSheetTestCaseProvider是从TestCaseProvider继承的吗? –

+0

@LiuGarry,在这种情况下'SpreadSheetTestCaseSource'只是一个虚构的类。您可以通过多种方式实现它。我只是假设它将Excel文档解析为“IEnumerable ”。 – Kote

0

这不是NUnit直接支持的功能。各种TestCaseSource类型属性无法根据输入提供测试方法。

一个选项是为每个测试方法创建一个TestCaseSource。其中每一个都是一个简单的包装器,它将方法名称传递给一个内部方法。该内部方法将在Excel文件中读取,并只返回给定方法名称的行。

PseudoCode;

[TestCaseSource(nameof(TestMethodOneSource))] 
public void TestMethodOne(int x, int y, int expected) 
{ 
    Assert.That(x + y, Is.EqualTo(expected)); 
} 

public static IEnumerable<object[]> TestMethodOneSource() => 
    ReadExcel(nameof(TestMethodOne)); 

private static IEnumerable<object[]> ReadExcel(string method) 
{ 
    // Open and start reading Excel 
    for(var row in rows) 
    { 
     if(row[0] == method) 
     { 
      // Return objects minus the method 
      yield return new [] {row[1], ..., row[n]}; 
     } 
    } 
} 
+0

非常感谢。我曾考虑过这个问题。问题是我会有很多测试方法,所以我需要为每个测试方法创建包装。我想知道如果有办法,也许可以创建自定义属性来实现这一点。 –