Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Может ли Junit-тест возвращать значение?

maven
junit
java
Теги: #<Tag:0x00007f7b61ca1370> #<Tag:0x00007f7b61ca0fd8> #<Tag:0x00007f7b61ca0948>

(Sergey356) #1

Доброго времени суток!

Пишу автотесты на Java с использованием WebDriver. Написал несколько тестов и объеденил их всех в один общий тест. 

Пишу в Eclipse. В итоге получилось так: 

Когда Junit берет очередной тест и начинает выполнять, по итогам работы он либо помечает его как "успешно выполнен", либо "Errors". 

Хотелось бы узнать, если ли какой нибудь способ получать значение которое возвращает Junit? Например TRUE - в случае если тест прошел успешно и FALSE - в случае ошибки? Это мне пригодилось бы для итогового отчета, типа:

Тест 1 - пройден успешно

Тест 2- пройден успешно

Тест 3- есть ошибки

...

Тест N - пройден успешно

 


(Mykhailo Poliarush) #2

программно никогда этого не вытягивал, но надо смотреть в сторону org.junit.runner.Result

http://kentbeck.github.com/junit/javadoc/latest/org/junit/runner/Result.html

т.е. надо запускать тесты через runner и тогда через этот же runner можно будет вытащить результаты


(Дмитрий Жарий) #3

 

Скажу, что с Junit не знаком, но возможно это поможет. 
 
Возможно, поможет создание класса “MyTestCase extends TestCase”, в котором бы вы могли переопределить метод tearDown(). 
и сделать MyTestCase базовым для всех тесткейсов.
 
http://www.junit.org/apidocs/junit/framework/TestCase.html
 
Тогда, по моей гипотезе, из него вы могли бы достучатся до TestResult и залогировать что необходимо:
http://www.junit.org/apidocs/junit/framework/TestResult.html
 

(Linux5) #4

А что мешает смотреть хml файл с результатами который формируют тесты? или использоватт bamboo или тим сити или еще какой сборщик доя построения красивых отчетов?


(Sergey356) #5

Да, я уже воспользовался таким подходом(создал базовый класс для всех тестов, где переопределял tearDown() и setUp()).

В методе tearDown(), перед строкой: 

driver.quit();

написал

 

TestResult result = new TestResult();
if(result.wasSuccessful()) System.out.println("Тест №"+id+" успешно выполнен!");
  else System.out.println("Тест №"+id+" завершен с ошибками");
 
На сколько я понял из статьи http://www.junit.org/apidocs/junit/framework/TestResult.html  - wasSuccessful() - должен возвращать результат: прошел ли весь тест с ошибками или нет. Тем не менее при любом раскладе(даже если тест провалился) мне wasSuccessful() возвращает True. Где может быть подводный камень?

(Дмитрий Жарий) #6

попробуйте failureCount() > 0


(Sergey356) #7

Попробовал. Не помогло.

Попробовал также result.errorCount() >0. Результат тот же.

Я решил проверить, что возвращают эти методы?

public void tearDown() throws Exception {

TestResult result = new TestResult();
System.out.println(result.runCount());
....
 
Результаты меня не удивили:) Все по нулям:)

(Sergey356) #8

А где можно посомтреть этот файл? Я недавно начал работать с Junit и не все знаю:)


(Дмитрий Жарий) #9

 

Упс. А вам не нужно создавать объект.
TestResult result = new TestResult();
Инача он всегда будет по нулям. С дефолтными значениями. 
Вам этот объект нужно получить откуда-то извне. От runner, или откуда-то еще. 
Тут я, к сожалению,  помочь не могу. 
 

(Mykhailo Poliarush) #10

для того чтобы достучаться к результатам прогона программно, надо программно запускать тесты, как я и сказал в комменте

Дима правильно указал, что не нужно заново создавать экземпляр класса

JUnitCore.runClasses() возвращает объект org.junit.runner.Result, где и можно узнать ваш результат

вот пример 

package de.vogella.junit.first;

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class MyTestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(MyClassTest.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
}
}

ну и ссылочку в придачу http://www.vogella.com/articles/JUnit/article.html


(Mykhailo Poliarush) #11

сама xml где выглядит следующим образом 

 

<testsuite>
    <testcase classname="foo" name="ASuccessfulTest"/>
    <testcase classname="foo" name="AnotherSuccessfulTest"/>
    <testcase classname="foo" name="AFailingTest">
        <failure type="NotEnoughFoo"> details about failure </failure>
    </testcase>
</testsuite>

(Mykhailo Poliarush) #12

ну и действительно вопрос, зачем вам это если можно воспользоваться другими инструментами, которые собирают данные за вас?


(Sergey356) #13

Вопрос действительно хороший:) Изучив некоторые инструменты, я решил не изобретать велосипед, а использовать туже Бамбу:)


(Mykhailo Poliarush) #14

:) стать на путь верный - это правильный выбор

удачи! надеюсь в бамбу все получиться!