기본 애노테이션 사용 및 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>