TestNG

**TestNG**는 JUnit과 NUnit에서 영감을 얻어 세드리크 뵈스트가 만든 자바 프로그래밍 언어용 테스트 프레임워크다. TestNG의 설계 목표는 더 강력하고 사용하기 쉬운 기능을 통해 유닛, 기능, 엔드투엔드(end-to-end), 통합 등 더 넓은 범위의 테스트 범주를 포괄하는 것이다.

## 특징
TestNG의 주요 특징은 다음과 같다.
# 어노테이션 지원.
# 데이터 주도/매개변수화된 테스트 지원 (`@DataProvider` 및 XML 설정 사용).
# 동일한 테스트 클래스의 여러 인스턴스 지원 (`@Factory` 사용).
# 유연한 실행 모델. TestNG는 build.xml을 통해 앤트로 실행하거나(테스트 스위트 정의 여부와 관계없이), 시각적 결과를 제공하는 IDE 플러그인으로 실행할 수 있다. `TestSuite` 클래스는 존재하지 않으며, 실행할 테스트 스위트, 그룹 및 테스트는 XML 파일에 의해 정의되고 설정된다.
# 동시 테스트: 다양한 정책(모든 메서드를 고유한 스레드에서 실행, 테스트 클래스당 하나의 스레드 등)을 사용하여 임의의 큰 스레드 풀에서 테스트를 실행하고, 코드가 멀티스레드에 안전한지 테스트한다.
# 더 큰 유연성을 위해 BeanShell을 내장함.
# 런타임 및 로깅을 위한 기본 JDK 기능 사용 (의존성 없음).
# 애플리케이션 서버 테스트를 위한 의존 메서드.
# 분산 테스트: 슬레이브 머신에 테스트 분산 가능.

### 데이터 제공자

TestNG의 데이터 제공자(Data provider)는 테스트 클래스 내의 메서드로, 의존하는 테스트 메서드에 다양한 실제 값 배열을 제공한다.

예시:


```java
// 이 메서드는 데이터 제공자 이름이 "provider1"이라고 선언한 모든 테스트 메서드에 데이터를 제공한다.
	@DataProvider(name = "provider1")
	public Object[][] createData1() {
		return new Object[][] {
			{ "Cedric", new Integer(36) },
			{ "Anne", new Integer(37) }
		};
	}

	// 이 테스트 메서드는 "provider1"이라는 이름의 데이터 제공자로부터 데이터를 공급받아야 함을 선언한다.
	@Test(dataProvider = "provider1")
	public void verifyData1(String n1, Integer n2) {
		System.out.println(n1 + " " + n2);
	}

	// 매개변수 배열의 반복자(iterator)를 반환하는 데이터 제공자.
	@DataProvider(name = "provider2")
	public Iterator<Object[]> createData() {
		return new MyIterator(...);
	}

	// java.lang.reflect.Method 타입의 인수를 가진 데이터 제공자.
	// 여러 테스트 메서드가 동일한 제공자를 사용하고,
	// 서비스를 제공하는 테스트 메서드에 따라 서로 다른 값을 반환하려는 경우 특히 유용하다.
	@DataProvider(name = "provider3")
	public Object[][] createData(Method m) {
		System.out.println(m.getName());
		return new Object[][] { new Object[] { "Cedric" } };
	}
```


데이터 제공자의 반환 타입은 다음 두 가지 중 하나일 수 있다.
* 객체 배열의 배열(`Object[][]`): 첫 번째 차원의 크기는 테스트 메서드가 호출될 횟수이고, 두 번째 차원은 테스트 메서드의 매개변수 타입과 호환되어야 하는 객체 배열을 포함한다.
* `Iterator<Object[]>`: `Object[][]`와의 유일한 차이점은 반복자를 통해 테스트 데이터를 지연 생성(lazily)할 수 있다는 것이다. TestNG는 반복자를 호출한 다음, 이 반복자가 반환한 매개변수를 사용하여 테스트 메서드를 하나씩 호출한다. 이는 메서드에 전달할 매개변수 세트가 많고 이를 미리 모두 생성하고 싶지 않을 때 특히 유용하다.

### 도구 지원

