2016-06-16 58 views
1

一些上下文第一:我正在一個mutation testing tool for C# + NUnit,和用於速度的緣故我 使用內部類的NUnit 2.6.4核心組件( RemoteTestRunner)至run tests(請參閱底部的DoTests方法)放在單獨的AppDomain中。無限循環使用RemoteTestRunner當與最優化的單元測試代碼

問題: 我有一個單元測試,輪詢變量,直到它變爲非空。這個變量是一個字典賦值爲空,然後通過定時器觸發的動作重新分配給一個真正的字典。當用代碼優化構建測試程序集時,它永遠不會結束。有問題的代碼:

[Test] 
public void WeirdOne() 
{ 
    using (var accumulator = new Accumulator<string>(5, TimeSpan.FromMilliseconds(500))) 
    { 
     Dictionary<int, string> pack = null; 
     accumulator.NewPack += p => pack = p; 
     accumulator.Add("D"); 
     accumulator.Add("A"); 
     accumulator.Add("M"); 
     accumulator.Add("N"); 

     while (pack == null) ; 

     Assert.That(pack.Count, Is.EqualTo(4)); 
    } 
} 

Here如果需要,可以使用Accumulator實現。

我發現

  • 如果我把while環(帶Thread.SleepWriteLine測試)裏面的東西,那我也沒在運行測試結束
  • 更多問題如果我通過Accumulator.Add方法觸發NewPack動作,測試進行到底
  • 只是爲了確保定時器能夠有效地完成工作,我試圖添加一個File.Create()之前致電NewPack行動。該文件被創建,有或無代碼優化
  • 沒有問題時,啓動與NUnit控制檯(2.6.2/2.6.4),有或沒有優化

因爲NUnit的可以啓動這個並進入最後,我懷疑我在實例化所有RemoteTestRunnner的環境時丟失了一些東西。

有沒有人遇到過這種調試/發佈構建問題?任何關於我失蹤的主角?

感謝您的閱讀!

編輯:正如指出的阿列克謝L.

定義這個變量作爲實例字段並將其標記爲揮發性

避免無限循環,但仍然沒有一絲關於如何nunit-說出來

回答

2

也許處理器緩存packnull控制檯的工作。嘗試定義這個變量,實例字段並將其標記爲volatile(是在安全方面)。雖然這並不能解釋爲什麼沒有問題時,啓動與NUnit控制檯(2.6.2/2.6.4),有或沒有優化