2015-09-04 187 views
0

自動化依賴注入我有,所有含有一定接口(每個組件不同)的一個實現組件的文件夾。我爲該接口編寫了一些單元測試,並希望自動執行在每個實現上運行接口測試的任務。在單元測試

我有我不喜歡工作的解決方案:在實際的測試類

  • 編寫代碼加載(大會)和實例化的實現,這些存儲在列表中。

  • 編寫的每個測試遍歷實現的列表,運行其上的每個斷言。

我想要什麼,而不是是對一個實現運行所有測試,然後移動到下一個再次運行所有測試,等等。我的想法是找到一種方法來執行(編程):

  • 加載程序集並實例化實現 - 像以前一樣,但不在測試類中。
  • 創建測試類的實例,注入下一執行。
  • 運行測試。
  • 繼續下一個實現,重複該過程。

(我知道我可以在文件系統周圍洗牌的文件 - 就像把一個裝配在一個位置>運行,加載一個執行測試>替換下一個實現的程序集,然後重複的過程。不過,我想的東西減去原油,如果可能的話)。

我一直在尋找的NUnit測試的車手(一個捷徑控制檯等),但沒有發現至今。有誰知道是否有一種方法可以通過編程控制來實現我想要使用nUnit或任何其他測試套件?或者也許還有另外一種方式可以解決這個問題,那將滿足上面的「我想要的」標準嗎?

+0

您可能想考慮使用'TestCaseSource'屬性來提供您想要測試的類的類型/實例。你需要加載程序集等,但是NUnit會爲你處理其餘的管道工作。 http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9 – forsvarir

+0

'TestCaseSource'是一個選項,我同意,但是不會達到_running每個測試的目標 - 一個實現,然後繼續下一個實現,重複process_。由於沒有得到一個很好的解決方案來實現'IAddin'和'ISuiteBuilder',我目前正在研究看起來很有前途的'SuiteAttribute'。 –

回答

0

我結束了使用NUnit的SuiteAttribute

這種方法涉及到創建「傘類」,比如:

namespace Validator { 

    public class AllTests { 

     [Suite] 
     public static IEnumerable Suite { 
      get { 
       var directory = @"[ImplementationAssembliesPath]"; 
       var suite = new ArrayList(); 

       // GetInstances is a method responsible for loading the 
       // assemblys and instantiating the implementations to be tested. 
       foreach (var instance in GetInstances(directory)) { 
        suite.Add(GetResolvedTest(instance)); 
       } 
       return suite; 
      } 
     } 

     // This part is crucial - this is where I get to inject the 
     // implementations to the test. 
     private static Object GetResolvedTest(ICalculator instance) { 
      return new CalculatorTests {Calculator = instance}; 
     } 

     [...] 

} 

注意,測試類有注入我想實現的屬性。我選擇屬性注入是因爲測試運行者通常不喜歡默認的構造函數。但是,我不得不從實際測試類中刪除TestFixtureAttribute(這裏省略),以免混淆控制檯運行程序的運行。

然後我創建了一個簡單的控制檯應用程序與/fixture參數運行NUnit的控制檯 - 亞軍:

namespace TestRunner { 

    using System; 
    using NUnit.ConsoleRunner; 

    internal class Program { 

     private static void Main(String[] args) { 
      var testDllPath = @"[TestAssemblyPath]/Validator.dll"; 
      var processArgument = @"/process=Separate"; 
      var domainArgument = @"/domain=Multiple"; 
      var runtimeArgument = @"/framework=4.5"; 
      var shadowArgument = @"/noshadow"; 
      var fixtureArgument = String.Format(@"/fixture={0}", "[Namespace].AllTests"); 

      Runner.Main(new[] { 
       testDllPath, 
       processArgument, 
       domainArgument, 
       runtimeArgument, 
       shadowArgument, 
       fixtureArgument 
      }); 

      Console.ReadLine(); 
     } 

    } 

} 

我仍然有興趣聽到這個您的意見,並在替代解決方案。

-1

如果你想測試一組固定的,你不必做花哨的東西像移動組件或指示測試運行組件。

像正常類,您可以使用繼承爲單元測試類。我建議你創建一個抽象基類,爲測試這個接口的實現做繁重的工作。對於接口的每個實現,您可以創建一個從基類繼承的新類。

的基類可以是這樣的:

public class BaseMyInterfaceImplementationTest 
{ 
    protected MyInterface ClassUnderTest; 

    //Add your tests here with the [Test] attribute: 
    [Test] 
    public void TestScenario1() 
    { 
     //do your test on ClassUnderTest 
    } 
} 

和派生類是這樣的:

[TestFixture] 
public class Implementation1Tests : BaseMyInterfaceImplementationTest 
{ 
    [SetUp] 
    public void BaseTestInitialize() 
    { 
     ClassUnderTest = new Implementation1(); 
    } 
} 
+0

這對於爲每個實現運行所有測試(從程序集來說,這不是一個固定的集合,而是需要在運行時加載)有何幫助? –

+0

@OskarLindberg你是對的,我提出的解決方案只有在你有一套固定的實現時才能工作。 –