TestNG는 기본적으로 또는 플러그인을 통해 Eclipse, IntelliJ IDEA, 넷빈즈 등 세 가지 주요 자바 IDE에서 모두 지원된다. 또한 아파치 앤트를 위한 커스텀 태스크가 포함되어 있으며 메이븐 빌드 시스템에서도 지원된다. 허드슨 지속적 통합 서버는 TestNG를 기본적으로 지원하며 시간에 따른 테스트 결과를 추적하고 차트로 나타낼 수 있다. Cobertura와 같은 대부분의 자바 코드 커버리지 도구도 TestNG와 원활하게 작동한다.

참고: Eclipse용 TestNG 지원은 Eclipse 버전 2018-09 (4.9)까지만 Eclipse Marketplace에 내장되어 있다. 이후 버전의 Eclipse에서는 TestNG 사이트의 지침에 따라 TestNG를 수동으로 설치해야 한다.

### 보고 기능
TestNG는 HTML 및 XML 형식의 테스트 보고서를 생성한다. XML 출력은 JUnit을 사용할 때 얻는 것과 유사한 보고서를 생성하기 위해 Ant JUnitReport 태스크에 의해 변환될 수 있다. 버전 4.6부터 TestNG는 ReportNG, PDFngreport, TestNG-XSLT와 같은 서드파티 보고서 생성기를 사용할 수 있게 해주는 리포터 API를 제공한다.

## JUnit과의 비교

TestNG는 JUnit 테스트 자동화 프레임워크와 오랜 경쟁 관계에 있다. 각각은 차이점과 각자의 장점을 가지고 있다. 스택 오버플로의 토론들이 이러한 논쟁을 반영한다.

### 어노테이션

JUnit 5에서 @BeforeAll 및 @AfterAll 메서드는 대부분의 상황에서 static으로 선언되어야 한다. TestNG에는 이러한 제약이 없다.

TestNG에는 테스트 스위트 및 그룹을 위한 4개의 추가 설정/해제 어노테이션 쌍이 포함되어 있다: @BeforeSuite, @AfterSuite, @BeforeTest, @AfterTest, @BeforeGroup 및 @AfterGroup, @BeforeMethod 및 @AfterMethod.
TestNG는 또한 셀레늄을 사용하여 애플리케이션 테스트를 자동화하는 기능을 지원한다.

### 매개변수화된 테스트

매개변수화된 테스트는 두 도구 모두에 구현되어 있지만 방식은 상당히 다르다.

TestNG는 테스트 메서드에 다양한 매개변수 값을 제공하는 두 가지 방법이 있다: testng.xml을 설정하는 방법과 @DataProvider 메서드를 정의하는 방법이다.

JUnit 5에서 @ParameterizedTest 어노테이션은 매개변수화된 테스트를 가능하게 한다. 이 어노테이션은 @ValueSource 또는 @EnumSource와 같이 매개변수 인수의 소스를 선언하는 다른 어노테이션과 결합된다. @ArgumentsSource를 사용하면 사용자가 더 동적인 `ArgumentsProvider`를 구현할 수 있다. JUnit 4에서는 @RunWith와 @Parameters가 매개변수화된 테스트를 용이하게 하는 데 사용되며, 여기서 @Parameters 메서드는 매개변수화된 값이 포함된 `List[]`를 반환해야 하고, 이 값들은 테스트 클래스 생성자에 주입된다.

### 결론
사용자마다 한 프레임워크 또는 다른 프레임워크의 특정 기능을 선호하는 경우가 많다. JUnit은 더 널리 보급되어 있으며 종종 주요 IDE에 기본적으로 포함되어 제공된다. TestNG는 추가적인 설정 옵션과 다양한 종류의 테스트를 수행할 수 있는 능력으로 잘 알려져 있다. 어떤 것이 더 적합한지는 사용 상황과 요구 사항에 따라 달라진다.

## 같이 보기
* 유닛 테스트 프레임워크 목록
* JUnit
* XUnit

## 각주

## 외부 링크
* 
* 

분류:자바 플랫폼
분류:유닛 테스트 프레임워크
분류:아파치 라이선스 소프트웨어