10.1 Tag, Annotation, Filtering
Tag는 실행 대상을 선택하고 report를 분류하는 안정된 metadata입니다. File path와 test title만으로 운영 정책을 표현하면 directory 개편이나 copy 수정에 쉽게 깨집니다.
Tag 설계 축
| 축 | 예 | 용도 |
|---|---|---|
| 속도 | @smoke, @regression | PR/nightly 범위 |
| 제품 영역 | @auth, @billing | ownership, filter |
| test 성격 | @visual, @a11y, @destructive | 환경, artifact 정책 |
| 외부 의존 | @payments-sandbox | secret, service availability |
한 test에 tag를 너무 많이 붙이면 의미가 약해집니다. 조직이 실제로 filtering이나 reporting에 사용하는 축만 유지합니다.
test('사용자가 로그인한다', {
tag: ['@smoke', '@auth'],
annotation: {
type: 'requirement',
description: 'AUTH-LOGIN-001',
},
}, async ({ page }) => {
// ...
});
실행 filtering
npx playwright test --grep @smoke
npx playwright test --grep-invert @visual
npx playwright test --grep '(?=.*@auth)(?=.*@smoke)'
Tag는 @로 시작합니다. Shell마다 quoting 규칙이 다르므로 CI script에서는 regex를 quote하고 같은 command를 local에서도 재현합니다.
Built-in annotation의 의미
test.skip()— 해당 조건에서 적용할 수 없어 실행하지 않음test.fixme()— 알려진 문제로 실행 비용이나 crash 위험 때문에 실행하지 않음test.fail()— 실행하며 실패가 현재 예상임을 명시test.slow()— timeout budget을 늘려야 하는 의도적 slow case
test('WebKit 전용 제한', async ({ page, browserName }) => {
test.skip(browserName !== 'webkit', 'WebKit behavior만 검증');
// ...
});
skip은 결함의 묘지가 되기 쉽습니다. Issue, owner, 만료일을 annotation이나 관리 시스템에 연결합니다.
Runtime annotation
test('주문을 만든다', async ({ page }, testInfo) => {
testInfo.annotations.push({
type: 'environment',
description: process.env.TEST_ENV ?? 'local',
});
});
Credential이나 개인 식별자를 annotation에 넣으면 report와 artifact를 통해 노출될 수 있습니다.
실습
- Lab test에
@smoke,@network,@visualtag를 부여합니다. - Smoke만 10초 안에 실행하는 command를 만듭니다.
- Known issue에
fixme대신fail이 맞는 경우를 구분합니다. - HTML report에서 annotation이 어떻게 보이는지 확인합니다.