Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Командная строка в TestNG
Командная строка (CLI) в TestNG - это способ запуска и управления тестами прямо из консоли или скриптов без использования IDE. TestNG предоставляет мощный командный интерфейс для автоматизации процесса тестирования, параллельного выполнения тестов и генерации отчётов.
Основные концепции
TestNG Command Line Interface позволяет:
- Запускать тесты по определённым фильтрам
- Настраивать параллельное выполнение
- Генерировать отчёты в разных форматах
- Интегрироваться с CI/CD pipeline
- Управлять зависимостями между тестами
Базовый синтаксис
java -cp <classpath> org.testng.TestNG <testng_file>
Или через Maven (проще):
mvn test
mvn test -Dtest=TestClassName
Или через Gradle:
./gradlew test
./gradlew test --tests TestClassName
Примеры использования TestNG из командной строки
1. Запуск всех тестов
java -cp "bin:lib/*" org.testng.TestNG testng.xml
2. Запуск конкретного класса
java -cp "bin:lib/*" org.testng.TestNG -testclass com.example.UserServiceTest
3. Запуск группы тестов
Сначала определяем группы в коде:
public class PaymentTest {
@Test(groups = "payment")
public void testProcessPayment() {
// Тест платежа
}
@Test(groups = "payment")
public void testRefund() {
// Тест возврата
}
@Test(groups = "integration")
public void testPaymentWithDatabase() {
// Интеграционный тест
}
}
Запуск только группы "payment":
java -cp "bin:lib/*" org.testng.TestNG -groups payment testng.xml
Запуск нескольких групп:
java -cp "bin:lib/*" org.testng.TestNG -groups payment,integration testng.xml
4. Исключение групп
java -cp "bin:lib/*" org.testng.TestNG -excludegroups slow testng.xml
# Запускает все тесты, кроме отмеченных @Test(groups = "slow")
5. Запуск тестов с параллелизмом
Через конфиг файл testng.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="5">
<test name="Test1">
<classes>
<class name="com.example.UserTest"/>
</classes>
</test>
<test name="Test2">
<classes>
<class name="com.example.PaymentTest"/>
</classes>
</test>
</suite>
Запуск:
java -cp "bin:lib/*" org.testng.TestNG testng.xml
# Запустит Test1 и Test2 параллельно (5 потоков)
Или явно указать:
java -cp "bin:lib/*" org.testng.TestNG -parallel tests -threadcount 5 testng.xml
6. Запуск с определённым уровнем логирования
java -cp "bin:lib/*" org.testng.TestNG -verbose 2 testng.xml
# 0 = тихо, 1 = нормально, 2 = подробно
7. Генерация HTML отчёта
java -cp "bin:lib/*" org.testng.TestNG testng.xml
# По умолчанию создаёт test-output/index.html
# Или с кастомной папкой
java -cp "bin:lib/*" org.testng.TestNG -d ./reports testng.xml
Пример testng.xml файла
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<!-- Включаем только группу 'fast' -->
<test name="FastTests">
<groups>
<run>
<include name="fast"/>
</run>
</groups>
<classes>
<class name="com.example.OrderTest"/>
<class name="com.example.UserTest"/>
</classes>
</test>
<!-- Отдельный тест для интеграции -->
<test name="IntegrationTests" parallel="classes" thread-count="3">
<groups>
<run>
<include name="integration"/>
</run>
</groups>
<classes>
<class name="com.example.DatabaseTest"/>
</classes>
</test>
</suite>
Примеры Maven команд (часто используется)
# Запустить все тесты
mvn test
# Запустить конкретный класс
mvn test -Dtest=UserTest
# Запустить конкретный метод
mvn test -Dtest=UserTest#testFindById
# Запустить тесты по паттерну
mvn test -Dtest=*PaymentTest
# Пропустить тесты
mvn package -DskipTests
# Запустить с конкретной конфигурацией
mvn test -DsuiteXmlFile=src/test/resources/testng.xml
# Запустить параллельно
mvn test -Dparallel=methods -DthreadCount=10
Реальный пример использования
Предположим у нас есть классы тестов:
public class UserServiceTest {
@Test(groups = "fast")
public void testCreateUser() {
// Быстрый тест
}
@Test(groups = "slow")
public void testLoadManyUsers() {
// Медленный тест, требует БД
}
}
public class PaymentServiceTest {
@Test(groups = "fast")
public void testCalculatePrice() {
// Быстрый тест
}
@Test(groups = "integration")
public void testPaymentGateway() {
// Требует внешний API
}
}
Теперь в CI/CD pipeline:
#!/bin/bash
# 1. Запускаем быстрые unit тесты (параллельно)
mvn test -Dgroups=fast -Dparallel=methods -DthreadCount=10
if [ $? -ne 0 ]; then
echo "Fast tests failed"
exit 1
fi
# 2. Запускаем интеграционные тесты (последовательно)
mvn test -Dgroups=integration
if [ $? -ne 0 ]; then
echo "Integration tests failed"
exit 1
fi
# 3. Генерируем отчёт
echo "All tests passed!"
exit 0
Пропуск тестов
public class UserTest {
@Test(enabled = false) // Пропускает этот тест
public void testSkipped() {
// Не будет запущен
}
@Test
@Skip // Альтернативный способ
public void anotherSkipped() {
// Не будет запущен
}
}
Вывод при пропуске:
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.UserTest
[INFO] Skipped: testSkipped()
[INFO] Tests run: 1, Failures: 0, Skipped: 1, Time elapsed: 0.05 s
Зависимости между тестами
public class OrderTest {
@Test
public void testCreateOrder() {
// Должен выполниться первым
}
@Test(dependsOnMethods = {"testCreateOrder"})
public void testPayForOrder() {
// Выполнится только если testCreateOrder прошёл
}
@Test(dependsOnMethods = {"testPayForOrder"})
public void testShipOrder() {
// Выполнится в конце цепи
}
}
CLI команда:
mvn test -Dtest=OrderTest
# Выполнит: testCreateOrder → testPayForOrder → testShipOrder
Timeout для тестов
public class PerformanceTest {
@Test(timeOut = 5000) // 5 секунд
public void testFastOperation() throws InterruptedException {
Thread.sleep(2000);
// Пройдёт (2000 < 5000)
}
@Test(timeOut = 1000) // 1 секунда
public void testShouldTimeout() throws InterruptedException {
Thread.sleep(3000);
// Упадёт (3000 > 1000)
}
}
Запуск:
mvn test -Dtest=PerformanceTest
Retry механизм
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class RetryAnalyzer implements IRetryAnalyzer {
private int retryCount = 0;
private static final int MAX_RETRY = 2;
@Override
public boolean retry(ITestResult result) {
if (retryCount < MAX_RETRY) {
retryCount++;
return true; // Повторить тест
}
return false;
}
}
public class Flaky Test {
@Test(retryAnalyzer = RetryAnalyzer.class)
public void testWithRetry() {
// Если упадёт - будет переделано до 2 раз
}
}
Вывод при запуске
===============================================
Suite: Suite
Total tests run: 5, Passes: 4, Failures: 1, Skips: 0
===============================================
FAILED TESTS:
com.example.PaymentTest.testProcessPayment
PASSED TESTS:
com.example.UserTest.testCreateUser
com.example.UserTest.testFindById
com.example.OrderTest.testCreateOrder
com.example.OrderTest.testPayForOrder
Best Practices при использовании CLI
- Организуй тесты по группам: fast, slow, integration
- Используй параллелизм: для быстрого запуска
- Конфигурируй через XML: для сложных сценариев
- Генерируй отчёты: для анализа результатов
- Интегрируй с CI/CD: автоматический запуск на каждый коммит
- Используй retry: для flaky тестов
- Устанавливай timeout: для предотвращения зависаний
Командная строка TestNG - это мощный инструмент для автоматизации тестирования и интеграции с CI/CD системами. Умелое использование CLI позволяет значительно ускорить цикл разработки и повысить качество кода.