상태 커버리지는 모델에 있는 상태를 얼마나 방문했는지 세고, 전이 커버리지는 상태 사이의 유효한 이동을 얼마나 실행했는지 셉니다. 모든 상태를 한 번씩 방문해도 가능한 전이 중 일부를 실행하지 않을 수 있습니다.

따라서 두 지표는 분모가 다릅니다. 상태 목록과 방향 전이 목록을 각각 만들어 테스트 경로에 표시하면 상태 커버리지와 전이 커버리지를 혼동하지 않습니다.

상태는 점이고 전이는 방향이 있는 이동입니다

상태 전이 테스트는 시스템의 상태와 이벤트에 따른 이동을 모델링한 뒤, 그 모델을 따라 테스트합니다. 상태(state)는 특정 시점의 시스템 상황이고, 전이(transition)는 이벤트가 발생했을 때 한 상태에서 다른 상태로 움직이는 규칙입니다. 예를 들어 로그인 화면에서 실패 횟수가 한 번인 상황과 계정이 잠긴 상황은 서로 다른 상태입니다. 비밀번호가 맞거나 실패하거나 잠금 시간이 끝나는 이벤트가 각 상태에서 어떤 상태로 보내는지가 전이가 됩니다.

상태는 모두 보지만 전이는 두 개 빠진 경로

이 모델에는 다섯 가지 유효 전이가 있습니다. T1은 실패 0회 대기에서 잘못된 비밀번호를 입력해 실패 1회 대기로 이동합니다. T2는 실패 0회 대기에서 올바른 비밀번호를 입력해 인증 완료로 갑니다. T3은 실패 1회 대기에서 다시 틀린 비밀번호를 입력해 잠금 상태로 이동합니다. T4는 실패 1회 대기에서 올바른 비밀번호를 입력해 인증을 완료합니다. T5는 잠금 시간이 끝났을 때 실패 0회 대기로 돌아갑니다.

테스트 경로 A는 실패 0회 대기에서 잘못된 비밀번호를 입력해 실패 1회 대기로 이동한 뒤, 올바른 비밀번호를 입력해 인증 완료로 갑니다. 경로 B는 초기 상태를 다시 만든 다음 잘못된 비밀번호를 두 번 입력해 잠금 상태에 도달합니다. 두 경로를 합치면 네 상태를 모두 방문하므로 상태 커버리지는 4/4, 즉 100%입니다. 그러나 실행한 전이는 T1, T3, T4의 세 개뿐입니다. T2의 첫 입력 성공과 T5의 잠금 해제 이동은 실행하지 않았으므로 전이 커버리지는 3/5, 60%입니다.

상태 목록과 전이 목록을 따로 표시합니다

  1. 요구사항에서 서로 구별되는 상태와 초기 상태를 적습니다.
  2. 각 상태에서 발생 가능한 이벤트와 다음 상태를 화살표로 적습니다.
  3. 요구사항이 허용하지 않는 이동은 유효 전이로 세지 않습니다.
  4. 각 테스트 경로에서 방문한 상태와 실행한 전이를 서로 다른 색이나 기호로 표시합니다.
  5. 방문 상태 수/전체 상태 수와 실행 전이 수/전체 유효 전이 수를 각각 계산합니다.

모든 상태를 보았다고 모든 흐름을 시험한 것은 아닙니다

한 상태로 들어가는 전이가 여러 개일 수 있고, 그 상태에서 나가는 방향도 둘 이상일 수 있습니다. 한 경로가 잠금 상태를 방문했다고 해서 잠금 상태에서 만료 이벤트를 처리하는 전이까지 자동으로 시험한 것은 아닙니다. 반대로 여러 전이를 수행하는 긴 경로는 여러 상태를 반복 방문할 수 있으므로, 단순히 테스트 케이스 개수만 세어 coverage를 구할 수도 없습니다. 모델에서 요구한 항목을 직접 표시해야 합니다.

ISTQB CTFL v4.0.1은 상태 커버리지와 전이 커버리지 같은 기준을 구분하고, 테스트 사례를 이벤트 순서와 상태 변화의 시퀀스로 표현합니다. CT-MBT v1.1도 상태 전이 다이어그램의 상태와 전이를 모델 기반 테스트에서 coverage item으로 삼을 수 있다고 설명합니다. 이 예제의 실패 횟수 제한과 잠금 만료 시간은 이해를 돕기 위한 가정이며 보편적인 로그인 정책이 아닙니다. 실제 시스템에서는 요구사항이 정한 잠금 조건과 유효하지 않은 전이를 먼저 확인하세요.

정답을 가리고 확인해 보세요

이 글을 위해 만든 학습 예시이며 공식 기출문제나 판매 카드의 인용이 아닙니다.

모델에 상태 4개와 유효 전이 5개가 있습니다. 테스트가 상태 4개를 모두 방문하고 전이 3개를 실행했다면 두 coverage는 얼마인가요?

정답과 해설 확인상태 커버리지는 4/4, 100%이고 전이 커버리지는 3/5, 60%입니다.

상태 커버리지는 방문한 상태 수를, 전이 커버리지는 실행한 방향 이동 수를 각각 분자로 둡니다. 모든 상태를 방문해도 나가는 전이를 모두 실행했다는 뜻은 아닙니다.