TestNG Documentation
TestNG (Test Next Generation) 는 Java 애플리케이션을 위한 인기 있는 테스트 프레임워크로,
테스트 케이스를 효율적이고 체계적으로 실행할 수 있도록 도와준다.
이 프레임워크의 핵심 기능 중 하나는 테스트 매개변수화(parameterization) 로,
하나의 테스트 메서드를 서로 다른 데이터 세트로 반복 실행할 수 있게 해준다.
🔹 주요 특징 (Key Features)
- 강력한 테스트 프레임워크 (Powerful Testing Framework)
- JUnit의 발전형 (Successor to JUnit)
- 유연한 테스트 제어 (Easy Test Control)
- 확장된 기능 (Enhanced Functionality)
🔸 TestNG의 주요 기능
- 어노테이션(Annotations) 지원
- 다양한 정책에 따라 테스트를 임의 크기의 스레드 풀(thread pool) 에서 병렬 실행 가능
(예: 각 메서드를 독립된 스레드에서 실행, 테스트 클래스마다 하나의 스레드 등) - 코드의 멀티스레드 안정성(multithread safety) 검증 가능
- 유연한 테스트 구성(Flexible test configuration)
- 데이터 기반 테스트(Data-driven testing) 지원 (@DataProvider 사용)
- 파라미터(Parameter) 지원
- 강력한 실행 모델(Execution model) 제공 (더 이상 TestSuite 필요 없음)
- Eclipse, IntelliJ IDEA, Maven 등 다양한 개발 도구 및 플러그인에서 지원
- BeanShell 내장으로 스크립트 기반의 추가적 유연성 확보
- JDK 기본 기능을 활용한 런타임 및 로깅 (외부 라이브러리 의존성 없음)
- 서버 환경 테스트를 위한 메서드 간 종속성(dependent methods) 지원
🔹 사전 준비사항 (Prerequisites)
- 소프트웨어 테스트 기본 개념 이해
(테스트 케이스, 테스트 실행, 테스트 종류 등) - Java 언어에 대한 충분한 숙련도
TestNG는 Java 문법과 객체지향 개념에 의존하므로, Java 프로그래밍에 익숙해야 함.
🔹 TestNG의 장점 (Advantages of TestNG)
- TestNG는 Java 환경에서 소프트웨어 테스트 수행을 지원하는 프레임워크로,각 테스트를 클래스 단위로 실행하고 관리한다.
- 각 테스트를 대응되는 클래스에서 실행하며, 스레드(Thread) 를 활용해 여러 테스트를 동시에 처리함으로써 전체 테스트 실행 속도를 향상시킨다.
- 또한 JUnit의 한계를 보완하고, 다양한 테스트 시나리오를 유연하게 구성할 수 있는 고급 기능을 제공한다.

