2016-01-11 3 views
0

У меня есть тест A, который программно запускает еще один тест B, а тест A проходит только в том случае, если тест B терпит неудачу. Я хочу, чтобы сборка была успешной только тогда, когда проходит тест A.Тестирование TestNG-слушатели

Точно, я внедрил слушателя TestNG (MyListener). Мне нужно проверить, правильно ли он обрабатывает результаты неудачных тестов. Единственный подход к тестированию, по-видимому, имеет тест A (testListener), который запускает другой тест B (AlwaysFailingTest) programmatically и проверяет результаты.

@Test 
public void testListener() { 
    System.setProperty("knownBugs", "execute"); 
    tla = new TestListenerAdapter(); 
    TestNG testng = new TestNG(); 
    testng.setTestClasses(new Class[]{AlwaysFailingTest.class}); 
    testng.addListener(tla); 
    testng.addListener(new MyListener()); 
    testng.run(); 
    assertThat(tla.getSkippedTests().size(), equalTo(0)); 
    assertThat(tla.getFailedTests().size(), equalTo(1)); 
    assertThat(tla.getPassedTests().size(), equalTo(0)); 
} 

Однако, я не хочу, чтобы тест не срабатывал, чтобы повлиять на результаты тестирования моей библиотеки. В настоящее время для mvn clean test это так:

Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.407 sec <<< FAILURE! 
shouldAlwaysFail(com.testing.listeners.MyListenerTest$AlwaysFailingTest) Time elapsed: 0.01 sec <<< FAILURE! 
java.lang.AssertionError: Failing as always 
     at org.testng.Assert.fail(Assert.java:94) 
     at com.testing.listeners.MyListenerTest$AlwaysFailingTest.shouldAlwaysFail(MyListenerTest.java:99) 

testListener() метод проходит, это замечательно, но почему результаты AlwaysFailingTest появляются в результатах тестирования библиотеки, я не понимаю. Как я могу избежать этого?

Я перечислил полный код MyListener и MyListenerTesthere.

+0

Не могли бы вы поделиться более полным примером (через сущность?)? Трудно следовать. – juherr

+0

@juherr: Спасибо. Я перечислил полный код 'MyListener' и' MyListenerTest' здесь: https://gist.github.com/dzieciou/1addcc19e0d465afa3e8 – dzieciou

+0

Вы должны посмотреть на arquillian-Governor http://arquillian.org/blog/2015/12/13/arquillian-Governor-1-0-1-Final/ – juherr

ответ

0

Почему вы не используете атрибут «ожидаемые значения» аннотации @Test, чтобы тест ожидал, что он всегда будет FAIL и не остановит ваше выполнение.

@Test(expectedExceptions=AssertionError.class) 
    public void test(){ 
     Assert.fail(); 
    } 
+0

Потому что тогда следующее утверждение не сработает: 'assertThat (tla.getFailedTests(). Size(), equalTo (1));'. – dzieciou

+0

вы можете принять это утверждение из этого места :) –

+0

Это ерунда. Цель этого утверждения состоит в том, чтобы убедиться, что для данного конкретного случая Listener не изменяет число неудачных тестов. – dzieciou

1

shouldAlwaysFail в настоящее время выполняется дважды: один раз в основной набор тестов и один раз программно с помощью теста testListener. Поскольку он всегда терпит неудачу, результаты основного тестового набора будут содержать сбой. Чтобы исправить это, вы можете исключить тест shouldAlwaysFail из основного набора тестов, чтобы он запускался программно только с помощью теста testListener.

Вы можете настроить Maven Surefire исключить тест:

<project> 
    [...] 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.19.1</version> 
     <configuration> 
      <excludes> 
      <exclude>**/AlwaysFailingTest.java</exclude> 
      </excludes> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    [...] 
</project> 

Или настроить TestNG, чтобы исключить тест:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 

<suite name="SuiteName" verbose="1"> 
    <test name="TestName"> 
     <packages> 
      <package name="com.testing.listeners"/> 
     </packages> 
     <classes> 
      <class name="com.testing.listeners.AlwaysFailingTest"> 
       <methods> 
        <exclude name="shouldAlwaysFail"/> 
       </methods> 
      </class> 
     </classes> 
    </test> 
</suite> 

См Maven Surefire Plugin – Inclusions and Exclusions of Tests и/или TestNG Documentation - 3 - testng.xml для более подробной информации.

+0

Исключение AlwaysFailingTest не работает, потому что он запускается программным путем методом 'testListener()', а не SureFire напрямую. – dzieciou

+0

Позвольте пояснить, у меня есть тест A, который запускает еще один тест B, и тест A будет проходить только в том случае, если тест B завершится неудачей. Я хочу, чтобы сборка была успешной только тогда, когда проходит тест A. – dzieciou

+0

@dzieciou Я изначально пренебрег объяснением в своем ответе, почему вы получаете отказ теста в результатах теста. Я обновил свой ответ такими. Исключение 'AlwaysFailingTest' должно работать, потому что оно исключает его из основного пакета, а не« подсетей », который вы создаете при программном запуске' testListener'. – mfulton26

Смежные вопросы