[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을 어떻게 시작해야할까?
테스팅을 할 수 있는 가장 쉬운 방법은 버그를 수정하는 방법이다.
첫번째로, 버그를 발견하고 그다음에 버그를 고칠 수 있는 최소한의 코드를 작성하고 마지막으로 테스트를 다 통과 할 때까지 코드를 수정하는 것이다.
앞서 말한것처럼 해서 테스팅을 시작 할 수 있고 이제 새로 작동해야하는 기능을 추가 할 때 최소한의 테스트를 만들고 그 테스트를 통과하는 코드들을 완성하는 방향으로 시작하면 된다.