我的连接处理代码中有错误情况。此错误导致我的服务器冻结,但随机,在某些请求。请求是相同的,这很重要。让我们说其中25%导致服务器冻结。
这里有一个问题:当且仅当第一次 TEST 请求发出时,服务器才会冻结。在无数次后续 TEST 请求中,它不会失败......这非常重要:只有在使用我的单元测试进行测试时才会发生。
我的测试只运行DirectoryEntry
查询。它创建n
DirectoryEntry
个对象,查询它们,然后在每个对象上调用Close
,然后重复m
次过程。
如果失败,则在第一次查询时失败。
但是,如果我连接像LdapAdmin这样的真实LDAP客户端,它的行为就完全不同了!服务器崩溃的可能性非常高,超过50%。显然,真正的客户端在连接时做了不同的事情,显然,甚至我的C#测试代码也会做那个崩溃的事情,但这只是第一次。我的后续测试查询根本不测试服务器。他们对检测"客户连接"的效率为零。冻结。
现在我通过手动运行我的测试" exe"来测试它。档案好几次。 8次尝试后,捕获冻结的可能性接近100%。现在我希望我的单元测试能够为我做到这一点 - 如果它被冻结一次,那么违规行为会让你说8次并失败。
不幸的是 - 连接客户端的状态在应用程序启动和后续调用时是不同的。我的问题是什么是完全不同的?我测试过它不是测试中的服务器。我可以通过从外部客户端连接它来随时崩溃。第一次尝试 - 成功,客户端连接,客户端可以尝试DDOS我的服务器,祝你好运,它没有发生。但后来我再次尝试连接,服务器死机。我尝试在我的测试中模拟这种行为,但我失败了。要么我在第一次尝试时检测到崩溃,要么我获得了无数次成功的连接。我需要一种方法来真正重置我的测试客户端,因此它们的行为就像是第一次连接到我的服务器的新客户端应用程序。 Close
的{{1}}和Dispose
方法无法实现该目标,或涉及其他内容。
没有代码示例,因为DirectoryEntry
查询是一行的。我的测试应该只是执行这样的查询,但也应该在忘记它连接到服务器之后断开连接。我希望每个DirectoryEntry
查询都与应用程序启动时一样新鲜。
BTW,我已经找到了这个特定冻结的原因,现在我希望我的单元测试可以检测到这种情况,以避免代码更改时出现类似问题。
另一个奇怪的发现:当我尝试将10k个客户端连接到我的服务器时 - 它会通过......或者在第一次尝试时失败。
也尝试过:
我等待DirectoryEntry
个Disposed
个事件的事件。没有帮助。仍然没有快乐。为了解冻,我必须多次进行相同的测试。
尝试处理包括测试服务器在内的所有对象,并在测试期间多次重新创建它们。仍然没有快乐。无论是开始失败,还是无论失败多少次迭代都不会失败。