버그를 고치기 전에 RED를 먼저 확인하려고, 대상 테스트 하나만 골라 돌렸습니다.
xcodebuild test -only-testing:<타깃>/<스위트>/<함수명>질문 하나 드리겠습니다. 당신은 테스트 출력에서 "성공" 말고 무엇을 읽습니까? 실행 건수를 읽습니까?
1. 매칭 실패가 에러가 아닙니다
새 테스트 프레임워크(@Test 매크로 방식)에서는 -only-testing이 매칭에 실패해도 에러가
아닙니다. 0건을 실행하고 이렇게 찍습니다.
✔ Test run with 0 tests in 1 suite passed
** TEST SUCCEEDED **RED를 확인하려던 실행이 초록으로 끝났습니다. 그래서 "가드가 이미 있는 줄"로 오독했습니다. 한 번 더 돌려 봤기 때문에 잡혔습니다.
TEST SUCCEEDED만 보면 0건과 전건 통과가 구분되지 않습니다.
2. 이건 도구 결함이라기보다 제 확인 절차의 결함입니다
정직하게 적습니다. 실행 건수를 읽지 않은 건 저입니다.
같은 날 다른 앱에서 "테스트가 안 돌았다"고 반대 방향으로 오판한 적도 있습니다. 그쪽은 카운터가 두 종류인 걸 몰라서였습니다.
왜 매칭 실패가 에러가 아닌지는 모릅니다. 구 프레임워크에서 같은 오타를 내면 실패합니다.
이 함정은 자동화에서 특히 나쁩니다. CI나 스크립트는 종료 코드만 봅니다. 종료 코드는 0건과 전건 통과를 절대 구분하지 못합니다. 같은 배치의 빌드 세팅 하나가 61건을 부팅 중에 죽인 이야기와 헤더 타이머가 무엇을 해도 통과시킨 이야기가 자매편입니다. 검증 단계가 실제로 검증하지 않던 이야기와 폴백이 판을 초록으로 유지하던 이야기도 같은 계열입니다.
3. 당신이라면 이 출력을 어떻게 믿으시겠습니까
** TEST SUCCEEDED **- (a) 종료 코드가 0이니 통과
- (b) 실패 건수가 0이니 통과
- (c) 실행 건수가 기대와 같으니 통과
(a)와 (b)는 0건 실행에서도 참입니다. 분모를 안 보는 판정입니다. 답은 (c)뿐입니다.
4. 그래서 정한 규칙
스위트 단위로 줍니다. 함수명까지 주지 않습니다.
-only-testing:<타깃>/<스위트>출력에서 건수를 반드시 읽습니다. 그리고 프레임워크가 섞여 있으면 카운터가 둘입니다.
Executed N tests, with M failures ← 구 프레임워크
Test run with N tests in K suites ← 새 프레임워크⚠️ 한쪽만 grep 하면 Executed 0 tests를 보고 "테스트가 안 돌았다"고 오판합니다. 새
프레임워크로 쓰인 스위트가 섞인 앱이 실제로 있었습니다. 앞의 함정과 정확히 반대 방향으로
틀리게 만듭니다.
5. 같은 부류의 함정 둘
- 프로젝트 파일에 등록되지 않은 테스트 파일은 아예 안 돕니다. 새 UI 테스트 파일을 만들면 자동으로 안 들어가므로, 이미 등록된 파일 안에 클래스를 추가하는 편이 확실합니다. 프레임워크는 파일이 아니라 클래스를 찾습니다.
- 안드로이드 계측 테스트는
--tests를 못 받습니다. 러너 인자로 줘야 합니다.
./gradlew connectedDebugAndroidTest \
-Pandroid.testInstrumentationRunnerArguments.class=<FQCN>6. 규칙: "RED 확인"을 초록불로 끝내지 않는다
실행 건수가 기대와 같은지 보고, 최소 한 번은 음성 대조(고친 부분을 되돌려 실패하는지)를 합니다.
음성 대조가 없으면, 당신이 확인한 것은 "테스트가 통과한다"이지 "테스트가 그것을 본다"가 아닙니다. 이 둘은 다른 주장입니다.
자가진단 3가지
- 당신의 CI는 실행 건수를 기록합니까? 종료 코드만 본다면 0건 실행이 초록으로 통과합니다.
-only-testing이나--tests필터를 쓸 때 오타를 내면 무슨 일이 일어나는지 확인해 보셨습니까? 한 번 일부러 틀려 보면 됩니다.- 버그 수정 전 RED를 실제로 봤습니까? 초록으로 끝난 RED 확인은 확인이 아닙니다.
솔직한 부분
이 글에서 제가 얻은 건 함정 지식이 아니라 습관 하나입니다. 이제 테스트 출력에서 제일 먼저 찾는 게 숫자입니다. "성공"이라는 단어는 그다음입니다.
건수를 안 읽었을 때 저는 두 방향으로 다 틀렸습니다. 한 번은 0건을 통과로 읽었고, 한 번은 멀쩡히 돈 테스트를 안 돌았다고 읽었습니다. 같은 날 두 번입니다.
지금 딱 하나만 해 보세요. 테스트 필터에 없는 이름을 일부러 넣고 돌려 보십시오. 당신 도구가 에러를 내는지, 아니면 초록으로 끝나는지 30초면 알 수 있습니다.