Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Web Testing Automation на Java

Все темы QA

Для чего нужны TestNG/JUnit?

TestNG и JUnit — это популярные фреймворки для юнит-тестирования в Java, которые обеспечивают структуру и поддержку для написания и запуска тестов. Вот основные цели их использования:

  1. Структурирование тестов:

    • Фреймворки предоставляют аннотации и методы для организации тестовых кодов, например, @Test, @Before, @After, @BeforeClass, и @AfterClass.
  2. Управление тестовыми случаями:

    • Позволяют легко определить, какие методы являются тестами, а также управлять их выполнением (например, игнорирование тестов с аннотацией @Ignore).
  3. Поддержка параметризации и группировки тестов:

    • Можно выполнять тесты с различными параметрами и группировать их для специфической отчетности или совместного запуска.
  4. Поддержка зависимостей:

    • Тесты могут быть настроены на выполнение в определенном порядке с учетом зависимостей друг от друга, что полезно для комплексных интеграционных тестов.
  5. Ассерты и исключения:

    • Оба фреймворка предлагают богатые возможности для проверки условий в тестах через ассерты (утверждения) и автоматическую обработку исключений.
  6. Интеграция с другими инструментами:

    • Легко интегрируются с инструментами сборки, такими как Maven и Gradle, а также с инструментами непрерывной интеграции и различными IDE.
  7. Отчетность:

    • Предоставляют подробные отчеты о ходе выполнения тестов и результатах, что упрощает отладку и обеспечение качества.

Оба фреймворка поддерживают параметризацию, расширение и интеграцию со сборкой. TestNG предоставляет группы и зависимости тестов; в JUnit Jupiter есть расширения, динамические и параметризованные тесты. Выбор зависит от проекта; приведённые ниже примеры явно различают JUnit 4 и Jupiter.


Какие инструкции используются в TestNG/JUnit?

TestNG и JUnit предоставляют различные аннотации и инструкции для управления процессом тестирования. Вот основные инструкции, используемые в этих фреймворках:

TestNG:

  1. @Test:

    • Определяет метод как тестовый случай.
  2. @BeforeSuite/@AfterSuite:

    • Методы, помеченные этими аннотациями, выполняются до или после всех тестов в тестовом наборе.
  3. @BeforeTest/@AfterTest:

    • Методы выполняются перед началом или после завершения всех тестов, объявленных в <test> теге в файле testng.xml.
  4. @BeforeClass/@AfterClass:

    • Методы выполняются один раз до начала всех тестов в текущем классе и после завершения всех тестов соответственно.
  5. @BeforeMethod/@AfterMethod:

    • Методы, которые выполняются перед и после каждого тестового метода.
  6. @DataProvider:

    • Метод, который возвращает данные для тестов, обычно используется для параметризации тестов.
  7. @Parameters:

    • Позволяет передавать параметры в тесты из файла testng.xml.
  8. @Listeners:

    • Указывает слушателей событий, таких как логирование или отслеживание выполнения тестов.

JUnit:

  1. @Test:

    • Определяет метод как тестовый случай.
  2. @BeforeClass/@AfterClass (JUnit 4) или @BeforeAll/@AfterAll (JUnit 5):

    • Статические методы, которые выполняются один раз до начала и после завершения всех тестов в классе.
  3. @Before/@After (JUnit 4) или @BeforeEach/@AfterEach (JUnit 5):

    • Методы, которые выполняются перед и после каждого тестового метода.
  4. @Ignore (JUnit 4) или @Disabled (JUnit 5):

    • Исключает метод из тестового прогона.
  5. @ParameterizedTest (JUnit 5):

    • Определяет параметризованный тест, который запускается несколько раз с различными аргументами.
  6. @TestFactory (JUnit 5):

    • Динамическое определение тестов во время выполнения.
  7. @Nested (JUnit 5):

    • Позволяет определять классы внутри тестового класса для логической группировки тестов.
  8. @Tag (JUnit 5):

    • Для добавления меток к тестам, удобно использовать для фильтрации тестов при выполнении.

Оба фреймворка предоставляют богатый набор инструментов для управления тестовым процессом, позволяя разработчикам адаптировать тестирование к специфике проекта и улучшать процессы непрерывной интеграции.


Какие assertions есть в TestNG/JUnit?

Assertions в TestNG и JUnit представляют собой методы, которые используются для проверки условий в тестах. Эти утверждения генерируют ошибку, если условие не выполняется, что указывает на то, что тест не прошёл. Вот некоторые из наиболее часто используемых утверждений в обоих фреймворках:

TestNG Assertions:

