2015-03-25 98 views
4

我有使用InlineData和MemberData屬性在XUnit中編寫的測試。我想通過我的項目其他地方的代碼運行測試,並使屬性自動填充測試數據,就像通常在VS測試運行器中運行時一樣。如何通過代碼執行XUnit測試

如果不是屬性,我會直接調用方法,就像任何其他常規方法一樣。斷言仍然被檢查並且它的功能正常。但是如果我直接調用具有屬性的方法,則屬性將被忽略,我必須通過代碼手動提供所有測試數據。 XUnit中有沒有某種類型的測試運行器類,我可以重複使用來實現這一點?我一直試圖挖掘他們的API無濟於事。

爲什麼我想這樣做需要一些解釋,但請耐心等待。我正在編寫針對特定接口的測試,而不是他們的具體實現(例如,考慮標準收集接口)。有大量的測試,我不想複製粘貼他們爲每個具體實施者(可能是幾十)。我編寫測試一次,然後將接口的每個具體實現作爲第一個參數傳遞給測試,這是一個要測試的主題。

但是這留下了一個問題。 XUnit看到了測試並希望運行它,但它不能,因爲在該層沒有可用的具體實現,只有界面。所以我想在更高層編寫測試,剛剛添加了具體的實現,然後調用傳入新主題的接口測試。對於只接受1個參數的主題,我可以很容易地做到這一點,但對於使用InlineData或MemberData的測試,我希望重用已提供的測試用例,並將主題添加爲第一個參數。

+0

出於好奇,你爲什麼要自己打電話給測試方法? – 2015-03-25 03:57:40

+0

我將解釋添加到問題中,因爲它用了超過幾個字的單詞。我希望這是有道理的,我在這裏尋找。 – 2015-03-25 14:08:01

回答

0

沒關係,我想通了。仔細看看XUnit的屬性層次結構,我發現DataAttributes(InlineData,MemberData等)有一個GetData方法,您可以調用它來檢索它們表示的數據集。通過一點反思,我可以很容易地在我的測試類中找到所有測試,並調用測試方法,如果存在任何存在的數據屬性的get數據方法,並通過我自己的代碼執行測試。如果我必須扮演我自己的版本,那麼GetData部分會更加困難。謝謝XUnit的作者不要逼我這麼做。

2

可供參考的是xUnit.net項目中的GitHub問題How to programmatically run XUnit tests

該類別AssemblyRunnernow part of Xunit.Runner.Utility

從關聯的問題,xUnit.net撰稿人Brad Wilson在samples.xunit project on GitHub中提供了sample runner。該程序演示了該問題中描述的技術。也就是說,負責運行測試後,他們已被發現是因爲部分如下:

using (var runner = AssemblyRunner.WithAppDomain(testAssembly)) 
    { 
     runner.OnDiscoveryComplete = OnDiscoveryComplete; 
     runner.OnExecutionComplete = OnExecutionComplete; 
     runner.OnTestFailed = OnTestFailed; 
     runner.OnTestSkipped = OnTestSkipped; 

     Console.WriteLine("Discovering..."); 
     runner.Start(typeName); 

     finished.WaitOne(); // A ManualResetEvent 
     finished.Dispose(); 

     return result; 
    } 

對於更深的下潛,他描述了使用XunitFrontControllerTestDiscoveryVisitor找到並運行測試的方法。這是AssemblyRunner的實施。