gpt4 book ai didi

java - 当我有一个使用 @RunWith 的测试套件时,如何获得更多日志记录反馈?

转载 作者:太空宇宙 更新时间:2023-11-04 14:55:45 26 4
gpt4 key购买 nike

我有一个自定义测试运行程序来运行部分测试,以便我可以将测试分布在不同的 jenkins 节点上。如果运行所有集成测试,则需要一个小时。所以我有 3 台服务器运行 1/3 的测试,总共只需要 20 分钟。这是我的套房的样子:

import junit.framework.JUnit4TestAdapter;
import junit.framework.TestSuite;
import org.junit.Ignore;
import org.junit.extensions.cpsuite.ClassesFinder;
import org.junit.extensions.cpsuite.ClasspathFinderFactory;
import org.junit.extensions.cpsuite.SuiteType;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@RunWith(AllTests.class)
public class DistributedIntegrationTestRunner {

private static Logger log = LoggerFactory.getLogger(DistributedIntegrationTestRunner.class);

public static TestSuite suite() {
TestSuite suite = new TestSuite();

ClassesFinder classesFinder = new ClasspathFinderFactory().create(true,
new String[]{".*IntegrationTest.*"},
new SuiteType[]{SuiteType.TEST_CLASSES},
new Class[]{Object.class},
new Class[]{},
"java.class.path");

int nodeNumber = systemPropertyInteger("node.number", "0");
int totalNodes = systemPropertyInteger("total.nodes", "1");

List<Class<?>> allTestsSorted = getAllTestsSorted(classesFinder);
allTestsSorted = filterIgnoredTests(allTestsSorted);
List<Class<?>> myTests = getMyTests(allTestsSorted, nodeNumber, totalNodes);
log.info("There are " + allTestsSorted.size() + " tests to choose from and I'm going to run " + myTests.size() + " of them.");
for (Class<?> myTest : myTests) {
log.info("I will run " + myTest.getName());
suite.addTest(new JUnit4TestAdapter(myTest));
}

return suite;
}

private static int systemPropertyInteger(String propertyKey, String defaultValue) {
String slaveNumberString = System.getProperty(propertyKey, defaultValue);
return Integer.parseInt(slaveNumberString);
}

private static List<Class<?>> filterIgnoredTests(List<Class<?>> allTestsSorted) {
ArrayList<Class<?>> filteredTests = new ArrayList<Class<?>>();
for (Class<?> aTest : allTestsSorted) {
if (aTest.getAnnotation(Ignore.class) == null) {
filteredTests.add(aTest);
}
}
return filteredTests;
}

/*
TODO: make this algorithm less naive. Sort each test by run duration as described here: http://blog.tradeshift.com/just-add-servers/
*/
private static List<Class<?>> getAllTestsSorted(ClassesFinder classesFinder) {
List<Class<?>> allTests = classesFinder.find();
Collections.sort(allTests, new Comparator<Class<?>>() {
@Override
public int compare(Class<?> o1, Class<?> o2) {
return o1.getSimpleName().compareTo(o2.getSimpleName());
}
});
return allTests;
}

private static List<Class<?>> getMyTests(List<Class<?>> allTests, int nodeNumber, int totalNodes) {
List<Class<?>> myTests = new ArrayList<Class<?>>();

for (int i = 0; i < allTests.size(); i++) {
Class<?> thisTest = allTests.get(i);
if (i % totalNodes == nodeNumber) {
myTests.add(thisTest);
}
}

return myTests;
}
}

这种方法是有效的,除了当我尝试在不同模块中使用多个 DistibutedIntegrationTestRunner 并同时运行它们时,“事情不起作用”。通常我不会在 SO 上发布含糊不清的提示,但很难弄清楚更多信息,因为这段代码没有提供太多反馈。这是我得到的唯一日志记录:

        log.info("There are " + allTestsSorted.size() + " tests to choose from and I'm going to run " + myTests.size() + " of them.");
for (Class<?> myTest : myTests) {
log.info("I will run " + myTest.getName());

这发生在任何测试运行之前。如果我能获得比这更多的日志记录,那将非常有用。例如,如果我可以在测试运行之前正确打印出“I'm about to run FooTest”,这将非常有用。有什么办法可以做到这一点吗?

我浏览了源代码,发现org.junit.internal.runners.JUnit38ClassRunner中有一个名为private final RunNotifier fNotifier;的字段,但我不确定如何融入其中,或者我是否会朝着正确的方向前进。

我正在使用 JUnit 4.10,但如果需要我可以升级。

最佳答案

对我来说这看起来像是一个 XY 问题。

日志文件不用于测试。它们用于监视调试。一旦出现失败的测试用例,您需要从考虑测试转向考虑调试。这意味着单独运行失败的测试用例,也许使用调试器。

如果您的测试因无用的失败消息而失败,则表明您的低级别测试覆盖率很差,或者测试用例的诊断消息很差。

关于java - 当我有一个使用 @RunWith 的测试套件时,如何获得更多日志记录反馈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23226162/

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