2011-07-03 36 views
0

我正在使用MSTest,一切都很好。不久前,我需要編寫大量數據驅動的單元測試。另外,我在運行它之前需要知道測試的名稱,因此我可以用正確的參數(從外部遠程服務中獲取)填充數據源。如何在執行之前確定單元測試的名稱?

MSTest中沒有任何地方可以找到一種方法來獲取將在實際執行之前運行的測試的名稱。在這一點上,當然已經太晚了,因爲數據源已經填充了。

我需要的是知道將要執行的測試的名稱,以便我們可以在執行之前提前配置它們的數據源。

有人建議我「退房NUnit」。我對NUnit完全無能爲力。目前我已經開始閱讀文檔,但仍然處於虧損狀態。你有什麼建議嗎?

+0

http://www.nunit.org/index.php?p=quickStart&r=2.2.10 - 不學習理論,練習是關鍵 –

回答

0

如果我正確理解你的問題,你想獲得當前正在運行的測試的名稱,以便您可以使用它作爲一個鍵來查找一組數據來填充數據源被測試的代碼。是對的嗎?

如果是這樣的話,我認爲你不需要在你的單元測試框架中尋找特殊的功能。爲什麼不使用Reflection API來獲取當前正在執行的方法的名稱? System.Reflection.MethodBase.GetCurrentMethod()會爲您提供一個代表方法的MethodBase對象,並且該對象具有Name屬性。

但是,我建議使用方法名稱作爲查找適當的測試數據的關鍵是一個壞主意。你會將方法的名稱與你的數據集結合起來,這對我來說就像是一個脆弱的代碼。你需要保持自由來重構你的代碼和方法的名字,而不用擔心這是否會破壞數據庫查找的後臺。

作爲替代方案,爲什麼不考慮creating a custom Attribute,您可以使用它來標記那些需要數據庫查找的測試方法,並使用該屬性的屬性來保存密鑰?

+0

謝謝你的答覆。事實上,你去了我的意圖,但事情並不是那麼簡單。基本上,我需要做的是根據即將運行的測試配置一個DataSource。問題是,那不僅僅是一些數據源 - 它是Ut框架的數據源。它必須填充(!)在測試執行之前(!),否則 - 我錯過了整個點。 – Vitaliy

0

對於這樣的事情,在運行測試之前,您應該依靠夾具來初始化您想要的狀態。

在(任何)測試框架中工作的最簡單的方法是創建一個裝載數據標識爲(字符串)的任何數據的夾具。然後在每個測試案例中,您只需提供用於數據查找的測試字符串,以獲取該測試中需要的數據。

除此之外,建議不要讓單元測試訪問文件和其他外部資源,因爲這意味着單元測試更慢,失敗的可能性更高(因爲您依賴的是內存代碼以外的內容)。這當然取決於你所擁有的數據量和你正在做的測試類型,但是我通常會爲單元測試編譯數據。

1

如果你真的需要測試的名字 - 它沒有很好的記載,但NUnit的暴露了一個功能,讓您可以訪問當前的測試信息:

namespace NUnitOutput.Example 
{ 
    using NUnit.Framework; 

    [TestFixture] 
    public class Demo 
    { 
     [Test] 
     public void WhatsMyName() 
     { 
      Console.WriteLine(TestContext.CurrentContext.Test.FullName); 
      Console.WriteLine(TestContext.CurrentContext.Test.Name); 
     } 
    } 
} 

提供:

NUnitOutput.Example.Demo.WhatsMyName 
WhatsMyName 

請注意,此功能不保證由自定義TestRunner實現,如ReSharper。我在NUnit的2.5.9測試了這個(nunit.exe和NUnit-console.exe)

然而,重新閱讀你的問題,我想你應該看看是TestCaseSourceTestCase的屬性,可以用於參數化您的測試。

+0

對於TestCaseSource和TestCase爲+1 – Pedro

相關問題