본문 바로가기
Development methods

[TDD] Test Driven Development - python unittest 모듈을 사용하며

by Brian Go 2022. 6. 10.

 

거창하게 쓰기 보다는 기록하기...

TDD는 개발 기법으로, 말 그대로 '테스트에 기반한 개발 방법' 이라고 한다.

Agile한 개발 방법과도 굉장히 적합하다. 크게 다섯 단계로 나눌 수 있다:

 

  1. Add a test : 테스트 코드부터 짠다. 프로그램이 갖춰야 할 기능을 테스트 코드로 작성해서 검증한다고 생각하면 된다.
  2. Run all tests and see if the new test fails : TDD 싸이클이 첫 번째가 아니라면, 당연히 이전까지의 테스트는 모두 통과해야 한다. 거기에 더불어 1단계에서 추가한 테스트에서는 반드시 Fail이 되어야 한다. 이게 통과되면 이미 프로그램은 해당 기능을 갖추고 있다는 뜻으로, 프로그램을 개발하고 발전시키기 위한 테스터가 잘못되었다는 뜻이다.
  3. Write the codes : 새로운 테스트를 통과하는 코드를 작성한다. 이 때 코드는 지저분하고 더러워도 된다. 무조건 테스트만 통과하면 된다는 마인드로 코드를 짠다.
  4. Run tests : 짠 코드를 돌려본다. 통과하면 넘어간다.
  5. Refactor code : 짠 코드를 유지/보수가 쉽게 관리한다. 중복 제거, 가독성을 위한 변수명 네이밍 등이 이에 속한다. 리팩토링은 프로그램 개발에 있어서 중요한 개념이니 꼭 숙지해두자.

 

이 다섯 단계의 사이클을 반복적으로 수행한다. 2주에 한 번 sprint를 하는 애자일 scrum 프레임워크와도 잘 맞는 방법이다. 간단하게 이를 실제로 해 봤는데, Python 자체 모듈인 unittest 를 이용했다. 이를 이용하면 테스터를 만들 수 있다.

import unittest
from tdd import Crawler
class CrawlerTester(unittest.TestCase) :
    def test_phrase(self):
        print("========== Test1 : finding phrase in html ============")
        crwler = Crawler("http://naver.com", "네이버를 시작페이지로")
        crwler.crawl()
        self.assertEqual(["네이버를 시작페이지로"], crwler.getResult())
 

이렇게 tdd.py 파일에서 만든 Crawler 클래스에 대한 테스터를 만들 수 있다. unitttest.TestCase 객체를 상속받아 assertEqual 메소드를 이용하면 테스트를 할 수 있는데, 실패하는 경우에만 콘솔로 값을 출력하기에 테스트하기 굉장히 편하다.

이런 식으로 테스트에 소요된 시간이 출력되고, ok 또는 Fail과 Fail된 테스트를 출력한다.

 

간단하게나마 tdd를 구현해보는 것은 괜찮은 것 같다. 테스트를 하는 사람은 소프트웨어가 어떻게 작동하는지 완벽하게 숙지하고 있어야 하기 때문에, 프로그램을 이해하는 데도 도움이 된 것 같다.

시간나면 한번쯤은 해보기를 추천 !

 

'Development methods' 카테고리의 다른 글

[Agile] Agile? 그게 도대체 뭘까?  (0) 2022.06.10

댓글