簡體   English   中英

單元測試通過調試,但在運行時掛起

[英]Unit-test passes in Debug, but hangs when Run

我有一個奇怪的問題。 我有一個單元測試,它總是卡在“運行模式”下。 當我在Debug中運行相同的測試且沒有斷點時,該測試每次都會通過。

基本上,這是套接字連接測試。 我首先斷開套接字,然后嘗試重新連接,然后嘗試檢查重新連接是否成功。

在連接代碼中的某個地方,我檢查是否有套接字異常。 發生這種情況時,會在對話框中為用戶提供一些選擇,而連接代碼會通過AutoResetEvent掛起,等待決策。

正是這個AutoResetEvent掛起了系統。 它必須由單元測試中的代碼提供。 但是我的問題是,這如何在調試模式下通過? 通過Visual Studio自動設置AutoResetEvents的調試模式有什么特別之處嗎?

編輯

確實,這是比賽條件。 我在斷開連接代碼之后在代碼中添加了一個延遲,現在它可以工作了。 但這仍然讓我感到奇怪,因為這里有一個比賽條件。 讓我通過粘貼一些代碼來詳細說明。

這是測試代碼:

MySystem.FindEquipment(new List<string>(1) { "192.1.1.243:28000" });
MySystem.ConstructSystem();
MySystem.IsConstructedFlag.WaitOne();
Assert.AreEqual(1, MySystem.CommunicationController.HardwareIPList.Count);

PFFrame frame1 = MySystem.Frames["0.x.x"];

Assert.IsTrue(frame1.Disconnect());
Thread.Sleep(100);
Assert.IsTrue(frame1.Connect());

令我震驚的原因是,我在調用連接代碼之前正在等待diconnect代碼的返回。 斷開連接代碼的最后一部分如下所示:

lclSocket.Shutdown(SocketShutdown.Both);
lclSocket.Close();
OnSocketDisconnected(new PFSocketConnectionEventArgs(ipEp));
return true;

是因為Socket.Shutdown()和/或Socket.Close()方法在線程上運行它嗎? 因此,即使我從斷開連接代碼返回一個值,套接字實際上並沒有真正斷開連接?

聽起來像是比賽條件。 調試代碼通常在“幕后”運行許多額外的東西,並且時間上的差異可能會導致測試失敗。

當然,如果沒有看到代碼,我們真的無法為您提供很大幫助。

最有可能是由於線程競賽。 它們對時序非常敏感,並且Debug版本中的時序會有所不同。 您可以使用CHESS之類的工具來執行此類錯誤。

但是請先使用工具+附加到流程。 調試+全部破壞,調試+ Windows +線程,然后查看線程調用堆棧。 您也許可以查看比賽或僵局的原因。

曾經有一個類似的問題,我比較了兩個日期,並期望一個日期之后的另一個日期,但是由於執行速度如此之快,他們收到了相同的時間戳。

該測試告訴您您的代碼未與所使用的套接字庫正確隔離。 您正在測試的代碼不必依賴於此庫中的某些工件。 您需要在套接字庫之間添加一個抽象,以將工件放入acoount中。

我說這的原因是,如果套接字實際上斷開123,251次<100 mSecs,但是第123,252次斷開需要101 mSecs。

我強烈建議幾乎所有的單元測試代碼都不要使用線程。 我將單元測試中任何類型的線程調用視為代碼氣味。 通常,我希望看到線程問題的地方是集成級別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM