2017-02-27 56 views
1

我最近寫了一個測試夾具,它構建了單線程或多線程模式下的測試代碼。NUnit 3:第一次測試超時

但是其中一個測試(A)在構建代理上始終失敗,但僅適用於多線程模式。 通過(B)的測試與失敗的測試(B)之間幾乎沒有區別。

因此,具有兩個夾具屬性的兩個測試變成四個測試,並且只有三個測試中的一個失敗。

在本地運行時,所有四個測試都會執行並在20毫秒內傳遞,因此它在20毫秒和超過5秒的超時之間真的非常巨大。

[TestFixture(MyCodeMode.SingleThreaded)] 
[TestFixture(MyCodeMode.MultiThreaded)] 
[Timeout(5000)] 
public class MyCodeTests { 
    private MyCodeMode _mode; 
    public MyCodeTests(MyCodeMode mode) { 
     _mode = mode; 
    } 
    private MyCode GetSystemUnderTest() { 
     return new MyCode(_mode); 
    } 

    [Test] 
    // this test fails when multi-threaded, passes in single-threaded 
    public void MyTest_A_ThrowsInvalidOperationException() { 
     Assert.Throws<InvalidOperationException>(() => GetSystemUnderTest().Execute(2)); 
    } 

    [Test] 
    // this test passes regardless of mode 
    public void MyTest_B_ThrowsInvalidOperationException() { 
     Assert.Throws<InvalidOperationException>(() => GetSystemUnderTest().Execute(3)); 
    } 
} 

回答

0

MyTest_A_ThrowsInvalidOperationExceptionMyTest_B_ThrowsInvalidOperationException之前按字母順序排序。 和MultiThreadedSingleThreaded之前按字母順序排序。

因此,測試超過了超時時間,因爲它是第一個要執行的代碼,因此將所需的程序集/類型加載到CLR中會產生所有影響。後續測試重新使用已經加載到內存中的類型。

添加OneTimeSetup方法與一些引用所需代碼的代碼將強制加載類型,然後單個測試分叉和測量。

[OneTimeSetup] 
public void EnsureDependenciesHaveBeenLoadedIntoMemoryBeforeStartingTimeout() { 
    new MyCode(); 
} 

生成代理可能有很差的I/O性能(這對於測試的目的是確定的,但增加了一個點球的開銷加載額外的依賴時)。