Canvas 1 Layer 1

R스펙과 가드를 활용한 루비 테스트 자동화

들어가며

프로그래밍 언어 루비Ruby의 테스트 도구로는 미니테스트minitest와 R스펙Rspec이 많이 사용됩니다. 저는 R스펙을 주로 사용합니다만, 어느 쪽이건 테스트를 매번 직접 실행하기는 귀찮은 일입니다. 이를 자동화하기 위해서 과거에는 오토테스트Autotest 같은 툴을 사용했었습니다. 오토테스트를 사용하면 특정 파일이 수정되었을 때 테스트를 자동으로 실행해줍니다. 현재는 오토테스트 대신에 가드Guard를 많이 사용하는데, 가드는 특정한 파일을 감시하다가 파일에 변화가 있을 때 특정한 명령어를 수행하는 좀 더 범용적인 툴입니다. 이 글에서는 가드를 사용해 R스펙 테스트를 자동화하는 법을 소개합니다.

스프링(Spring) - 루비 온 레일스 프로로더

먼저 테스트 속도 향상을 위해 루비 온 레일스 프리로더인 스프링Spring을 설정합니다. 자세한 사항은 스프링 깃허브GitHub 저장소를 참조해주세요. 간단한 사용법은 명령어 앞에 spring을 붙여주면 됩니다. 별도로 스프링 서버 실행 명령어를 사용할 필요가 없으며, 명령어를 처음 실행할 때 스프링 서버가 자동으로 실행됩니다.

# spring 설정 전 테스트
# rvm 사용시 bundle exec 는 생략하셔도 됩니다.
$ bundle exec rake rspec

# spring 설정 후 테스트
$ bundle exec spring rake rspec

테스트를 지속적으로 실행하므로 스프링을 사용하는 편이 압도적으로 속도가 빠릅니다. 가끔씩 스프링 서버에 문제가 생겨서 정상적으로 동작하지 않는 경우가 있습니다. 이런 경우엔 다음 명령어로 스프링 서버를 종료하고 재실행하면 됩니니다.

$ bundle exec spring stop

가드(Guard) - 파일 변화 감시 도구

spec 폴더의 테스트를 실행하는 것은 rake면 충분합니다만, 작업과정의 변경사항에 대한 자동적인 테스트를 실행시키기 위해서는 가드Guard가 필요합니다. 가드는 파일을 감시하다가 특정 파일이 변경되면 이에 대응하는 스크립트를 실행합니다. 파일 감시 대상과 파일 변경시 실행하는 명령어는 Guardfile에 정의합니다. 아래의 명령어로 초기화합니다.

$ bundle exec guard init rspec

가드는 스프링과는 별개로 작동하며 가드에서 파일 변화를 캐치해서 테스트를 실행할 때만 내부적으로 스프링을 사용합니다. 스프링과 연동시켜주기 위해서 아래의 설정을 Guardfile에 추가해줍니다.

레일스 어플리케이션의 루트에서 아래의 명령어로 가드를 실행할 수 있습니다.

$ bundle exec guard

보통은 티먹스Tmux나 스크린Screen에서 하나의 윈도우를 열어놓고 사용하는 게 일반적입니다. 이렇게 하면 다른 윈도우나 텍스트 에디터에서 루비 온 레일스 애플리케이션 파일이나 테스트 파일을 변경했을 때 가드가 자동으로 변경사항을 알아채서 테스트를 실행시켜줍니다. 따라서 테스트 결과를 계속 확인하면서 코딩할 수 있습니다. 또한 가드 프로그램 내에서 여러가지 명령어를 실행시킬 수 있으며, 명령어 없이 엔터를 입력하면 전체 테스트를 실행해줍니다. 가드는 단순히 R스펙 자동화를 위해 만들어 진 젬이 아니기 때문에, 큐큠버Cucumber나 서버 재실행 등 자동적으로 다른 작업을 실행하는 데도 유용합니다.

테스트 결과에 대한 알림은 우분투의 경우 알림을 시스템 쪽으로 보내주며, 맥OSmacOS의 경우는 그라울growl과 연동해서 사용하는 게 보통입니다. 다양한 알림 지원에 대해서는 가드의 깃허브 저장소 좀 더 자세히 나와있으니 참조하시면 될 것 같습니다.

R스펙(Rspec) 설정하기

R스펙을 실행하는 데 기본 옵션 설정은 홈 디렉토리의 .rspec 파일이나, 루비 온 레일스 애플리케이션 루트의 .rspec 파일에 기록합니다.

# 테스트 결과에 색을 입혀 출력해줍니다.
--colour

# 테스트 실행 결과에 테스트 이름을 같이 보여줍니다. rspec을 사용하면
  기본적으로 테스트를 .으로 출력하는데, 이게 불편하실 때 사용하시면
  됩니다.
--format d