본문으로 건너뛰기

Ruby World Conference 2025에서 얻은 교훈

Smart Test Suites with Ruby

작성자
발행일
2025년 12월 15일

핵심 요약

  • 1 닌자 테스팅(Ninja Testing)은 TDD 원칙을 수용 테스트까지 확장하고 확장성 있는 지속 가능성에 초점을 맞춘 새로운 테스트 방법론입니다.
  • 2 음악의 스마트 플레이리스트 개념을 차용하여 Ruby 코드로 구현된 핵심 알고리즘은 효율적인 테스트 선택 및 우선순위 지정을 가능하게 합니다.
  • 3 20년 이상의 실제 테스트 이력을 통해 검증된 이 방법은 시스템의 장기적 품질을 보장하면서 테스트 부담을 효과적으로 관리합니다.

도입

2025년 루비 월드 컨퍼런스에서 마사토시 세키(関 将俊)와 미와 후카야(深谷 美和)는 20년 이상의 실제 테스트 경험을 바탕으로 "오늘날 권장되는 테스트를 생성하는 방법"이라는 주제로 발표했습니다. 이 발표는 시스템이 성장함에 따라 모든 테스트를 매일 실행하는 것이 비현실적이지만, 테스트를 건너뛰는 것은 위험을 증가시킨다는 익숙한 문제에 대한 해결책으로 '닌자 테스팅(Ninja Testing)'을 소개했습니다. 닌자 테스팅은 TDD 원칙을 수용 테스트에까지 확장하여 대규모 시스템에서의 지속 가능성에 중점을 둔 테스트 접근 방식입니다.

닌자 테스팅의 핵심 아이디어는 스트리밍 서비스 이전의 음악 플레이어가 직면했던 문제, 즉 모든 곡을 재생하되 동일한 곡을 반복하지 않는 방법을 해결했던 ‘스마트 플레이리스트’ 개념에서 차용되었습니다. 이 아이디어는 테스트 스위트에 직접 적용됩니다.

닌자 테스팅 원칙

  • 새로 생성되거나 최근 수정된 기능이 먼저 테스트됩니다.

  • 실패한 테스트는 절대 ‘휴식’하지 않습니다.

  • 안정적인 테스트는 점진적으로 덜 자주 나타납니다.

  • 시간이 지남에 따라 모든 테스트가 실행됩니다.

  • 일일 테스트 볼륨은 의도적으로 관리 가능한 수준으로 유지됩니다.

매일 시스템은 “오늘의 권장 테스트”라고 불리는 집중된 목록을 생성합니다.

핵심 알고리즘 (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로 작성된 명시적이고 이해하기 쉬운 규칙들로 구성되어 있습니다.

‘실패’의 진정한 의미

닌자 테스팅에서 실패한 테스트는 단순히 기능이 고장 났다는 것을 의미하지 않습니다. 이는 다음과 같은 의미를 가질 수 있습니다.

  • 더 이상 의미 없는 사양

  • 기술적으로 작동하지만 잘못된 느낌을 주는 동작

  • 사용성 회귀

  • 오래된 테스트에 숨겨진 시대에 뒤떨어진 가정

이것이 그들의 접근 방식에서 수동 테스트가 여전히 중요한 이유입니다. 자동화는 프로세스를 지원하지만, 인간은 여전히 탐색합니다.

결론

이 팀은 Ruby 기반 티켓 시스템 내에서 20년간의 테스트 실행 데이터를 사용하여 이 방법을 검증했습니다. 그 결과는 오래된 테스트가 잊히지 않고, 위험 영역이 즉시 처리되며, 불필요한 테스트가 자연스럽게 드러나고, 일일 작업량 증가 없이 테스트 커버리지가 향상됨을 일관되게 보여주었습니다. 닌자 테스팅은 지속될 시스템을 위해 설계된 테스트 방식입니다. 이는 루비 개발자들이 흔히 중요하게 여기는 가치, 즉 제약 조건에 솔직할 때 단순함이 확장된다는 점을 상기시켜 줍니다. 좋은 테스트는 더 많은 테스트를 실행하는 것이 아니라, 내일을 놓치지 않으면서 오늘 올바른 테스트를 선택하는 것입니다. Ruby World Conference 2025의 이 사려 깊은 아이디어는 장기적인 품질에 접근하는 매우 루비다운 방식입니다.

댓글 0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.