2

奇妙な問題があります。実行モードでスタックし続ける単体テストがあります。ブレークポイントなしでデバッグで同じテストを実行すると、テストは毎回合格します。

基本的にはソケット接続テストです。最初にソケットを切断してから再接続を試み、再接続が成功したかどうかを確認しようとしています。

接続コードのどこかで、ソケット例外があったかどうかを確認します。これが発生すると、ユーザーにはダイアログにいくつかの選択肢が表示され、接続コードはAutoResetEventを介してハングし、決定を待ちます。

システムをハングさせるのはこのAutoResetEventです。単体テストのコードで提供する必要があります。しかし、私の質問は、なぜこれがデバッグモードで通過するのかということです。AutoResetEventsがVisualStudioによって自動的に設定されるデバッグモードについて何か特別なことはありますか?

編集

それは確かに競合状態でした。切断コードの後に​​コードに遅延を追加しましたが、現在は機能しています。しかし、そもそも競合状態があるのは奇妙なことです。コードの一部を貼り付けて詳しく説明します。

これはテストコードです:

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()メソッドがスレッドを実行しているためですか?したがって、切断コードから値を返しても、ソケットは実際には切断されていませんか?

4

4 に答える 4

2

競合状態のように聞こえます。デバッグコードは通常、「内部で」多くの余分なものを実行します。そのタイミングの違いにより、おそらくテストが失敗します。

もちろん、コードを見ずに、私たちは本当にあなたを大いに助けることはできません。

于 2010-07-19T14:54:51.800 に答える
2

おそらくスレッディングレースが原因です。それらはタイミングに非常に敏感であり、デバッグビルドのタイミングは異なります。CHESSのようなツールを使用して、そのようなバグを実行できます。

ただし、最初に[ツール]+[プロセスにアタッチ]を使用します。Debug + Break All、Debug + Windows + Threadsを実行し、スレッド呼び出しスタックを確認します。レースやデッドロックの原因がわかるかもしれません。

于 2010-07-19T14:56:38.963 に答える
1

2つの日付を比較し、次々と日付を期待していたときに同様の問題が発生しましたが、実行速度が速かったため、同じタイムスタンプを受け取りました。

于 2010-07-19T15:03:22.057 に答える
0

このテストは、コードが使用しているソケットライブラリから適切に分離されていないことを示しています。テストするコードは、このライブラリ内の特定のアーティファクトに依存する必要はありません。アーティファクトをacoountに取り込むソケットライブラリ間に抽象化を追加する必要があります。

私がこれを言う理由は、ソケットが実際に123,251回<100 mSecsで切断されたが、123,252回目の切断には101mSecsかかる場合はどうなるかということです。

ほとんどすべての単体テストコードでスレッドを使用しないことを強くお勧めします。私は、ユニットテストであらゆるタイプのスレッド呼び出しをコードの臭いと見なしています。通常、スレッドの問題を確認したいのは統合レベルです。

于 2010-07-19T17:09:28.280 に答える