2014-02-11 2 views
0

У меня есть такая конфигурация:Почему maven surefire пытается создать тесты из другой группы?

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.13</version> 

      <configuration> 
       <excludedGroups>integration</excludedGroups> 
       <argLine>-Xmx512m -XX:MaxPermSize=128m</argLine> 
       <systemPropertyVariables> 
        <project.build.directory>${project.build.directory}</project.build.directory> 
       </systemPropertyVariables> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

И тест:

@Test(groups = "integration")//testng 
public class MyTest extends BaseTestForMyTest { 


private final SomeClass sut = new SomeClass(getStuffFromSysPropDefinedForFailSafe());//should fail in surefire. 


@Test(groups = "integration") 
public void someTest() throws IOException { 
    //some code 
} 
} 

Surefire пытается создать экземпляр класса и выходит из строя (не в состоянии нормально, это испытание для отказоустойчивых!). Почему, например, surefire пытается создать экземпляр теста из исключенной группы?

Извините, я не упомянул. Я использую testng

+0

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

+0

Кроме того: если этот тест предназначен для отказоустойчивого плагина, вы должны исключить его из выполнения surefire. Самый простой способ (в соответствии с идеей maven о настройке конфигурации) - переименовать ваш класс из MyTest в MyIT. В качестве альтернативы добавьте его в конфигурацию исполнения surefire. –

ответ

1

Два ответа в одном здесь.

Ответ на первый вопрос «Почему new SomeClass(getStuffFromSysPropDefinedForFailSafe()); называется?»

TestNG создает все тестовые классы перед поиском аннотаций. Я не знаю, является ли это преднамеренным, или если его можно избежать. TestNG готовится к вызову методов @BeforeClass, поэтому он хочет, чтобы объект вызывал метод. При создании экземпляра объекта также создаются экземпляры (в этом случае, sut).

Я вижу, что безоговорочное создание экземпляра каждого тестового класса облегчает жизнь TestNG, и, вероятно, никто никогда не просил о каком-либо другом поведении.


Ответ на второй вопрос (не уверен, если вы на самом деле просят этот) «почему тест бежится?»

Вы не исключили его должным образом. В TestNG параметр groups принимает массив строк, а не одну строку. Попробуйте

@Test(groups = { "Integration" }) 
public class YourTests { 
    @Test(groups = { "ReallySlow" }) 
    public void someTest { 
    // This test is a really slow integration test and is in both groups. 
    } 
} 

не ответ на любой вопрос, который Вы задали, но, надеюсь, интерес к некоторым людям, которые дочитали до этого (плюс я написал это перед некоторыми из ваших вопроса правок):

Чтобы пометить тест JUnit как находящийся в группе, которую исключает плагин surefire, вы должны аннотировать их как находящиеся в категории. JUnit эквивалент кода выше TestNG является:

@Category(IntegrationTest.class) 
public class YourTests { 
    @Category(ReallySlowTest.class) 
    @Test 
    public void someTest { 
    // This test is a really slow integration test and is in both categories. 
    } 
} 

Вы можете прочитать в this dzone article.

Кроме того, вы должны прочитать на failsafe plugin, так как это более подходит для интеграционных тестов.

+0

У меня есть отдельный conf для группы «интеграции» в отказоустойчивом плагине. Я просто не понимаю, почему surefire пытается «коснуться/создать экземпляр», который имеет исключенное имя anno. Поэтому я сообщу позже.Спасибо за imput – Sergey

+0

, поэтому решение не пытается создать smth в полях, просто переместите его на ленивый getters/setter. это работает, спасибо. – Sergey

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