2013-02-03 114 views
2

我使用包含在MonoDevelop的NUnit的測試運行。我有2個必須與靜態資源交互的測試,所以我需要它們連續運行而不是並行運行。我試過使用類似如何防止我的NUnit的測試並行運行有時

static string Locker="foo"; 
[Test] 
public void Test1() 
{ 
    lock(Locker) 
    { 
    //.... 
    } 
} 
[Test] 
public void Test2() 
{ 
    lock(Locker) 
    { 
    //.... 
    } 
} 

雖然這似乎不工作。有沒有其他的方法?

+2

作爲一個側面說明,你不應該鎖定字符串。 –

回答

1

不知道有關MonoDevelop的NUnit的,但是控制檯有command line argument/nothread

應該在MonoDevelop中類似的東西,我認爲

0

你缺少單元測試點。單元測試必須以各種方式獨立。

這意味着執行順序一定不能影響到單元測試結果。

+0

好吧,我可以讓他們獨立,但它需要我的測試是顯著更復雜 – Earlz

+2

@marjan也許你錯過的NUnit的地步!它不是專門用於單元測試。它也是集成和系統測試的有用測試工具,例如http://nadimsaker.blogspot.co.uk/2015/05/specflow-how-to-write-selenium.html 而對於那些測試,而測試順序並不重要,平行試驗是有問題的,所以我覺得這是一個公平的問題。 – ben

+0

我同意@ben。實際上,我們也將它用於集成測試。我的觀點是在測試的情況下,執行順序無關緊要。每一個單元/集成測試都必須獨立。 –

1

而不是直接使用靜態資源,提取到的依賴,並嘲笑它(使用moq或類似的東西)。

這將讓你寫實際的單元測試隔離一段特定的你正在嘗試測試代碼,而無需擔心外部環境。

+0

我來這裏爲了集成測試的原因尋找這個答案。這在這種情況下無濟於事 –

2

我使用這個方法時真正需要(我認爲這是一個壞主意):

using System.Threading; 
private ManualResetEvent FixtureHandle = new ManualResetEvent(true); 
[SetUp] 
public void SetUp() 
{ 
    FixtureHandle.WaitOne(); 
} 
[TearDown] 
public void TearDown() 
{ 
    FixtureHandle.Set(); 
} 
[Test] 
public void Test1() 
{ 
    //only test 
} 
[Test] 
public void Test2() 
{ 
    //only test 
} 
1

對於連續運行測試,最好使用訂單屬性:

static string Locker="foo"; 
[Test, Order(1)] 
public void Test1() 
{ 
    lock(Locker) 
    { 
    //.... 
    } 
} 
[Test, Order(2)] 
public void Test2() 
{ 
    lock(Locker) 
    { 
    //.... 
    } 
}