테스트 실패 다루기

테스트 실패 다루기 (Test Failure)

테스트가 실패했다는 사실을 Zig가 어떻게 알려주는지, 그리고 그 실패를 하나씩 짚어낼 수 있게 해 주는 출력이 어떤 모양인지 함께 살펴볼게요. 테스트 규모가 커질수록 '어떤 테스트가 왜 실패했는지'를 정확히 알 수 있다는 게 얼마나 중요한지는 아실 거예요.

출처: Zig Documentation

본문

기본 테스트 러너는 테스트에서 반환된 error를 검사해요. 테스트가 오류를 반환하면 그 테스트는 실패로 간주하죠. 그리고 그 오류의 error return trace가 표준 오류(standard error)로 출력돼요. 모든 테스트가 끝난 뒤에는 실패한 총 개수가 함께 보고됩니다.

예시로 직접 확인해 볼게요. 하나는 의도적으로 실패하고, 다른 하나는 성공하는 테스트입니다.

const std = @import("std");

test "expect this to fail" {
    try std.testing.expect(false);
}

test "expect this to succeed" {
    try std.testing.expect(true);
}

zig test로 이 파일을 실행하면 결과가 이렇게 나와요.

$ zig test testing_failure.zig
1/2 testing_failure.test.expect this to fail...FAIL (TestUnexpectedResult)
/home/ci/work/zig-bootstrap/out/host/lib/zig/std/testing.zig:584:14: 0x1253929 in expect (std.zig)
    if (!ok) return error.TestUnexpectedResult;
             ^
/home/ci/work/zig-bootstrap/zig/doc/langref/testing_failure.zig:4:5: 0x1253a19 in test.expect this to fail (testing_failure.zig)
    try std.testing.expect(false);
    ^
2/2 testing_failure.test.expect this to succeed...OK
1 passed; 0 skipped; 1 failed.
error: the following test command failed with exit code 1:
/home/ci/work/zig-bootstrap/out/zig-local-cache/o/bd5a4bd64ea82fc13b299f01400d70a7/test --seed=0x6ff32eae

expect this to fail 테스트가 TestUnexpectedResult 오류로 실패했다고 표시되고, expect this to succeed 테스트는 OK로 통과했어요.

출력의 흐름을 하나씩 정리하면 이렇습니다.

  • 실패한 테스트는 ...FAIL (TestUnexpectedResult)처럼 어떤 오류 때문에 실패했는지가 표시돼요.
  • 그 아래로는 오류가 발생한 위치가 역추적(return trace)된 스택이 출력돼요. 어느 코드 라인에서 오류가 나왔는지 짚어주죠.
  • 모든 테스트가 끝나면 N passed; N skipped; N failed. 요약이 나옵니다. 여기서는 실패가 하나라서 1 failed.로 표시됐어요.
  • 실패한 테스트가 있으면 zig testexit code 1로 종료돼요. CI 같은 환경에서 이 종료 코드가 곧 실패 신호로 이어지죠.

테스트 하나가 실패했다고 해서 나머지 테스트가 멈추는 건 아니에요. 1/2, 2/2라는 진행 표시에서 보듯 모든 테스트를 돌린 뒤 실패 개수를 모아 보고합니다. 전체가 아닌 특정 테스트를 골라 실행하고 싶을 땐 다음 섹션에서 다룰 Skip Tests를 참고하면 돼요.

더 알아보기

  • Errors — 테스트 구성의 핵심이 되는 Zig 오류 처리 전반.
  • Error Return Traces — 실패가 보여주는 오류 역추적이 어떻게 만들어지는지.
  • std.testing.expect 의 동작과 TestUnexpectedResult 같은 표준 테스트 오류는 직접 시도해 보면 금방 와닿아요.