Как запускать свои тесты в параллелизме на уровне класса только после того, как один из ваших классов завершил свои тесты

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

Итак, у меня всего 10 тестовых классов в моем наборе testNg, и я хочу, чтобы они работали параллельно. Это просто, но проблема в том, что один из моих классов позволяет предположить, что класс Test A не только устанавливает тестовые данные, но и проверяет некоторые функции приложения, поэтому я не могу использовать его в аннотации BeforeSuite или BeforeTest. Тестовые данные, созданные посредством выполнения тестов в этом классе, важны для запуска других тестовых классов, поэтому я действительно ломаю голову, как реализовать параллелизм на уровне класса таким образом, чтобы параллельный запуск начинался только после тестов в разделе «Тесты». Класс завершает свое выполнение.

Сводка

Тест класса А

public class TestsA {

   @BeforeClass
   public setupTestClass(){
   -----some code--------
  }
  @Test
  public test1(){
 ------some code---
}

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

Спасибо


person Sumit Bhatt    schedule 30.05.2020    source источник


Ответы (2)


По умолчанию все методы тестирования будут иметь значение приоритета «0». Поэтому, если вы хотите, чтобы определенный тестовый метод выполнялся перед всеми остальными тестами, вы можете установить приоритет как -1 для этого конкретного теста. Менее приоритетным будет его выполнение в testng. Таким образом, тест с приоритетом -1 предшествует всем остальным тестам с приоритетом «0».

Пример Установка приоритета для одного метода тестирования

public class ClassA {

@Test(priority = -1)
public void b(){
    System.out.println("Test1");
}

@Test
public void a(){
    System.out.println("Test2");
}

}

Пример 2. Установка приоритета для всего класса

@Test(priority = -1)
public class ClassA {


public void b(){
    System.out.println("Test1");
}


public void a(){
    System.out.println("Test2");
}

}

Вывод для обоих примеров:

Тест1

Тест2

person Kishore Mohanavelu    schedule 31.05.2020
comment
О зависимостях OnMethods и dependOnGroups не может быть и речи, так как я хочу, чтобы мой тест мог выполняться независимо, то есть иногда, если я хочу запускать тесты только из класса B, я бы хотел, чтобы мне не приходилось запускать тесты из класса A. Тестовые данные настроенный классом A, должен произойти только один раз для новой среды, после чего другие тесты могут работать независимо. Именно для тех новых настраиваемых сред я хочу решение для параллельного запуска моих тестов. - person Sumit Bhatt; 31.05.2020
comment
@SumitBhatt Пожалуйста, правильно уточните свое требование или вопрос. Вы сказали, что хотите запустить свои тестовые примеры после того, как некоторые тесты изначально прошли в вашем вопросе. Теперь вы говорите, что иногда хотите запускать свои тесты независимо. Оба совершенно разные вещи. Согласно стандартам, вы не должны сохранять настройку тестовых данных как часть тестового сценария. Отделите настройку тестовых данных от тестового примера и переместите ее в метод BeforeSuite. Таким образом, настройка тестовых данных происходит до того, как начнется любой из тестовых случаев. - person Kishore Mohanavelu; 01.06.2020
comment
Я ясно упомянул, что это не просто настройка тестовых данных. Данные создаются как часть тестирования, и для выполнения E2E нам нужно, чтобы эти данные были доступны и для других классов. Дело в том, что если данные есть, они будут там до тех пор, пока кто-то их не удалит. Тесты класса А НЕ БУДУТ СОЗДАВАТЬ ДАННЫЕ, ЕСЛИ ОН УЖЕ ЕСТЬ. Следовательно, мы можем индивидуально запустить любой тестовый класс после завершения первого запуска в новой среде и создания тестовых данных. Вот почему я хочу иметь возможность выполнять тесты из разных классов по отдельности, не имея зависимости от тестов в тестах класса A. - person Sumit Bhatt; 01.06.2020
comment
@SumitBhatt правильно. Итак, давайте предположим, что тестовых данных уже нет. Как вы говорите, другие классы зависят от тестовых данных, созданных классом A, верно? Так это действительно правильная зависимость? Кроме того, почему вы не можете разделить создание тестовых данных как часть BeforeClass, BeforeSuite или BeforeMethod? Потому что единственная цель BeforeClass, BeforeMethod и BeforeSuite — выступать в качестве предварительного условия для тестового примера. Ваше требование звучит как предварительное условие. Пожалуйста, предоставьте более подробную информацию, чтобы мы могли предоставить правильное решение. - person Kishore Mohanavelu; 01.06.2020
comment
Мое требование простое. Я хочу, чтобы сначала выполнялись тесты класса A, а затем другие классы тестов выполнялись параллельно. Есть ли способ добиться этого.? - person Sumit Bhatt; 02.06.2020
comment
@SumitBhatt Я обновил свой ответ на основе вашего последнего комментария. Если это решит вашу проблему, пожалуйста, примите мой ответ. - person Kishore Mohanavelu; 02.06.2020
comment
Я попытался установить приоритет -1 для класса. Это вообще не сработало, потому что класс был создан последним. - person Sumit Bhatt; 02.06.2020

Я нашел решение вышеуказанной проблемы. Все, что мне нужно было сделать, это настроить два разных теста в моем пакете testng.xml. 1-й тест будет иметь только тестовый класс A, а другой тест будет иметь другие тестовые классы, имеющие параллелизм на уровне класса. Поскольку в 1-м тесте есть только один класс, тесты в этом классе будут выполняться первыми. В моем случае Test Class A отвечает за проверку некоторых функций, а также за настройку некоторых данных. Затем следующий тест вашего testng.xml создаст другие классы параллельно.

Ниже показано, как выглядит мой файл testng.xml.


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

    <suite name="Test_Suite_Name" verbose="1" parallel="classes" thread-count="4">
        <test name="TEST_TESTCLASSA" preserve-order="true">
            <parameter name="environment" value="macos"/>
            <groups>
                <run>
                    <include name="Smoke"/>
                    <exclude name="Sanity"/>
                    <exclude name="Exclude"/>
                </run>
            </groups>
            <classes>
                <class name="testpackage.TestClassA"/>
            </classes>
        </test>
        <test name="TEST_OTHER_TESTS" preserve-order="true">
            <parameter name="environment" value="macos"/>
            <groups>
                <run>
                    <include name="Smoke"/>
                    <exclude name="Sanity"/>
                    <exclude name="Exclude"/>
                </run>
            </groups>
            <classes>
                <class name="testpackage.TestClassB"/>
                <class name ="testpackage.TestClassC"/>
                <class name="testpackage.TestClassD"/>
                <class name="testpackage.TestClassE"/>
                <class name="testpackage.TestClassF"/>
                <class name="testpackage.TestClassG"/>
            </classes>
        </test>
    </suite>
person Sumit Bhatt    schedule 02.06.2020