Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/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
Java 在运行JUnit/TestNG测试套件时,有没有利用多核的“真正”解决方案?_Java_Unit Testing_Testing_Concurrency_Parallel Processing - Fatal编程技术网

Java 在运行JUnit/TestNG测试套件时,有没有利用多核的“真正”解决方案?

Java 在运行JUnit/TestNG测试套件时,有没有利用多核的“真正”解决方案?,java,unit-testing,testing,concurrency,parallel-processing,Java,Unit Testing,Testing,Concurrency,Parallel Processing,我知道存在对并行运行JUnit或TestNG测试套件的支持,但它需要特定的配置(例如指定线程计数),最重要的是不能防止非线程安全代码中的争用情况 JVM是否有任何工具可以透明地(即,没有显式配置)将单个测试分配给不同的CPU内核(在同一进程或不同进程中使用不同的线程),同时防止争用情况,而不考虑线程安全 如果不存在这样的工具,那么实现一个工具的最佳方法是什么?我的强烈建议是与常用的JUnit/TestNG工具同时运行测试 原因很简单:如果一个测试由于竞争条件而失败,那么该测试已经完美地完成了它的

我知道存在对并行运行JUnit或TestNG测试套件的支持,但它需要特定的配置(例如指定线程计数),最重要的是不能防止非线程安全代码中的争用情况

JVM是否有任何工具可以透明地(即,没有显式配置)将单个测试分配给不同的CPU内核(在同一进程或不同进程中使用不同的线程),同时防止争用情况,而不考虑线程安全


如果不存在这样的工具,那么实现一个工具的最佳方法是什么?

我的强烈建议是与常用的JUnit/TestNG工具同时运行测试

原因很简单:如果一个测试由于竞争条件而失败,那么该测试已经完美地完成了它的工作-它已经识别出您应该修复的设计、代码或并发性假设中的错误


多个测试线程同时使用的任何非线程安全的对象(例如,在全局基础上使用的可变静态单例对象)很可能是一个设计缺陷-您应该使其线程安全,或者每次将其作为本地对象单独初始化。

几个进程将阻止sureYes的竞争条件,显然,但是有没有基于Java的工具可以为JUnit/TestNG测试套件实现这一点?如果这样的并行测试工具可以考虑@ThreadSafe注释,并且只有在注释为@ThreadSafe时才在这些类上运行并行测试,那就太好了。我认为这不是一个非常现实的期望(我甚至不知道它是否可行)。如何为每个核心生成一个JVM并在每个JVM上划分测试?我想知道这会有多快。。。有一件事是肯定的:看到一个16核CPU运行一个测试套件,看到CPU监视器只显示一个活动的内核是可悲的:(@Gugussee:这会很好,但在一般情况下要求使用注释是不现实的。测试中的代码可以使用第三方库,或者测试可以依赖其他测试工具(嘲弄等)…使用单独的JVM实例是一种有效的方法,但可能难以实现并增加大量开销。更好的方法可能是使用自定义类加载器,该加载器为同一JVM实例中的每个线程定义每个类的单独副本。不过,我怀疑没有人尝试过。我完全不同意…OP特别是spe假设它可能会在非线程安全代码中造成问题。您对官方Java API中记录为非线程安全的所有JavaDoc有何看法?您认为有人应该重写它们以便它们都是线程安全的吗?编写非线程安全代码是完全有效的,只要它是这样记录的,并且是一个完美的解决方案OP有一个合理的担忧。我认为你没有抓住重点。我只是想利用多核CPU来加速测试运行。我并不是试图在不是为线程安全设计的代码中检测竞争条件。我只是想说清楚,你写了“如果测试因竞争条件而失败,那么测试已经完美地完成了”这句话在OP的问题中是完全错误的。如果代码被指定为非线程安全的,那么如果它失败了,那么测试就失败得很惨。@gugugussee-编写非线程安全的代码没有错,如果你说它有完整的文档,但是如果你正在测试非线程安全的代码,那么a)您的测试应该分配一个本地实例本身,或者b)您应该实现序列化访问的锁定。这是常见的良好实践,如果你这样做了,那么你就可以并行、安全地运行所有测试。@Rogerio-我当然理解,但是,您应该a)重构测试以创建非线程安全代码的本地实例,或者b)重新审视设计的任何部分,使非线程安全代码在没有适当锁定的情况下全局可访问,这可能是您想要解决的设计缺陷。我坚持我的主张,测试已经完成了它的工作,拿起这个!如何修复它取决于您。。。。。