RSpec Shared Examples의 실체

RSpec shared examples unmasked - SaturnCI - Continuous Integration for Ruby on Rails

작성자
발행일
2025년 11월 08일

핵심 요약

  • 1 RSpec shared examples는 테스트 코드의 DRY 원칙 적용에 대한 오해를 바탕으로 하며, 전역 변수와 유사한 문제점을 야기하여 코드 이해도를 저해합니다.
  • 2 테스트 코드의 중복은 애플리케이션 코드와 달리 항상 나쁜 것이 아니며, 명확성과 유지보수성을 위해 어느 정도의 중복은 허용될 수 있습니다.
  • 3 shared examples 대신 대표적인 테스트 케이스 선정 또는 Page Object 패턴과 같은 대안을 통해 테스트 코드의 가독성과 효율성을 높일 수 있습니다.

도입

Better Specs에서 권장하는 RSpec shared examples의 사용법에 대한 비판적 시각을 제시하며, 테스트 코드에 DRY(Don't Repeat Yourself) 원칙을 무분별하게 적용하는 것이 오히려 문제를 야기할 수 있음을 지적합니다. 이 글은 shared examples가 가져오는 숨겨진 단점을 분석하고, 테스트 코드의 본질과 효율적인 테스트 전략에 대한 깊이 있는 고찰을 제공합니다.

테스트 코드의 DRY 원칙 적용에 대한 오해

DRY 원칙은 지식이나 행위의 중복이 불일치를 초래할 때 유효합니다. 그러나 테스트 코드는 애플리케이션 코드와 달리 ‘임의적(arbitrary)’이라는 특성을 가집니다. 테스트는 애플리케이션의 ‘명세(specification)’ 역할을 하지만, 테스트 자체는 다른 제약에 묶이지 않습니다. 따라서 테스트 코드의 동일한 두 부분이 반드시 ‘중복’으로 간주되지 않으며, 한쪽이 변경되어도 버그로 이어지지 않을 수 있습니다. 테스트 헬퍼 코드에는 애플리케이션 코드와 동일한 DRY 원칙이 적용됩니다.

RSpec Shared Examples의 문제점

Shared examples는 let!uri 정의 후 it_behaves_like를 호출하는 방식이 전역 변수를 설정하고 이를 사용하는 함수를 호출하는 것과 유사하게 작동합니다. 이는 다음과 같은 문제점을 야기합니다:

  • 넓은 스코프와 낮은 예측 가능성: 전역 변수처럼 스코프가 넓어 정의된 곳에서 사용처를 파악하기 어렵고, 사용처에서 정의를 알기 어려워 변경의 안전성을 예측하기 어렵습니다. 이는 캡슐화와 상반됩니다.

  • 낮은 가독성과 유지보수성: it_behaves_like 'a normal dog'와 같이 문자열로 동작을 호출하는 방식은 해당 shared example의 정의를 찾기 어렵게 만들어 유지보수를 더욱 복잡하게 합니다.

테스트 중복과 효율성

테스트의 목표는 100% 커버리지 자체가 아닌 실질적인 이점 확보입니다. 여러 기능이 유사한 동작을 공유할 때, 모든 케이스를 테스트하기보다 ‘대표적인 샘플’을 테스트하는 것이 효율적일 수 있습니다. 첫 테스트에서 얻는 이점은 크지만, 유사한 코드를 커버하는 추가 테스트에서 얻는 이점은 점차 감소합니다.

Shared Examples의 대안

테스트 내 CSS 셀렉터와 같은 중복을 줄이고 가독성을 높이기 위해 Page Object 패턴을 활용할 수 있습니다. Page Object는 테스트의 추상화 수준을 높여 더 적은 코드로 동일한 목적을 달성하게 하며, shared examples처럼 의미를 모호하게 만들지 않으면서 중복 코드를 줄이는 긍정적인 효과를 가져옵니다.

결론

Better Specs의 "테스트 스위트를 DRY하게 만들라"는 조언은 테스트 코드의 특성에 대한 오해에서 비롯된 것입니다. Shared examples는 전역 변수와 유사한 문제점을 야기하여 코드의 이해도와 유지보수성을 저해합니다. 테스트 코드에서는 애플리케이션 코드와 다른 DRY 원칙이 적용되어야 하며, 명확성과 예측 가능성을 위해 의도적인 중복은 허용될 수 있습니다. 효율적인 테스트 전략은 모든 중복 제거보다 Page Object와 같은 패턴을 활용하여 가독성과 유지보수성을 높이는 데 초점을 맞춰야 합니다. Shared examples는 RSpec의 가장 좋지 않은 기능 중 하나로 폐기되어야 합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!