[Test_그래도해야지어떡해] #1. TestNG 란? _ docs 번역 및 정리

TestNG Documentation

TestNG (Test Next Generation) Java 애플리케이션을 위한 인기 있는 테스트 프레임워크로,

테스트 케이스를 효율적이고 체계적으로 실행할 수 있도록 도와준다.

이 프레임워크의 핵심 기능 중 하나는 테스트 매개변수화(parameterization) ,

하나의 테스트 메서드를 서로 다른 데이터 세트로 반복 실행할 수 있게 해준다.

 

🔹 주요 특징 (Key Features)

  1. 강력한 테스트 프레임워크 (Powerful Testing Framework)
  2. JUnit의 발전형 (Successor to JUnit)
  3. 유연한 테스트 제어 (Easy Test Control)
  4. 확장된 기능 (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)

  • TestNGJava 환경에서 소프트웨어 테스트 수행을 지원하는 프레임워크,각 테스트를 클래스 단위로 실행하고 관리한다.
  • 각 테스트를 대응되는 클래스에서 실행하며, 스레드(Thread) 를 활용해 여러 테스트를 동시에 처리함으로써 전체 테스트 실행 속도를 향상시킨다.
  • 또한 JUnit의 한계를 보완하고, 다양한 테스트 시나리오를 유연하게 구성할 수 있는 고급 기능을 제공한다.

 

 

 

TestNG Basic To Advance

  • 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의 역할

AntJava 프로젝트를 자동으로 빌드(build) 하는 데 사용됩니다.

예를 들어, 다음 일을 자동으로 처리할 수 있습니다 👇

작업 설명
compile .java 파일을 .class로 컴파일
test JUnit/TestNG 같은 테스트 프레임워크 실행
package .jar 또는 .war 파일로 패키징
clean 이전 빌드 파일 삭제
deploy 결과물을 서버에 배포

 

 

🔸 테스트 작성 절차

일반적으로 테스트를 작성하는 과정은 세 단계로 이루어진다:

  1. 테스트의 비즈니스 로직(Business Logic) 을 작성하고, 코드 내에 TestNG 어노테이션을 삽입한다.
  2. 테스트에 대한 정보를 testng.xml 파일 또는 build.xml 파일에 추가한다.
    (
    : 클래스 이름, 실행할 그룹 이름 등)
  3. 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데이터 제공자의 이름. 지정하지 않으면 메서드 이름이 기본값으로 사용된다.
  • paralleltrue로 설정하면, 해당 데이터 제공자로 생성된 테스트들이 병렬로 실행된다.
    (
    기본값: 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)

  • valueorg.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");

    }

}

 

🟢 결과:

  1. testLogin → 먼저 실행
  2. testCheckout → 로그인 성공 시 실행
  3. testRepeated → 3회 반복 실행, 2초 제한 내 수행

 

보다보니 느끼는건데, 이런 어노테이션은 알아두고, 필요할 때마다 찾아봐야할 것 같다.

( 한번에 외우기는 다소 어려운듯 ) 


🔹 TestNG 실행 방법 (Ways to invoke TestNG)

TestNG는 여러 가지 방법으로 실행할 수 있다:

  1. testng.xml 파일을 사용하여 실행
  2. Ant 빌드 도구를 통해 실행
  3. 명령줄(Command Line)에서 직접 실행

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90