我有一个奇怪的问题。我有一个单元测试,不断陷入运行模式。当我在调试中运行相同的测试时,没有断点,测试每次都会通过。

基本上,它是一个套接字连接测试。我首先断开套接字,然后尝试重新连接,我试图检查重新连接是否成功。

在连接代码中的某个位置,我检查是否有套接字异常。当发生这种情况时,用户在对话框中呈现某些选择,而连接代码通过自动驾驶,等待决策。

这是挂起系统的autoreetevent。必须通过单元测试中的代码提供。 但是我的问题是,如何在调试模式下传递?是否有特殊的调试模式,从而自动通过Visual Studio自动设置autoreetevents?

编辑

确实是一种竞赛条件。我在断开连接后添加了代码的延迟,它现在正常工作。但它仍然令我奇怪的是,有竞争条件开始。让我通过粘贴一些代码来详细说明。

这是测试代码:

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(),和/或套接字.CLOSE()方法运行IT线程?因此,即使我从断开代码返回值,套接字实际上并没有真正断开连接?

有帮助吗?

解决方案

听起来像竞赛条件。调试代码通常运行大量额外的东西'在引擎盖下',而定时的差异可能会抛出您的测试。

当然没有看到代码,我们真的无法帮助你。

其他提示

最有可能因为穿着线程种族。它们对时序非常敏感,调试构建中的时间将不同。您可以使用像Chess这样的工具来锻炼这样的错误。

但首先使用工具+附加到过程。调试+分解所有,调试+ Windows +线程并查看线程调用堆栈。您可能能够看到比赛或死锁的原因。

有一个类似的问题一次,我在其中比较了两个日期,并预计之后的一个日期,但因为它被快速执行,他们收到了相同的时间戳。

此测试正在告诉您,您的代码未正确隔离您正在使用的套接字库。您正在测试的代码不必依赖于在此库中的某些伪像。您需要在套接字库之间添加一个抽象,该库将工件置于ACoount。

我说的是,如果套接字实际断开123,251次数<100毫秒,则是什么原因,但是123,252ND断开连接需要101毫秒。

我强烈推荐几乎所有的单位测试代码都不使用线程。我将在我的单元测试中查看任何类型的线程调用作为代码气味。通常在我想看到线程问题的地方处于集成级别。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top