gpt4 book ai didi

java - JUnit:是否有执行并行测试的聪明方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:20 26 4
gpt4 key购买 nike

在我的 JUnit 测试中,我想执行并行测试。

我的初稿不工作:

@Test
public void parallelTestNotOk() {
ExecutorService executor = Executors.newFixedThreadPool(10);
Runnable testcaseNotOk = () -> fail("This failure is not raised.");
IntStream.range(0, 20).forEach(i -> executor.submit(testcaseNotOk));
executor.shutdown();
}

虽然每个 testcaseNotOk 都失败了,但是这个测试用例成功了。为什么?因为fail不是在主线程中调用的,而是在并行线程中调用的?

我的第二稿成功了,因为这个测试用例按预期失败了:

@Test
public void parallelTestOk() throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(10);
Callable<AssertionError> testcaseOk = () -> {
try {
fail("This failure will be raised.");
} catch (AssertionError e) {
return e;
}
return null;
};
List<Callable<AssertionError>> parallelTests = IntStream
.range(0, 20).mapToObj(i -> testcaseOk)
.collect(Collectors.toList());
List<AssertionError> allThrownAssertionErrors = executor.invokeAll(parallelTests)
.stream().map(future -> {
try {
return future.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}).filter(assertionError -> assertionError != null).collect(Collectors.toList());
executor.shutdown();
for (AssertionError e : allThrownAssertionErrors) {
throw e;
}
}

完成以下操作:

  1. testcaseOk 中,将要测试的代码嵌入到 try/catch block 中,并重新抛出每个 AssertionError
  2. parallelTests 包含 20 次 testcaseOk
  3. ExecutorService 执行所有parallelTests
  4. 如果在testcaseOk中抛出一个AssertionError,它将被收集到allThrownAssertionErrors中。
  5. 如果 allThrownAssertionErrors 包含任何 AssertionError,它将被抛出并且测试用例 parallelTestOk() 将失败。否则就可以了。

我的parallelTestOk() 似乎相当复杂。有没有更简单、更智能的方法(不使用 TestNG)?

最佳答案

您的问题是您从不检查 Future 的值以查看是否抛出了异常。

这将正确地使测试失败:

@Test
public void parallelTestWillFail() throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newFixedThreadPool(10);
Runnable testcaseNotOk = () -> fail("This failure IS raised.");
List<Future<?>> futures = IntStream.range(0, 20)
.mapToObj(i -> executor.submit(testcaseNotOk))
.collect(Collectors.toList());
executor.shutdown();
for(Future<?> f : futures){
f.get();
}
}

关于java - JUnit:是否有执行并行测试的聪明方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com