Запуск нескольких тестов JUnit — не повторять, если сбой произошел один раз

Сейчас я нахожусь в проекте, который использует JUnit в качестве основы для тестирования инженерных данных (ссылка: последний вопрос Создание проекта создания отчетов Java -- хотелось бы использовать JUnit и Ant, но не знаю, как это сделать)

Поскольку изображение (ошибка блока кода) содержит 1000 слов, позвольте мне вставить цикл:

JUnitCore junit = new JUnitCore();
RunListener listener = new RunListener();
junit.addListener(listener);

[...]

for (AbstractFault fault : faultLog) {
    theFault = fault;
    Result result = junit.run(GearAndBrakeFaultLogReports.class);

    for (Failure f : result.getFailures()) {
        output.println(log.getName());
        output.println(fault.getName());
        output.println(HelperFunctions.splitCamelCase(f.getDescription()
                .getMethodName()));
        output.println(f.getMessage());
        output.println();
    }
}

Как видите, я запускаю "junit.run" много раз (для каждой ошибки в журнале).

Однако, если какой-либо из моих тестов сработает с ошибкой(), я не хочу повторять этот тест. Другими словами, если в журнале 50 ошибок, а в ошибке № 1 тест не проходит, я не хочу пытаться выполнить этот тест из 49 будущих ошибок, которые я просматриваю.

Вот пример теста:

private static boolean LeftMLGDownTooLongFound = false;
@Test
public final void testLeftMLGDownTooLong() {
if (!LeftMLGDownTooLongFound 
        && handleLDGReportFaults(false)
        && theFault.getName().equals(FaultNames.LDG_LG_DWN_TIME.toString())) {

        assertNotGreater(getPCandRecNum(), 8f, ldgFault.getLeftStrutUpTime());
        LeftMLGDownTooLongFound = true;
    }
}

В настоящее время для этого я создаю static bool, который сначала имеет значение false, но переключается на true после первого утверждения. Не уверен, что это работает, но это идея. Я не хочу делать это для каждого теста (100 из них).

Есть ли какая-либо общедоступная функция, метод или способ в классе JUnitCore или Runner, который я могу пометить, чтобы тест никогда не запускался более одного раза после вызова fail()?


person E.S.    schedule 30.05.2013    source источник
comment
Просто комментарий здесь, вы, вероятно, захотите взглянуть на @Parameterized (github.com/junit-team/junit/blob/master/src/main/java/org/junit/). Это может быть лучшим подходом, чем запуск JUnitCore несколько раз.   -  person Matthew Farwell    schedule 31.05.2013


Ответы (2)


А, разобрался. Для этого мне нужно реализовать способ поиска неудачных тестов, а затем в области @Before удалить тест. Вот что я добавил.

@Rule public TestName name = new TestName();
@Before
public void testNonFailedOnly() {
    Assume.assumeTrue(!failedTests.contains(name.getMethodName()));
}
private static List<String> failedTests = new ArrayList<String>(256);

@Rule
public TestWatcher watchman = new TestWatcher() {
    /* (non-Javadoc)
     * @see org.junit.rules.TestWatcher#failed(java.lang.Throwable, org.junit.runner.Description)
     */
    @Override
    protected void failed(Throwable e, Description description) {
        super.failed(e, description);
        failedTests.add(description.getMethodName());
    }
};

Это добавляет около 1,5 секунд накладных расходов, что отстой... но лучше, чем альтернатива!!

У кого-нибудь есть идеи, как это оптимизировать? Я считаю, что накладные расходы связаны с TestWatcher, не думайте, что это связано с массивом.

person E.S.    schedule 31.05.2013

Я использовал класс Java, который каждый тест extends. В @Before этого класса я устанавливаю логическое значение hasPassed = false; В конце каждого @Test метода я устанавливаю эту переменную hasPassed = true; В @AfterMethod вы можете проверить переменную. Если ваш тест вызывает исключение, он не достигнет конца, а переменная по-прежнему будет ложной.

person MushyPeas    schedule 17.07.2013