TestNG 활용 방법

기본 애노테이션 사용 및 XML과의 비교 (아래는 동일한 기능)

  • 애노테이션
public class TestClass {

    @Test
    public void authenticate() {
        System.out.println("로그인");
    }

    @Test
    public void transaction() {
        System.out.println("결제");
    }

    @BeforeTest
    public void prepareTest() {
        System.out.println("테스트 준비...");
    }

    @BeforeMethod
    public void setup() {
        System.out.println("매서드 실행 전 설정...");
    }

    @BeforeClass
    public void initializeClass() {
        System.out.println("클래스 초기화...");
    }

    @BeforeSuite
    public void startSuite() {
        System.out.println("스위트 시작...");
    }
}

실행 결과:

스위트 시작...
테스트 준비...
클래스 초기화...
매서드 실행 전 설정...
로그인
매서드 실행 전 설정...
결제
  • XML 파일
public class SuiteSetup {

    @BeforeTest
    public void testPreparation() {
        System.out.println("테스트 준비...");
    }

    @BeforeSuite
    public void suiteStart() {
        System.out.println("스위트 시작...");
    }
}

public class LoginVerification {

    @Test
    public void loginSuccess() {
        System.out.println("로그인 성공");
    }

    @BeforeMethod
    public void methodSetup() {
        System.out.println("매서드 설정...");
    }

    @BeforeClass
    public void classInitialization() {
        System.out.println("클래스 초기화...");
    }
}

public class PaymentProcessing {

    @Test
    public void paymentSuccess() {
        System.out.println("결제 성공");
    }

    @BeforeMethod
    public void methodSetupPlus() {
        System.out.println("매서드 설정++++");
    }

    @BeforeClass
    public void classInitializationPlus() {
        System.out.println("클래스 초기화++++");
    }
}

XML 구성:

<suite name="전체 테스트 스위트">
    <test verbose="2" preserve-order="true" name="로그인">
        <classes>
            <class name="com.example.suite.SuiteSetup"/>
            <class name="com.example.test.LoginVerification"/>
        </classes>
    </test>

    <test verbose="2" preserve-order="true" name="결제">
        <classes>
            <class name="com.example.test.PaymentProcessing"/>
            <class name="com.example.suite.SuiteSetup"/>
        </classes>
    </test>
</suite>

실행 결과:

스위트 시작...
테스트 준비...
클래스 초기화...
매서드 설정...
로그인 성공
테스트 준비...
클래스 초기화++++
매서드 설정++++
결제 성공

그룹 테스트

  • 애노테이션 사용:
public class GroupTesting {

    @Test(groups = {"group1"})
    public void groupOneTest1() {
        System.out.println("그룹1 - 테스트1");
    }

    @Test(groups = {"group1"})
    public void groupOneTest2() {
        System.out.println("그룹1 - 테스트2");
    }

    @Test(groups = {"group2"})
    public void groupTwoTest3() {
        System.out.println("그룹2 - 테스트3");
    }

    @BeforeGroups("group1")
    public void beforeGroupOne() {
        System.out.println("그룹1 전처리...");
    }

    @BeforeGroups("group2")
    public void beforeGroupTwo() {
        System.out.println("그룹2 전처리...");
    }
}
  • XML 사용:
public class GroupExample {

    @Test(groups = "auth")
    public void authenticate() {
        System.out.println("로그인");
    }

    @Test(groups = "payment")
    public void processPayment() {
        System.out.println("결제");
    }
}

XML 구성:

<suite name="전체 테스트 스위트">
    <test verbose="2" preserve-order="true" name="결제">
        <groups>
            <run>
                <include name="payment"/>
            </run>
        </groups>
        <classes>
            <class name="com.example.groups.GroupExample"/>
        </classes>
    </test>
</suite>

실행 결과:

결제

파라미터화

  • XML 사용:
public class ParameterTest {
    @Test
    @Parameters({"username", "userAge"})
    public void parameterizedTest(String username, int userAge) {
        System.out.println("사용자 이름: " + username + ", 나이: " + userAge);
    }
}

XML 구성:

<suite name="전체 테스트 스위트">
    <test name="파라미터 테스트">
        <classes>
            <class name="com.example.parameters.ParameterTest">
                <parameter name="username" value="john"/>
                <parameter name="userAge" value="25"/>
            </class>
        </classes>
    </test>
</suite>

실행 결과:

사용자 이름: john, 나이: 25
  • 애노테이션 사용:
public class DataProviderExample {

    @Test(dataProvider = "userData")
    public void testUserData(String name, int age) {
        System.out.println(name + age);
    }

    @DataProvider(name = "userData")
    public Object[][] userData() {
        return new Object[][] {
            {"alice", 30},
            {"bob", 22}
        };
    }

    @Test(dataProvider = "dynamicData")
    public void dynamicTest(String name, int age) {
        System.out.println(name + age);
    }

    @Test(dataProvider = "dynamicData")
    public void anotherDynamicTest(String name, int age) {
        System.out.println(name + age);
    }

    @DataProvider(name = "dynamicData")
    public Object[][] provideDynamicData(Method method) {
        if (method.getName().equals("dynamicTest")) {
            return new Object[][] {
                {"charlie", 18},
                {"diana", 29}
            };
        } else if (method.getName().equals("anotherDynamicTest")) {
            return new Object[][] {
                {"edward", 34},
                {"frank", 40}
            };
        }
        return null;
    }
}

종속성 테스트

public class DependencyTest {
    @Test
    public void firstTest() {
        System.out.println("첫 번째 테스트");
        throw new RuntimeException();
    }

    @Test(dependsOnMethods = "firstTest")
    public void secondTest() {
        System.out.println("두 번째 테스트");
    }
}

예외 테스트

public class ExceptionHandlingTest {
    @Test(expectedExceptions = RuntimeException.class)
    public void runtimeExceptionTest() {
        System.out.println("예외 발생 테스트");
        throw new RuntimeException();
    }
}

타임아웃 테스트

public class TimeoutTest {

    @Test(timeOut = 3000)
    public void successfulTest() throws InterruptedException {
        Thread.sleep(2000);
    }

    @Test(timeOut = 3000)
    public void failingTest() throws InterruptedException {
        Thread.sleep(4000);
    }
}

멀티스레드 테스트

  • 애노테이션 사용:
public class MultithreadAnnotationTest {
    @Test(threadPoolSize = 3, invocationCount = 5)
    public void concurrentTest() {
        System.out.println(Thread.currentThread().getId());
    }
}
  • XML 사용:
public class MultithreadXMLTest {

    @Test
    public void testA() {
        System.out.println(Thread.currentThread().getId());
    }

    @Test
    public void testB() {
        System.out.println(Thread.currentThread().getId());
    }

    @Test
    public void testC() {
        System.out.println(Thread.currentThread().getId());
    }
}

XML 구성:

<suite name="멀티스레드 스위트" parallel="methods" thread-count="2">
    <test name="멀티스레드 테스트">
        <classes>
            <class name="com.example.multithread.MultithreadXMLTest"/>
        </classes>
    </test>
</suite>

태그: TestNG JUnit java

5월 22일 12:10에 게시됨