본문으로 건너뛰기
SDETRole
SDETRole

용어집 · 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개 행은 커버리지가 아니라 실행 시간만 늘립니다.

SDETRole 전체에서 검색할 내용을 입력하세요.

Pagefind 전문 검색 · 브라우저에서 실행됩니다 검색 페이지 열기 →