TestNG Basic To Advance
- TestNG Installation
- Features of TestNG
- TestNG Running TestCases
- TestNG Running Failed TestCases
- XML With TestNG
- TestNG with Regex
- TestNG Groups
- TestNG Annotations in Selenium Webdriver with Examples
- @BeforeSuite
- @AfterSuite
- @BeforeTest
- @AfterTest
- @BeforeClass
- @AfterClass
- @BeforeMethod
- @AfterMethod
- @BeforeGroups
- @AfterGroups
- TestsNG Annotation attribute
- TestNG Listeners
- TestNG Interview Questions
🔸 테스트 범위
TestNG는 다음과 같은 모든 종류의 테스트를 포괄하도록 설계되었다.
- 단위(Unit) 테스트
- 기능(Functional) 테스트
- 종단 간(End-to-End) 테스트
- 통합(Integration) 테스트 등
package example1;
import org.testng.annotations.*;
public class SimpleTest {
@BeforeClass
public void setUp() {
// code that will be invoked when this test is instantiated
}
@Test(groups = {"fast"})
public void aFastTest() {
System.out.println("Fast test");
}
@Test(groups = {"slow"})
public void aSlowTest() {
System.out.println("Slow test");
}
}
🔸 참고할 점 (Things to note)
- 별도의 클래스 상속이나 인터페이스 구현이 필요하지 않다.
- 위의 예시에서는 JUnit 규칙을 따르는 것처럼 보이지만, 메서드 이름은 자유롭게 정할 수 있다.
TestNG는 메서드 이름이 아니라 어노테이션(annotation) 을 통해 해당 메서드의 역할을 인식한다. - 하나의 테스트 메서드는 하나 이상의 그룹(group)에 속할 수 있다.
🔸 Ant 빌드 스크립트 예시 (build.xml)
<project default="test">
<path id="cp">
<pathelement location="lib/testng-testng-5.13.1.jar"/>
<pathelement location="build"/>
</path>
<taskdef name="testng" classpathref="cp"
classname="org.testng.TestNGAntTask"/>
<target name="test">
<testng classpathref="cp" groups="fast">
<classfileset dir="build" includes="example1/*.class"/>
</testng>
</target>
</project>
🧩 설명:
- <path>: TestNG 라이브러리(testng-testng-5.13.1.jar)와 빌드된 클래스 파일 경로를 지정
- <taskdef>: TestNG 태스크를 정의하여 Ant에서 사용할 수 있도록 설정
- <target name="test">: “test”라는 이름의 빌드 타깃을 정의
- <testng>: 실제 TestNG 테스트 실행 설정
이때, ant 는 = 빌드 자동화 도구 ( apache ant )
-> 프로젝트를 자동으로 컴파일하고, 테스트하고, 배포하는 도구
🔹 2. Ant의 역할
Ant는 Java 프로젝트를 자동으로 빌드(build) 하는 데 사용됩니다.
예를 들어, 다음 일을 자동으로 처리할 수 있습니다 👇
| 작업 | 설명 |
| compile | .java 파일을 .class로 컴파일 |
| test | JUnit/TestNG 같은 테스트 프레임워크 실행 |
| package | .jar 또는 .war 파일로 패키징 |
| clean | 이전 빌드 파일 삭제 |
| deploy | 결과물을 서버에 배포 |
🔸 테스트 작성 절차
일반적으로 테스트를 작성하는 과정은 세 단계로 이루어진다:
- 테스트의 비즈니스 로직(Business Logic) 을 작성하고, 코드 내에 TestNG 어노테이션을 삽입한다.
- 테스트에 대한 정보를 testng.xml 파일 또는 build.xml 파일에 추가한다.
(예: 클래스 이름, 실행할 그룹 이름 등) - TestNG를 실행한다.
🔸 TestNG의 주요 개념
- Suite (테스트 스위트)
- Test (테스트 단위)
- TestNG Class (테스트 클래스)
- Test Method (테스트 메서드)
- Before/After 어노테이션
Annotations
주요 어노테이션(Annotations)
| @BeforeSuite | 이 어노테이션이 붙은 메서드는 테스트 스위트(suite) 내의 모든 테스트가 실행되기 전에 한 번 실행된다. |
| @AfterSuite | 이 어노테이션이 붙은 메서드는 스위트 내의 모든 테스트가 실행된 후에 한 번 실행된다. |
| @BeforeTest | 태그 내부에 정의된 클래스들의 테스트 메서드가 실행되기 전에 실행된다. |
| @AfterTest | 태그 내부의 모든 테스트 메서드가 실행된 후에 실행된다. |
| @BeforeGroups | 특정 그룹(group) 에 속한 테스트 메서드들이 실행되기 직전에 실행된다. 지정된 그룹들 중 하나라도 실행되기 전 반드시 호출된다. |
| @AfterGroups | 특정 그룹에 속한 테스트 메서드들이 모두 실행된 후에 실행된다. 지정된 그룹들 중 마지막 메서드 실행 직후 호출된다. |
| @BeforeClass | 현재 클래스의 첫 번째 테스트 메서드가 실행되기 전에 실행된다. |
| @AfterClass |
현재 클래스의 모든 테스트 메서드가 실행된 후에 실행된다. |
| @BeforeMethod | 각 테스트 메서드가 실행되기 전마다 호출된다. (즉, 테스트 메서드 개수만큼 반복 실행됨) |
| @AfterMethod | 각 테스트 메서드가 실행된 후마다 호출된다. |
Ex )
public class ParentTest {
@BeforeClass
public void beforeParent() {
System.out.println("부모 BeforeClass 실행");
}
@AfterClass
public void afterParent() {
System.out.println("부모 AfterClass 실행");
}
}
public class ChildTest extends ParentTest {
@BeforeClass
public void beforeChild() {
System.out.println("자식 BeforeClass 실행");
}
@AfterClass
public void afterChild() {
System.out.println("자식 AfterClass 실행");
}
@Test
public void testSomething() {
System.out.println("테스트 실행");
}
}
결과 )
부모 BeforeClass 실행
자식 BeforeClass 실행
테스트 실행
자식 AfterClass 실행
부모 AfterClass 실행
🔹 상속 관계에서의 어노테이션 동작
(Behaviour of annotations in superclass of a TestNG class)
위에서 설명한 어노테이션들은 상위 클래스(superclass) 에 정의되어 있어도 그대로 상속(inherit) 되어 적용된다.
즉, 공통된 테스트 환경 설정을 여러 테스트 클래스에서 공유할 때 유용하다.
예를 들어, 여러 테스트 클래스에 공통되는 초기화(setup) 나 정리(clean-up) 로직을
상위 클래스에 한 번만 정의해두면, 하위 클래스들이 자동으로 이를 실행할 수 있다.
이때 TestNG는 실행 순서를 다음과 같이 보장한다:
- @Before 메서드들은 상속 계층의 상위 클래스부터 하위 클래스 순서로 실행된다.
(즉, 부모 → 자식 순서) - @After 메서드들은 반대로 하위 클래스부터 상위 클래스 순서로 실행된다.
(즉, 자식 → 부모 순서)
🔹 TestNG 어노테이션 속성 정리 (Annotation Attributes Summary)
1️⃣ alwaysRun
- 설명:
@Before 계열(@BeforeSuite, @BeforeTest, @BeforeClass, @BeforeMethod)에 적용할 때,
true로 설정하면 소속 그룹이나 이전 실패 여부와 관계없이 무조건 실행된다. @After 계열(@AfterSuite, @AfterClass 등)일 경우에도, 이전에 실패하거나 건너뛴 테스트가 있어도 반드시 실행된다. - 예시 상황:
테스트 중 일부가 실패했더라도 환경 정리(clean-up) 는 반드시 수행되어야 할 때 사용.
2️⃣ dependsOnGroups
- 설명:
현재 메서드가 의존하는 그룹(group) 의 목록을 지정한다. 지정된 그룹에 속한 테스트들이 모두 성공적으로 실행된 후에만 이 메서드가 실행된다. - 예시 상황:
예를 들어 "login" 그룹 테스트가 끝난 뒤 "checkout" 테스트를 실행하고 싶을 때
→ @Test(dependsOnGroups = "login")
3️⃣ dependsOnMethods
- 설명:
현재 메서드가 의존하는 다른 메서드들을 지정한다. 명시된 메서드들이 모두 성공한 경우에만 해당 메서드가 실행된다. - 예시 상황:
예를 들어 testPayment()가 testLogin() 성공 이후에만 실행되게 하려면
→ @Test(dependsOnMethods = "testLogin")
4️⃣ enabled
- 설명:
이 메서드 또는 클래스의 테스트 실행 여부를 제어한다. enabled = false로 설정하면 해당 테스트는 비활성화되어 실행되지 않는다. - 예시:
@Test(enabled = false)
public void skipThisTest() { ... }
5️⃣ groups
- 설명:
이 클래스나 메서드가 속하는 그룹의 목록을 지정한다.
같은 그룹끼리 묶어 선택적으로 실행하거나, 특정 그룹만 실행할 수 있다 (testng.xml에서 제어 가능). - 예시:
@Test(groups = {"login", "smoke"})
6️⃣ inheritGroups
- 설명:
true로 설정하면, 클래스 레벨의 @Test 어노테이션에서 지정된 그룹이 메서드에도 자동으로 상속된다. - 예시:
@Test(groups = "api") // 클래스 전체가 api 그룹
public class ApiTests {
@Test(inheritGroups = true)
public void testEndpoint() { ... } // 자동으로 api 그룹에 포함
}
7️⃣ onlyForGroups
- 적용 대상:
오직 @BeforeMethod 와 @AfterMethod 에만 적용 가능. - 설명:
지정된 그룹에 속한 테스트 메서드가 실행될 때만 이 @BeforeMethod 또는 @AfterMethod 메서드가 실행된다.
즉, 특정 그룹에 한정된 사전/사후 처리 로직을 구현할 수 있다. - 예시:
@BeforeMethod(onlyForGroups = "login")
public void setupForLoginTests() { ... }
🧩 그 외의 TestNG 어노테이션 정리 (Annotations Summary)
1. @DataProvider
테스트 메서드에 데이터를 공급하는 메서드를 표시한다. 이 메서드는 반드시 Object[][] 타입을 반환해야 하며, 각 Object[]는 테스트 메서드의 매개변수 목록(parameter list)에 할당될 수 있는 데이터 한 세트를 의미한다.
@Test 메서드가 이 데이터를 사용하려면 dataProvider 속성에 데이터 제공자의 이름을 지정해야 한다.
속성 (Attributes)
- name — 데이터 제공자의 이름. 지정하지 않으면 메서드 이름이 기본값으로 사용된다.
- parallel — true로 설정하면, 해당 데이터 제공자로 생성된 테스트들이 병렬로 실행된다.
(기본값: false)
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class LoginTest {
@DataProvider(name = "loginData")
public Object[][] getLoginData() {
return new Object[][] {
{"admin", "1234"},
{"user", "abcd"}
};
}
@Test(dataProvider = "loginData")
public void testLogin(String username, String password) {
System.out.println("Testing login with: " + username + " / " + password);
}
}
2. @Factory
TestNG가 실행할 테스트 클래스 객체들을 생성하는 메서드를 표시한다.
이 메서드는 반드시 Object[]를 반환해야 하며,
각 원소는 개별적인 테스트 클래스 인스턴스를 의미한다.
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
public class FactoryExample {
private int number;
public FactoryExample(int number) {
this.number = number;
}
@Test
public void testNumber() {
System.out.println("Testing instance with number = " + number);
}
@Factory
public static Object[] factoryMethod() {
return new Object[] {
new FactoryExample(1),
new FactoryExample(2),
new FactoryExample(3)
};
}
}
3. @Listeners
테스트 클래스에 리스너(listener) 를 정의한다.
리스너는 테스트 실행 중 발생하는 이벤트(시작, 성공, 실패 등)를 감지하고
별도의 동작(로그, 리포트 등)을 수행할 수 있다.
속성 (Attributes)
- value — org.testng.ITestNGListener를 구현(extend)한 클래스들의 배열.
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(MyTestListener.class) // 리스너 등록
public class ListenerExample {
@Test
public void testPass() {
System.out.println("✅ Test body: testPass()");
}
@Test
public void testFail() {
System.out.println("❌ Test body: testFail()");
throw new RuntimeException("Forced failure");
}
}
// 커스텀 리스너 정의
class MyTestListener implements ITestListener {
@Override
public void onTestSuccess(ITestResult result) {
System.out.println("[Listener] SUCCESS: " + result.getName());
}
@Override
public void onTestFailure(ITestResult result) {
System.out.println("[Listener] FAILURE: " + result.getName());
}
}
🔹리스너의 개념
리스너(Listener)는 테스트 실행 도중 발생하는 이벤트를 “듣고(listener)” 반응하는 코드입니다.
예를 들어 TestNG는 다음과 같은 “이벤트 시점”을 가지고 있어요 👇
- 테스트 시작 전 (onTestStart)
- 테스트 성공 (onTestSuccess)
- 테스트 실패 (onTestFailure)
- 테스트 건너뜀 (onTestSkipped)
- 테스트 종료 (onFinish)
- 전체 Suite 시작/종료 (onStart, onFinish)
👉 리스너 클래스는 이런 이벤트를 감지해서 자동으로 실행되는 콜백(callback) 을 정의합니다.
우리가 직접 호출하지 않아도 TestNG가 내부적으로 호출해줘요.
🔹 실행 순서 해석
| 단계 | 발생 이벤트 | TestNG가 하는 일 | 호출되는 메서드 |
| ① | testPass() 시작 | 테스트 본문 실행 | testPass() |
| ② | 성공 이벤트 발생 | 리스너 감지 → 성공 콜백 실행 | onTestSuccess() |
| ③ | testFail() 시작 | 테스트 본문 실행 중 예외 발생 | testFail() |
| ④ | 실패 이벤트 발생 | 리스너 감지 → 실패 콜백 실행 | onTestFailure() |
4. @Parameters
testng.xml 파일에 정의된 외부 파라미터 값을 테스트 메서드에 전달할 때 사용한다.
속성 (Attributes)
- value — 해당 메서드의 매개변수를 채우기 위해 사용할 변수 이름 목록
5. @Test
이 어노테이션은 클래스 또는 메서드를 TestNG가 실행할 테스트로 표시한다.
| 속성 | 설명 |
| alwaysRun | true로 설정하면, 이 테스트는 의존하는 메서드가 실패하더라도 항상 실행된다. |
| dataProvider | 이 테스트 메서드에 데이터를 공급할 @DataProvider의 이름. |
| dataProviderClass | 데이터 제공자가 정의된 클래스. 지정하지 않으면 현재 테스트 클래스 또는 상위 클래스에서 찾는다.다른 클래스에 정의되어 있다면 해당 메서드는 static이어야 한다. |
| dependsOnGroups | 이 테스트가 의존하는 그룹의 목록. |
| dependsOnMethods | 이 테스트가 의존하는 메서드의 목록. |
| description | 테스트의 목적이나 설명을 작성. |
| enabled | 해당 테스트를 실행할지 여부를 설정 (true가 기본값). |
| expectedExceptions | 테스트 수행 시 예상되는 예외(Exception) 목록을 지정.다른 예외가 발생하거나 예외가 발생하지 않으면 실패로 처리된다. |
| groups | 이 테스트가 속하는 그룹 목록. |
| invocationCount | 이 메서드를 반복 실행할 횟수. |
| invocationTimeOut | 모든 반복 실행(invocationCount)의 누적 실행 시간에 대한 최대 제한(ms). invocationCount가 없으면 무시된다. |
| priority | 테스트 실행 우선순위. 숫자가 낮을수록 먼저 실행된다. |
| successPercentage | 테스트가 통과로 간주되기 위해 필요한 성공 비율(%)을 설정. |
| singleThreaded | true로 설정하면, 해당 클래스 내의 모든 테스트 메서드는 동일한 스레드에서 실행된다.(클래스 레벨에서만 적용 가능, 메서드 단위에서는 무시됨)예전 이름은 sequential (현재는 폐기됨). |
| timeOut | 이 테스트가 완료되어야 하는 최대 시간(ms). |
| threadPoolSize | 병렬 실행 시 사용할 스레드 풀 크기.invocationCount가 지정되지 않으면 무시된다. |
import org.testng.annotations.Test;
public class TestAnnotationExample {
@Test(priority = 1)
public void testLogin() {
System.out.println("1️⃣ Login test");
}
@Test(priority = 2, dependsOnMethods = "testLogin")
public void testCheckout() {
System.out.println("2️⃣ Checkout test (runs only if Login passes)");
}
@Test(invocationCount = 3, timeOut = 2000)
public void testRepeated() {
System.out.println("🌀 Running repeated test");
}
}
🟢 결과:
- testLogin → 먼저 실행
- testCheckout → 로그인 성공 시 실행
- testRepeated → 3회 반복 실행, 2초 제한 내 수행
보다보니 느끼는건데, 이런 어노테이션은 알아두고, 필요할 때마다 찾아봐야할 것 같다.
( 한번에 외우기는 다소 어려운듯 )
🔹 TestNG 실행 방법 (Ways to invoke TestNG)
TestNG는 여러 가지 방법으로 실행할 수 있다:
- testng.xml 파일을 사용하여 실행
- Ant 빌드 도구를 통해 실행
- 명령줄(Command Line)에서 직접 실행
'☁️2024,2025☁️ > Test&Dev' 카테고리의 다른 글
| [Test_그래도해야지어떡해] #2. Mock, 그리고 Mockito (0) | 2025.11.08 |
|---|