2017-02-22 6 views
2

Мне нравится выполнять мои тесты, отфильтрованные методами, а также группами. Возможно ли это в TestNG?Выполнение TestNG методами, а также группами

Например. У меня ниже двух классов TestNG с двумя методами.

Class - SampleJ1 
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5 
Class - SampleJ2 
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5 

Моя система автоматизации генерирует XML-файл TestNG. Если я создам XML-файл с данными ниже, он должен выполнять только группу здравомыслия упомянутых методов.

<groups> 
    <run> 
    <include name="sanity" /> 
    </run> 
</groups> 
<test thread-count="12" name="Browser"> 
    <classes> 
    <class name="SampleJ1"> 
     <include method="Test1"/> 
     <include method="Test2"/> 
     <include method="Test3"/> 
     <include method="Test4"/> 
    </class> 
    <class name="SampleJ2"> 
     <include method="Test1"/> 
     <include method="Test2"/> 
     <include method="Test3"/> 
     <include method="Test4"/> 
    </class> 
    </classes> 
</test> 

Пожалуйста, дайте мне знать, если это возможно.

+0

Какое ожидаемое поведение? В вашем текущем файле пакета есть все, поэтому все будет запущено. – juherr

+0

Я. На самом деле он будет выполнять любые методы, которые я включил. ИЛИ, он будет выполнять то, что когда-либо группы, о которых я упоминал. Мой вопрос: есть ли способ смешать оба? Здесь, в этом примере, мне нравится выполнять только групповую здравомыслие для методов, которые я включил. – Jeyabal

+0

@ Джейбал, вы используете Maven? –

ответ

0

Насколько я понимаю, вы хотите отфильтровать методы тестирования для выполнения их именами и группами, к которым они принадлежат. Во-первых, нет специального решения для этого в чистом TestNG (в противном случае некоторые эксперты TestNG, такие как @juherr, ответили бы). Пропуск методов тестирования с реализацией InvokedMethodListener оставил бы журналы, которые вы, вероятно, не хотите.

Я вижу два варианта.

В первом случае вы можете реализовать метод @Factory, который может создавать тестовые классы с помощью Set<Method> или Set<String> в качестве параметра конструктора. В каждом из ваших тестовых классов вы должны проверить, должен ли выполняться метод (или его представление String) в Set. @Before аннотированные или beforeInvocation методы будут обрабатывать логику, будет ли выполняться данный метод. Кроме того, ваш testng.xml будет указывать <groups> элементов для запуска. Опять же, это может иметь недостаток в том, что вы оставляете Skipped: x в своих журналах и отчетах.

Второй вариант - использовать Maven вместе с его Surefire Plugin. (Если вы не используете какой-либо инструмент сборки, например Gradle или Maven, тогда я уверен, что вы должны попробовать). Когда вы тестируете Maven, вы можете указать, какие группы и какие методы тестирования должны быть выполнены. Ваш pom.xml должно быть так же, как следующее:

<!-- modelVersion, groupId, etc. --> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.19.1</version> 
      <configuration> 
       <suiteXmlFiles> 
        <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile> 
       </suiteXmlFiles> 
      </configuration> 
     </plugin> 
     <!-- (...) --> 
    </plugins> 
    <!-- (...) --> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>org.testng</groupId> 
     <artifactId>testng</artifactId> 
     <version>6.10</version> 
    </dependency> 
    <!-- (...) --> 
</dependencies> 

Скажи, у вас есть тестовый класс вроде этого:

public class TestClass { 

    @Test(groups = {"firstGroup"}) 
    public void firstMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void secondMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void thirdMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void fourthMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 
} 

в вашем testng.xml вы можете поместить информацию, какие группы для выполнения:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Default Suite Name"> 
    <groups> 
     <run> 
      <include name="secondGroup"/> 
     </run> 
    </groups> 
    <test name="Default Test Name"> 
     <classes> 
      <class name="TestClass"/> 
     </classes> 
    </test> 
</suite> 

И затем выполнить цель Maven, чтобы решить, какие методы вы выполняете:

mvn clean -Dtest=TestClass#thirdMethod+secondMethod test 

Синтаксис для нескольких методов и нескольких классов можно найти here.
Выход:

Running TestClass 
secondMethod 
thirdMethod 
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 

Четвертый метод не был выполнен, даже если он принадлежит к secondGroup. Если есть много методов для выполнения, вы можете написать для него собственный скрипт bash.

Невозможно (по крайней мере, для меня) фильтровать группы с помощью Maven и методы с TestNG.

+0

Большое спасибо за такое подробное объяснение. – Jeyabal