TestNG использует класс Assert, который предоставляет различные статические методы для проверки тестов:

  1. assertEquals: Проверяет, что два значения равны.

    Assert.assertEquals(actual, expected, "Optional failure message");
  2. assertNotEquals: Проверяет, что два значения не равны.

    Assert.assertNotEquals(actual, unexpected, "Optional failure message");
  3. assertTrue: Проверяет, что условие истинно.

    Assert.assertTrue(condition, "Failure message");
  4. assertFalse: Проверяет, что условие ложно.

    Assert.assertFalse(condition, "Failure message");
  5. assertNull: Проверяет, что объект является null.

    Assert.assertNull(object, "Failure message");
  6. assertNotNull: Проверяет, что объект не является null.

    Assert.assertNotNull(object, "Failure message");
  7. assertSame: Проверяет, что два объекта указывают на один и тот же объект.

    Assert.assertSame(actual, expected, "Failure message");
  8. assertNotSame: Проверяет, что два объекта не указывают на один и тот же объект.

    Assert.assertNotSame(actual, unexpected, "Failure message");

JUnit Assertions:

JUnit в своих последних версиях (особенно JUnit 5) использует класс Assertions, который предлагает похожие методы:

  1. assertEquals: Проверяет равенство двух объектов.

    Assertions.assertEquals(expected, actual, "Optional failure message");
  2. assertNotEquals: Проверяет, что два объекта не равны.

    Assertions.assertNotEquals(unexpected, actual, "Optional failure message");
  3. assertTrue: Проверяет, что условие истинно.

    Assertions.assertTrue(condition, "Failure message");
  4. assertFalse: Проверяет, что условие ложно.

    Assertions.assertFalse(condition, "Failure message");
  5. assertNull: Проверяет, что объект является null.

    Assertions.assertNull(object, "Failure message");
  6. assertNotNull: Проверяет, что объект не является null.

    Assertions.assertNotNull(object, "Failure message");
  7. assertSame: Проверяет, что два объекта ссылаются на один и тот же объект.

    Assertions.assertSame(expected, actual, "Failure message");
  8. assertNotSame: Проверяет, что два объекта не ссылаются на один и тот же объект.

    Assertions.assertNotSame(unexpected, actual, "Failure message");

Эти утверждения помогают контролировать ожидаемые результаты ваших тестов и являются ключевым инструментом для обеспечения точности и надежности вашей тестовой среды.


Как выполнять тесты параллельно TestNG/JUnit?

Параллельное выполнение тестов может значительно сократить время тестирования, особенно для больших наборов тестов или для тестов, требующих взаимодействия с веб-страницами. Вот как можно настроить параллельное выполнение тестов в TestNG и JUnit:

TestNG

TestNG предоставляет встроенную поддержку для параллельного выполнения тестов, что легко настраивается через аннотации или XML-конфигурацию.

  1. XML-конфигурация:

    • Вы можете настроить параллельное выполнение тестов в вашем testng.xml файле, указав атрибут parallel и thread-count для определения уровня параллелизма (тесты, классы, методы, экземпляры).
    <suite name="MySuite" parallel="methods" thread-count="10">
        <test name="Test1">
            <classes>
                <class name="com.example.MyTestClass1"/>
            </classes>
        </test>
        <test name="Test2">
            <classes>
                <class name="com.example.MyTestClass2"/>
            </classes>
        </test>
    </suite>
  2. Аннотация:

    • Также можно использовать аннотацию @DataProvider с параметром parallel=true, чтобы выполнять методы, которые получают данные от этого провайдера, параллельно.
    @DataProvider(name = "data", parallel = true)
    public Object[][] getData() {
        return new Object[][] { {"data1"}, {"data2"} };
    }
    
    @Test(dataProvider = "data")
    public void test(String data) {
        System.out.println(data);
    }

JUnit

Для JUnit параллельное выполнение тестов не поддерживается напрямую до JUnit 5. В JUnit 5 используется библиотека JUnit Platform, которая поддерживает параллельное выполнение тестов через настройки в файле junit-platform.properties.

  1. JUnit 5 Configuration:

    • Добавьте или измените файл junit-platform.properties в ресурсах тестов для настройки параллельного выполнения.
    junit.jupiter.execution.parallel.enabled = true
    junit.jupiter.execution.parallel.mode.default = concurrent
    • Можно также настроить, какие элементы должны выполняться параллельно (например, классы или методы).
    junit.jupiter.execution.parallel.mode.classes.default = concurrent
    • Также можно настроить количество потоков:
    junit.jupiter.execution.parallel.config.strategy = fixed
    junit.jupiter.execution.parallel.config.fixed.parallelism = 4

Использование этих настроек позволит вам оптимизировать время выполнения тестов, запуская их параллельно на разных уровнях, будь то методы, классы или даже отдельные тесты в рамках одного класса.

Эта страница была полезной?