---
title: Web Testing Automation на Java
seo:
  title: Web Testing Automation на Java — QA
  description: Тема «Web Testing Automation на Java» для собеседования QA. Для чего нужны TestNG/JUnit? Какие инструкции используются в TestNG/JUnit?
---

[Все темы QA](/qa)

## <strong>Для чего нужны</strong> <code>TestNG</code><strong>/</strong><code>JUnit</code><strong>?</strong> [#q-14bee738d69b818ab8b0daf73503078d]

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

{/* prettier-ignore */}
1. <strong>Структурирование тестов</strong>&#58;

    - Фреймворки предоставляют аннотации и методы для организации тестовых кодов, например, <code>&#64;Test</code>, <code>&#64;Before</code>, <code>&#64;After</code>, <code>&#64;BeforeClass</code>, и <code>&#64;AfterClass</code>.

1. <strong>Управление тестовыми случаями</strong>&#58;

    - Позволяют легко определить, какие методы являются тестами, а также управлять их выполнением (например, игнорирование тестов с аннотацией <code>&#64;Ignore</code>).

1. <strong>Поддержка параметризации и группировки тестов</strong>&#58;

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

1. <strong>Поддержка зависимостей</strong>&#58;

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

1. <strong>Ассерты и исключения</strong>&#58;

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

1. <strong>Интеграция с другими инструментами</strong>&#58;

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

1. <strong>Отчетность</strong>&#58;

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

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

:::note[Ссылки для изучения]

1. [Сравнение между TestNG и JUnit](https://habr.com/ru/companies/otus/articles/544770/)
   :::

---

## <strong>Какие инструкции используются в</strong> <code>TestNG</code><strong>/</strong><code>JUnit</code><strong>?</strong> [#q-14bee738d69b81d49f41eefbca8b9cee]

<code>TestNG</code> и <code>JUnit</code> предоставляют различные аннотации и
инструкции для управления процессом тестирования. Вот основные инструкции,
используемые в этих фреймворках&#58;

#### <code>TestNG</code>&#58;

{/* prettier-ignore */}
1. <strong>@Test</strong>&#58;

    - Определяет метод как тестовый случай.

1. <strong>@BeforeSuite/@AfterSuite</strong>&#58;

    - Методы, помеченные этими аннотациями, выполняются до или после всех тестов в тестовом наборе.

1. <strong>@BeforeTest/@AfterTest</strong>&#58;

    - Методы выполняются перед началом или после завершения всех тестов, объявленных в <code>&#60;test&#62;</code> теге в файле <code>testng&#46;xml</code>.

1. <strong>@BeforeClass/@AfterClass</strong>&#58;

    - Методы выполняются один раз до начала всех тестов в текущем классе и после завершения всех тестов соответственно.

1. <strong>@BeforeMethod/@AfterMethod</strong>&#58;

    - Методы, которые выполняются перед и после каждого тестового метода.

1. <strong>@DataProvider</strong>&#58;

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

1. <strong>@Parameters</strong>&#58;

    - Позволяет передавать параметры в тесты из файла <code>testng&#46;xml</code>.

1. <strong>@Listeners</strong>&#58;

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

#### <code>JUnit</code>&#58;

{/* prettier-ignore */}
1. <strong>@Test</strong>&#58;

    - Определяет метод как тестовый случай.

1. <strong>@BeforeClass/@AfterClass</strong> (JUnit 4) или <strong>@BeforeAll/@AfterAll</strong> (JUnit 5)&#58;

    - Статические методы, которые выполняются один раз до начала и после завершения всех тестов в классе.

1. <strong>@Before/@After</strong> (JUnit 4) или <strong>@BeforeEach/@AfterEach</strong> (JUnit 5)&#58;

    - Методы, которые выполняются перед и после каждого тестового метода.

1. <strong>@Ignore</strong> (JUnit 4) или <strong>@Disabled</strong> (JUnit 5)&#58;

    - Исключает метод из тестового прогона.

1. <strong>@ParameterizedTest</strong> (JUnit 5)&#58;

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

1. <strong>@TestFactory</strong> (JUnit 5)&#58;

    - Динамическое определение тестов во время выполнения.

1. <strong>@Nested</strong> (JUnit 5)&#58;

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

1. <strong>@Tag</strong> (JUnit 5)&#58;

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

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

:::note[Ссылки для изучения]

1. [Гайд по TestNG](https://testengineer.ru/testng-tutorial/)
   :::

---

## <strong>Какие</strong> <code>assertions</code> <strong>есть в</strong> <code>TestNG</code><strong>/</strong><code>JUnit</code><strong>?</strong> [#q-14bee738d69b81c29f58da9d55b0270f]

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

#### <code>TestNG Assertions</code>&#58;

TestNG использует класс <code>Assert</code>, который предоставляет различные статические методы для проверки тестов&#58;

1. <strong>assertEquals</strong>&#58; Проверяет, что два значения равны.

   ```java
   Assert.assertEquals(actual, expected, "Optional failure message");
   ```

1. <strong>assertNotEquals</strong>&#58; Проверяет, что два значения не равны.

   ```java
   Assert.assertNotEquals(actual, unexpected, "Optional failure message");
   ```

1. <strong>assertTrue</strong>&#58; Проверяет, что условие истинно.

   ```java
   Assert.assertTrue(condition, "Failure message");
   ```

1. <strong>assertFalse</strong>&#58; Проверяет, что условие ложно.

   ```java
   Assert.assertFalse(condition, "Failure message");
   ```

1. <strong>assertNull</strong>&#58; Проверяет, что объект является
   <code>null</code>.

   ```java
   Assert.assertNull(object, "Failure message");
   ```

1. <strong>assertNotNull</strong>&#58; Проверяет, что объект не является
   <code>null</code>.

   ```java
   Assert.assertNotNull(object, "Failure message");
   ```

1. <strong>assertSame</strong>&#58; Проверяет, что два объекта указывают на один
   и тот же объект.

   ```java
   Assert.assertSame(actual, expected, "Failure message");
   ```

1. <strong>assertNotSame</strong>&#58; Проверяет, что два объекта не указывают
   на один и тот же объект.

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

#### <code>JUnit Assertions</code>&#58;

JUnit в своих последних версиях (особенно JUnit 5) использует класс <code>Assertions</code>, который предлагает похожие методы&#58;

1. <strong>assertEquals</strong>&#58; Проверяет равенство двух объектов.

   ```java
   Assertions.assertEquals(expected, actual, "Optional failure message");
   ```

1. <strong>assertNotEquals</strong>&#58; Проверяет, что два объекта не равны.

   ```java
   Assertions.assertNotEquals(unexpected, actual, "Optional failure message");
   ```

1. <strong>assertTrue</strong>&#58; Проверяет, что условие истинно.

   ```java
   Assertions.assertTrue(condition, "Failure message");
   ```

1. <strong>assertFalse</strong>&#58; Проверяет, что условие ложно.

   ```java
   Assertions.assertFalse(condition, "Failure message");
   ```

1. <strong>assertNull</strong>&#58; Проверяет, что объект является
   <code>null</code>.

   ```java
   Assertions.assertNull(object, "Failure message");
   ```

1. <strong>assertNotNull</strong>&#58; Проверяет, что объект не является
   <code>null</code>.

   ```java
   Assertions.assertNotNull(object, "Failure message");
   ```

1. <strong>assertSame</strong>&#58; Проверяет, что два объекта ссылаются на один
   и тот же объект.

   ```java
   Assertions.assertSame(expected, actual, "Failure message");
   ```

1. <strong>assertNotSame</strong>&#58; Проверяет, что два объекта не ссылаются
   на один и тот же объект.

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

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

:::note[Ссылки для изучения]

1. [Assertions в TestNG и JUnit](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/testng-junit/kakie-assertions-est-v-testng-junit)
   :::

---

## <strong>Как выполнять тесты параллельно</strong> <code>TestNG</code><strong>/</strong><code>JUnit</code><strong>?</strong> [#q-14bee738d69b8139b750fba5161095e8]

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

#### <code>TestNG</code>

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

{/* prettier-ignore */}
1. <strong>XML-конфигурация</strong>&#58;

    - Вы можете настроить параллельное выполнение тестов в вашем <code>testng&#46;xml</code> файле, указав атрибут <code>parallel</code> и <code>thread&#45;count</code> для определения уровня параллелизма (тесты, классы, методы, экземпляры).

    ```xml
    <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>
    ```

1. <strong>Аннотация</strong>&#58;

    - Также можно использовать аннотацию <code>&#64;DataProvider</code> с параметром <code>parallel&#61;true</code>, чтобы выполнять методы, которые получают данные от этого провайдера, параллельно.

    ```java
    @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);
    }
    ```

#### <code>JUnit</code>

Для JUnit параллельное выполнение тестов не поддерживается напрямую до JUnit 5. В JUnit 5 используется библиотека JUnit Platform, которая поддерживает параллельное выполнение тестов через настройки в файле <code>junit&#45;platform&#46;properties</code>.

{/* prettier-ignore */}
1. <strong>JUnit 5 Configuration</strong>&#58;

    - Добавьте или измените файл <code>junit&#45;platform&#46;properties</code> в ресурсах тестов для настройки параллельного выполнения.

    ```properties
    junit.jupiter.execution.parallel.enabled = true
    junit.jupiter.execution.parallel.mode.default = concurrent
    ```

    - Можно также настроить, какие элементы должны выполняться параллельно (например, классы или методы).

    ```properties
    junit.jupiter.execution.parallel.mode.classes.default = concurrent
    ```

    - Также можно настроить количество потоков&#58;

    ```properties
    junit.jupiter.execution.parallel.config.strategy = fixed
    junit.jupiter.execution.parallel.config.fixed.parallelism = 4
    ```

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

:::note[Ссылки для изучения]

1. [Выполнение параллельных тестов в TestNG и JUnit](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/testng-junit/kak-vypolnyat-testy-parallelno-testng-junit)
   :::
