gpt4 book ai didi

java - 减少 JUnit 输出

转载 作者:行者123 更新时间:2023-11-28 20:28:32 25 4
gpt4 key购买 nike

我正在使用以下方法以编程方式运行 JUnit 测试:

String res = runProcess("java -classpath " + dirPath + ";" + classpath + " org.junit.runner.JUnitCore "+ getClassName(filePath));

private static String runProcess(String command) throws Exception {
Process process = Runtime.getRuntime().exec(command);
String inputStr = IOUtils.toString(process.getInputStream());
process.waitFor();
return inputStr;
}

但是,它会输出很多附加信息,例如失败次数、运行时间和junit信息。

示例输出如下所示:

JUnit version 4.12
.E
Time: 0.011
There was 1 failure:
1) test10(ErrorTestLang)
java.lang.AssertionError: Contract failed: compareTo-equals on fraction1 and fraction4
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.assertTrue(Assert.java:41)
at ErrorTestLang.test10(ErrorTestLang.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
at org.junit.runner.JUnitCore.main(JUnitCore.java:36)

FAILURES!!!
Tests run: 1, Failures: 1

我的目标是在我以编程方式修改 JUnit 测试套件时以编程方式多次运行它,并确保结果仍然相同。也就是说,所有相同的断言都会失败/通过,即使我删除了一些未使用/“死”代码行。

因此,我对输出的部分感兴趣:

java.lang.AssertionError: Contract failed: compareTo-equals on fraction1 and fraction4

因为我会将其与其他结果进行比较,并且不想考虑运行时间或行号等细节。

是否有标志使 JUnit 输出更简洁?

最佳答案

我不认为你可以通过这种方式使 JUnit 更简洁,毕竟你正在运行一个外部 Java 程序,它会产生异常并且该异常会出现在屏幕上。从技术上讲,它甚至不是异常,而是一个 java.lang.Error

org.junit.Assert#fail 是这样实现的:

public static void fail(String message) {
if(message == null) {
throw new AssertionError();
} else {
throw new AssertionError(message);
}
}

当然你会解析流的输出,但让我建议你使用不同的方法:

您可以通过包装器运行它,而不是直接运行 JUnitCore,在这个包装器中,您可以添加一个监听器,它将跟踪测试执行并能够对失败等事件作出 react /执行成功。

有一个概念RunListener在 Junit 中可以处理:

 public class MyWrapperToRun {
public void main(String... args) {
JUnitCore core= new JUnitCore();
core.addListener(new MyWrappingListener());
core.run(MyTestClass.class); // I don't have access to MyTestClass.class
}
}

public class MyWrappingListener implements RunListener {
// react on events emitted by junit in methods of this listener
}

在监听器实现中,您可以将结果存储在文件甚至数据库中以供将来比较。

关于java - 减少 JUnit 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41310260/

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