Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 单元测试基于线程的代码?强制比赛条件_Objective C_Multithreading_Cocoa_Unit Testing - Fatal编程技术网

Objective c 单元测试基于线程的代码?强制比赛条件

Objective c 单元测试基于线程的代码?强制比赛条件,objective-c,multithreading,cocoa,unit-testing,Objective C,Multithreading,Cocoa,Unit Testing,在使用我的应用程序时,我在一些代码中偶然发现了一个竞争条件,它使用NSOperationQueue在用户触发的事件之后异步运行任务。我知道如何修复竞争条件,因为这是一个愚蠢的设计错误,我不想深入研究,但我想用一个测试用例来证明这个错误(这样在进一步优化/重构的过程中它就不会回来了)。这把我难住了。如何测试多线程的东西,特别是当测试的目的是生成竞争条件时 当涉及到线程和单元测试时,有没有人可以链接到我可以参考的参考资料?我对竞态条件的生成特别感兴趣。您必须确保导致竞态条件的事件序列在测试期间实际出

在使用我的应用程序时,我在一些代码中偶然发现了一个竞争条件,它使用
NSOperationQueue
在用户触发的事件之后异步运行任务。我知道如何修复竞争条件,因为这是一个愚蠢的设计错误,我不想深入研究,但我想用一个测试用例来证明这个错误(这样在进一步优化/重构的过程中它就不会回来了)。这把我难住了。如何测试多线程的东西,特别是当测试的目的是生成竞争条件时


当涉及到线程和单元测试时,有没有人可以链接到我可以参考的参考资料?我对竞态条件的生成特别感兴趣。

您必须确保导致竞态条件的事件序列在测试期间实际出现。为此,您需要影响测试用例内部的线程交错

您可以通过附加的(有条件的)同步,或者(更简单、更不可靠的)附加计时器来实现这一点。将一些sleep()调用放入关键部分,以确保它们运行足够长的时间,使另一个线程达到不希望的状态。当你有工作,取代睡眠调用显式同步(即阻止一个线程,直到另一个真正承认已经到达)


然后将所有这些都设置为测试用例设置的全局标志。

我假定您会模拟任何共享数据结构,并且在模拟对象中,您可以进行任何同步,以使不同的线程以“错误”的方式执行老实说,我不认为将实际的生产代码与这个特定的测试紧密耦合是一个好主意。这意味着您需要小心,不要在重构代码时破坏这种耦合,这就破坏了首先进行此测试的意义。重构实际上支持这种测试方法。重构时,您必须重新考虑竞争条件。然后,你可能会发现重构实际上引入了新的竞争条件,或者它以前易受攻击的竞争条件不可能再发生了。我只是不明白这如何“迫使”任何重构者重新考虑潜在的竞争条件,或者这样做实际上是有用的。显然,第一次考虑比赛条件是行不通的。任何对代码进行重大重构的人要么必须完全抛弃现有的测试代码并编写新的测试代码,要么使测试代码变得无用。无论哪种方式,它都无法达到编写测试代码的目的。更好的做法是让测试代码不污染主代码库,而是将构建标记为已损坏(如果已损坏)。对于竞争条件,让测试用例检测它是不可行的。在测试过程中,竞争条件将永远不会出现。