닌자 테스팅의 핵심 아이디어는 스트리밍 서비스 이전의 음악 플레이어가 직면했던 문제, 즉 모든 곡을 재생하되 동일한 곡을 반복하지 않는 방법을 해결했던 ‘스마트 플레이리스트’ 개념에서 차용되었습니다. 이 아이디어는 테스트 스위트에 직접 적용됩니다.
닌자 테스팅 원칙
-
새로 생성되거나 최근 수정된 기능이 먼저 테스트됩니다.
-
실패한 테스트는 절대 ‘휴식’하지 않습니다.
-
안정적인 테스트는 점진적으로 덜 자주 나타납니다.
-
시간이 지남에 따라 모든 테스트가 실행됩니다.
-
일일 테스트 볼륨은 의도적으로 관리 가능한 수준으로 유지됩니다.
매일 시스템은 “오늘의 권장 테스트”라고 불리는 집중된 목록을 생성합니다.
핵심 알고리즘 (Ruby)
이 접근 방식의 가장 신선한 측면 중 하나는 아이디어가 Ruby 코드로 얼마나 명확하게 번역되는지 보여준다는 것입니다. 시스템의 핵심에는 ‘최근에 통과한 테스트는 잠시 쉴 수 있다’는 간단한 규칙이 있습니다.
ruby
def idle_period?(test)
return false unless test.last_result
periods = [300, 90, 28, 14, 7, 1] # days, based on importance
rest_days = periods.fetch(test.test_rate)
test.last_date > Time.now - rest_days * 24 * 60 * 60
end
테스트는 다음과 같이 선택되고 우선순위가 지정됩니다.
ruby
tests
.reject { |t| idle_period?(t) }
.sort_by { |t|
[
t.last_result ? 1 : 0, # failed tests first
t.last_date, # older tests first
t.name # stable ordering
]
}
.first(25)
복잡한 프레임워크나 숨겨진 마법 없이, Ruby로 작성된 명시적이고 이해하기 쉬운 규칙들로 구성되어 있습니다.
‘실패’의 진정한 의미
닌자 테스팅에서 실패한 테스트는 단순히 기능이 고장 났다는 것을 의미하지 않습니다. 이는 다음과 같은 의미를 가질 수 있습니다.
-
더 이상 의미 없는 사양
-
기술적으로 작동하지만 잘못된 느낌을 주는 동작
-
사용성 회귀
-
오래된 테스트에 숨겨진 시대에 뒤떨어진 가정
이것이 그들의 접근 방식에서 수동 테스트가 여전히 중요한 이유입니다. 자동화는 프로세스를 지원하지만, 인간은 여전히 탐색합니다.