본문 바로가기
Ruby on Ralis

rspec테스트에 중복을 없애보았다

by sky1to 2024. 6. 1.

생각하게 된 계기

rspec을 쓰다 보면 애플리케이션 로직처럼 중복되는 코드가 많이 발생한다.
한 두개의 테스트라면 그렇게 까지 시간이 걸리지 않겠지만 점점 비슷한 코드가 늘어나면 같은 테스트 코드도 늘어나게 된다.
새로운 프로덕트를 만들기 시작하면서 이번 기회에 좀 정리해 놓으면 좋겠다고 생각하여 블로그에도 글을 올려본다.

shared_examples, shared_contexts

이번에 사용해보았던 메소드는shared_examples, shared_context이다.

두 메소드에 대한 설명은 개인적으로 정리해보면 아래와 같은 형식으로 나누고 있는 것 같다.

 

shared_examples: 기대치에 대한 검증을 모아두기 위해 사용
shared_context: 조건을 모아두기 위해 사용

 

글 만 보면 확 와닿지 않은 부분이 있을 것 같은데, 예시를 보면 좀 더 가깝게 다가올 것 같다.
실제로 작성했던 코드를 조금 변경해서 작성해보았다.

shared_examples

먼저 it문을 공통화하는 코드를 작성해보았습니다. 권한에 대한 코드를 작성해야 할 필요가 있는데 이번 기회에 정리 해보았습니다.

shared_examples "admin권한 만 접속할 수 있는지 테스트" do  
  context "admin권한이 아닐 경우" do  
    let(:level) { :general }  

    it "404스테이터스를 반환" do  
      subject  

      expect(response).to have_http_status(:not_found)  
    end  
  end  

  context "admin권한인 경우" do  
    let(:level) { admin }  

    it "200스테이터스를 반환" do  
      subject  

      expect(response).to have_http_status(:ok)  
    end  
  end  
end

# 실제사용 할 때 코스
context 'test' do
  it_behaves_like 'admin권한 만 접속할 수 있는지 테스트'
end

shared_contexts

실제로는 메소드로 만들어도 되지만 이해를 위해 예시를 하나 만들어 봤다.
아래와 같이 테스트를 하기 위한 조건이나 변수등을 정리하는데 사용하면 좋을 것 같다.

shared_context "로그인" do  
  let(:user) { create(:user) }

  before do
    sign_in user
  end
end

 

마무리

이번에 처음으로 직접 테스트 공통화를 진행해보았다. 테스트 공통화를 진행하면서 역시 중요한 것은 의존 관계를 최대한 줄이는 것이 중요한다고 생각했다🤔 어떤 환경에서도 최소한의 변수를 이용해 사용할 수 있어야 더 많은 곳에서 사용할 수 있고 더 많은 중복 코드를 줄일 수 있기 때문이다. 목표는 테스트를 공통화해서 템플릿으로 만들어서 최소한의 테스트는 빠르게 만들어내가는 것이 목표이다.

 

아직 시작단계에 불과 하지만 테스트에 중복을 줄이면서 어디까지 중복을 줄일지에 대해 고민해 볼 수 있어 좋은 시간이었다.

추가적으로 이번에 rails사용으로 유명한 gitlab과 sholify, forem의 코드를 직접 보고 공부 할 수 있어 좋았다.
디렉터리 폴더에 대해 고민할 때 참고하면 좋을 것 같다.

 

사용법에 대한 내용은 rspec 홈페이지를 보시면 됩니다!
https://rspec.info/features/3-12/rspec-core/example-groups/shared-context/