[Python] 왜 pytest를 쓰는걸까?

pytest를 썼을 때의 장점을 http://halfcooked.com/presentations/pyconau2013/why_I_use_pytest.html 의 링크에서 번역해 간단하게나마 정리를 해보았다.


Unit Testing이란?

  • Unit Testing이란 어플리케이션이나 모듈의 각각 유닛들이 작성한대로 작성하는지 확인하는 반복적인 작업이다.

  • Unit Testing의 핵심은 각각 테스트들이 서로 분리되어 있으며, 실행은 자동화되고, 테스트들은 당신이 만든 어플리케이션의 일부와 같은 부분을 실행한다는 것이다.


Unit Test를 왜 해야 할까?

다른 이유보다 앞서서 하는 이유는 “내 코드가 잘 작동하는지 확인하기 위해서”라는 것은 모두다 알고 계실겁니다.

Unit Test는 우리가 “어떻게” 코드를 작성할지 생각하는데 도움을 주게되며 나아가 테스트를 추가함을 통해서 당신의 코드를 줄일 수 있게되고 이러한 점들은 당신이 이해하고 테스트하는데 다시 또 도움을 주게 됩니다.

많은 작업을 하는 코드를 테스트 하는것은 어려우며 또한 디버깅하기도 어렵다. 이 문제의 해결은 코드가 많은 작업을 하지 않도록 하게 하는 것이며 그렇기에 함수 하나는 하나의 기능만 하도록 하고 이를 테스트 하게 하는것이다.

“그리고”라는 말을 표현해서 코드를 설명해야 한다면 그 코드는 줄일 수 있어야 한다.(하나의 함수는 하나의 기능만을 구현해야 하기 때문에)

Unit Test의 다른 장점로는 문제를 찾기 쉽다는 점, 변화를 가능하게 한다는 점, 디자인을 개선시키고 통합을 단순화 할 수 있다는 점들이 있다.


Unit Test 라이브러리들

테스트 라이브러이에는 대표적으로 unittest(파이썬 기본 내장 모듈)와 pytest가 있는데 저 본문에는 pytest를 선호한다고 나와있다.

그 이유는 코드를 비교적 더 간단하게 만들 수 있고 필요할 떄 더 많은 기능들을 강력하게 제공해주기 때문이라고 한다.

아래와 같은 코드를

from parse_conn import parse_connection
import unittest

class InvalidInputs(unittest.TestCase):
    def testNoAt(self):
        """parse_connection should raise an exception for an invalid connection string"""
        self.assertRaises(ValueError, parse_connection, 'invalid uri')

if __name__ == "__main__":
    unittest.main()

다음과 같이 바꿀 수 있다고 한다.

from parse_conn import parse_connection
import py.test

def test_not_at():
    py.test.raises(ValueError, parse_connection, 'invalid uri')

한눈에 봐도 비교적 코드가 많이 간결해졌음을 알 수 있다.


그러면 Unit Testing을 어떻게 시작해야할까?

테스팅을 할 수 있는 가장 쉬운 방법은 버그를 수정하는 방법이다.

첫번째로, 버그를 발견하고 그다음에 버그를 고칠 수 있는 최소한의 코드를 작성하고 마지막으로 테스트를 다 통과 할 때까지 코드를 수정하는 것이다.

앞서 말한것처럼 해서 테스팅을 시작 할 수 있고 이제 새로 작동해야하는 기능을 추가 할 때 최소한의 테스트를 만들고 그 테스트를 통과하는 코드들을 완성하는 방향으로 시작하면 된다.


참고자료