tester.vim
tester.vim - so you can test and fix more easily in Vim
tester.vim은 vim으로 TDD를 더 손쉽게 해주기 위해 개발하였습니다. (개발 스토리 보러 가기)
소스 코드도 보랴 테스트 코드 보랴, 또 테스트까지 실행하랴 번거로우시죠?
tester.vim에서는
vim의 make 기능을 활용하여 vim 자체에서 test를 실행하고 결과를 quickfix list에 보여주는 것은 물론,
소스 코드와 테스트 코드 사이를 자유롭게 오갈 수 있는 기능을 제공합니다.
설치법
다운로드는 여기서 받으세요: http://github.com/jangxyz/tester.vim
사용법
덧셈을 하는 python 코드를 TDD로 개발한다고 합시다.
먼저 테스트 코드:
- # test/add_test.py
- import unittest
- import add
- class AdditionTestCase(unittest.TestCase):
- def test_add_takes_two_arguments_and_return_the_sum(self):
- x, y = 3, 2
- self.assertEqual(add.add(x,y), x+y)
- def test_add_can_take_multiple_arguments(self):
- self.assertEqual(add(1,2,3,4,5), 15)
그리고 소스 코드:
- # add.py
- def add(*args)
- return sum(args)
- end
테스트를 작성하고, 코드를 만들고 실행하는 단계를 거치려면 보통 여러개의 화면과 테스트를 실행하기 위한 쉘도 띄워야 합니다.
Vim에서는 기본적으로 make 명령을 이용해 별다른 쉘을 띄우지 않고 사용할 수 있게 해줍니다.
tester.vim을 이용하면 하나의 Vim 화면에서 3가지 작업을 모두 할 수 있습니다.
먼저, add.py가 떠 있을 때,
:T를 입력하면 테스트 파일인 add_test.py 파일로 이동합니다.
여기서 다시 :T를 입력하면 add.py로 돌아옵니다. 이 때, 언제 갔었냐는 듯 떠나기 전에 저장돼 있던 위치 그대로 돌아옵니다.
이번에는 add.py 파일에서 :TT를 눌러볼까요?
AdditionTestCase에 있는 두 메소드 test_add_takes_two_arguments_and_return_the_sum()와 test_add_can_take_multiple_arguments()가 모두 테스트됩니다.
그런데 저런! 에러가 있군요. 이때 quickfix list가 열리면서 에러가 표시되고, 어느새 화면은 정확하게 에러가 난 곳으로 이동해 있습니다.
에러를 고치고 다시 :TT 명령을 내리니 이번에는 그 테스트 하나만 수행하고 OK가 나는군요 ![]()
테스트 코드에서 :TT를 입력하면 현재 줄이 있는 테스트 메소드 하나만 검사하고(테스트 메소드 안에 있지 않으면 여러개를 수행하겠죠).
소스 코드에서 :TT를 입력하면 테스트 코드로 이동해서 해당 줄에 맞는 테스트 메소드를 검사합니다.
만약 모든 테스트를 돌고 싶으면, :TA를 눌러보세요. tester.vim이 찾을 수 있는 범위 내에서 모든 테스트를 돌려보려고 시도합니다.
기능
- :T 명령어도 손쉬운 소스 코드 <-> 테스트 코드 간 이동
- :TT 명령으로 테스트 코드 실행
- :TA 명령으로 모든 테스트 코드 실행 (makeprg이 설정돼 있어야 합니다)
- :TA!, :TT! 지원(make와 make! 차이 - 에러가 발견되면 그리로 이동하느냐 마느냐)
- 에러 결과는 QuickFix list에 표시
주의점
- 현재는 python용으로 제작되었습니다.
-
테스트 파일을 찾는 방법은 사람마다 다를 수 있습니다.
이 정보는 tester.vim 파일 내부에 s:test_directory, s:test_filename_prefix, s:test_filename_suffix에 저장돼 있습니다.-
기본적으로 ./test 디렉토리에 _test.py로 끝나는 파일을 테스트 파일로 간주합니다. (예: ./add.py 의 테스트 파일은 ./test/add_test.py)
- s:test_directory = "test"
- s:test_filename_prefix = ""
- s:test_filename_suffix = "_test"
-
같은 디렉토리에 "test_"로 시작하는 파일로 바꾸고 싶다면 (예: ./test_add.py) 다음과 같이 고치면 됩니다:
- s:test_directory = ""
- s:test_filename_prefix = "test_"
- s:test_filename_suffix = "test"
-
-
테스트 코드에서 :TT 명령시 하나의 테스트만 실행하는 기능에는 주의할 점:
-
현재는 줄 단위로 메소드와 클래스 검사를 하게 돼 있습니다. 블록주석 안에 메소드가 들어 있다 하더라도 오인할 겁니다.
- 메소드 검사 패턴: def test어쩌구(self):
- 클래스 검사 패턴: class 어쩌구(unittest.TestCase):
- 소스 코드에서 누르면, 먼저 테스트 코드로 이동해서 위치해 있는 줄에 해당하는 테스트 메소드를 찾습니다. 이동한 적이 없으면 전체 테스트를 실행할 가능성이 높습니다.
-
-
전체테스트(:TA) 명령시 주의할 점
- 기본적으로 모든 테스트 코드들이 어디에 있을지 짐작하긴 어렵습니다. makeprg 옵션에 전체를 테스트할 수 있는 프로그램을 알려주세요.
- 없으면, Integration with Python PyUnit testing framework 문서에 나와 있는 범용 alltests.py 파일을 실행합니다. 테스트 파일 이름짓는 방식에 따라 찾지 못할 수도 있습니다.
Change
- 소스 코드에서도 :TT를 입력하면 하나의 테스트 메소드만 실행할 수 있도록 작동 방식을 변경했습니다. (2009.3.29)
Comments (0)