← Назад к вопросам

Что такое командная строка в TestNG?

2.2 Middle🔥 61 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Командная строка в 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

  1. Организуй тесты по группам: fast, slow, integration
  2. Используй параллелизм: для быстрого запуска
  3. Конфигурируй через XML: для сложных сценариев
  4. Генерируй отчёты: для анализа результатов
  5. Интегрируй с CI/CD: автоматический запуск на каждый коммит
  6. Используй retry: для flaky тестов
  7. Устанавливай timeout: для предотвращения зависаний

Командная строка TestNG - это мощный инструмент для автоматизации тестирования и интеграции с CI/CD системами. Умелое использование CLI позволяет значительно ускорить цикл разработки и повысить качество кода.

Что такое командная строка в TestNG? | PrepBro