용어집 · UI 자동화
데이터 주도 테스트
영어: Data-driven testing
다른 이름: 데이터 기반 테스트, 데이터 드리븐 테스트, DDT, 파라미터화 테스트
정의
같은 테스트 로직을 여러 입력과 기대 결과 세트로 실행하는 방식으로, 데이터를 각 테스트에 복사하지 않고 테이블, 파일, 데이터 소스에 보관합니다.
데이터 주도 테스트(Data-driven testing)는 테스트가 “무엇을 하는지”와 “어떤 데이터로 하는지”를 분리합니다. 단계는 한 번만 작성하고, 입력값과 각 입력이 내야 할 결과로 이루어진 데이터 행을 공급합니다. 각 행은 개별 테스트 케이스로 실행되어 각자 통과 또는 실패 결과를 냅니다. 경계값 분석이나 동등 분할 같은 기법의 결과를 자동화하는 가장 자연스러운 방법입니다.
예시 (JUnit 5)
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ShippingFeeTest {
@ParameterizedTest(name = "order of {0} costs {1} to ship")
@CsvSource({
"0.00, 4.99",
"49.99, 4.99",
"50.00, 0.00",
"250.00, 0.00"
})
void shippingFee(double orderTotal, double expectedFee) {
assertEquals(expectedFee, Shipping.feeFor(orderTotal), 0.001);
}
}
이 코드에는 junit-jupiter-params 아티팩트가 필요합니다. 다른 데이터 소스로는 @ValueSource, @MethodSource, 그리고 CSV 파일에 보관한 데이터를 읽는 @CsvFileSource가 있습니다.
예시 (Playwright)
Playwright에는 전용 어노테이션이 없습니다. 루프로 테스트를 생성하고 각각에 고유한 제목을 붙입니다.
import { test, expect } from '@playwright/test';
const cases = [
{ email: '', error: 'Email is required' },
{ email: 'not-an-email', error: 'Enter a valid email' },
];
for (const { email, error } of cases) {
test(`login rejects "${email}"`, async ({ page }) => {
await page.goto('/login');
await page.getByLabel('Email').fill(email);
await page.getByRole('button', { name: 'Sign in' }).click();
await expect(page.getByRole('alert')).toHaveText(error);
});
}
흔한 실수
- 행마다 다른 단계가 필요한 경우. 행의 절반에 클릭이 하나 더 필요하다면, 조건문이 들어간 테스트 하나가 아니라 테스트 두 개입니다.
- 읽을 수 없는 이름. 각 케이스 이름에 핵심 입력값을 넣어서 실패 리포트만 보고도 어느 행이 깨졌는지 알 수 있게 하세요.
- 거대한 외부 스프레드시트. 테스트와 멀리 떨어진 데이터는 리뷰하기 어렵습니다. 작은 테이블은 인라인으로 두고, 데이터가 정말 크거나 다른 사람이 관리할 때만 파일로 옮기세요.
- 가치보다 양. 같은 동등 클래스에서 뽑은 50개 행은 커버리지가 아니라 실행 시간만 늘립니다.