Dev/SW Engineering

[TDD] Python Testing Framework - Pytest, unittest - Coverage

HJChung 2021. 8. 16. 10:42

1. Coverage

Code Coverage에 대해서는  <코드 커버리지(Code Coverage)가 뭔가요?> 를 보고 쉽게 이해할 수 있었습니다. 

  1. Installation: $ pip install coverage
  2. Unittest: $ coverage run --branch -m unittest
  3. Pytest: $ coverage run --branch -m pytest
  4. Use $ coverage report -m to report on the results
  5. $ coverage html to get annotated HTML listings detailing missed lines

2. Coverage report tool Codecov + Github Actions

Github actions에서 main 브랜치에 push 나 PR을 하면 pytest와 unittest를 자동으로 실시하고, coverage 측정을 하도록 할 수 있습니다. 

그리고 coverage report tool인 codecov 봇을 사용하도록 설정하여서 coverage 결과를 comment 형식으로 보여질 수 있도록 할 수 있습니다. 

3. Unittest vs Pytest

    • unittest에서 assertEqual 같은 테스트용 메소드를 사용했던 것과 달리, Pytest에서는 파이썬의 assert 문을 사용하여 대부분의 테스트를 할 수 있습니다.
      Unittest에서도 assert문을 써서 작성할 수 있지만 테스트용 메소드로 검사해주었을 때 에러가 발생하면 테스트에러로 인식하지만 assert문에서 에러가 나면 그냥 에러로 인식합니다. 
      또한 pytest는 unittest와 호환이 되어서 unittest로 작성된 테스트까지 모두 테스트해주지만 unittest에서는 pytest 코드를 테스트해주지 않습니다.
      self.assertEqual(a, b) ->  테스트 에러
      assert a==b ->  에러

      아래의 코드의 테스트 코드를 짜본다고 할 때,
      def add(a, b):
      	return a+b

      Unittest로 짤 경우, 테스트용 메소드로 잘 못 작성하였을 때는 AssertionError: 3!=4 처럼 어디가 일치하지 않는지 나타내주면서 테스트에러로서 결과를 출력해줍니다.
      class Add_testing(unittest.TestCase):
      	def test1(self):
          	self.assertEqual(add(1, 2), 4)


      반면 assert문으로 잘 못 작성하였을 때는 그냥 Assertion에러를 반환하고 끝납니다. 
      class Add_tesing(unittest.TestCase):
      	def test1(self):
          	assert add(1, 2) == 4​

      pytest로 작성 할 때는 assert문으로 작성하고, 그 때도 어디가 일치하지 않는지 나타내주면서 테스트에러로서 결과를 출력해줍니다.
      def test_add_num():
      	assert add(1, 2) == 4
      pytest의 테스트 결과가 좀 더 보기 쉬웠어요...😌
      • Fixture를 통해 테스트 의존 자원을 모듈화: Pytest에서는 테스트의 독립성과 자원 재사용 사이의 조화를 위해 다양한 fixture를 제공합니다. 그리고 각 테스트 케이스에서 필요로하는 fixture를 Dependency Injection의 형태로 선택적으로 쉽게 사용할 수 있으며 scope 마다 재사용의 범위를 적용할 수 있습니다.
      • pytest는 다양한 플러그인을 지원합니다.
        병렬 테스트: 테스트를 병렬적으로 수행할 수 있도록 합니다. 하나의 테스트가 끝나지 않아도 다른 테스트를 수행할 수 있어 테스트 시간이 단축됩니다.

 

지금까지 Python test framework인 Unittest와 Pytest에 대해 알아본 것을 정리해보았습니다.🙏🏻

 

 

Reference

Coverage.py 공식홈페이지

코드 커버리지(Code Coverage)가 뭔가요? - 우아한테크코스

About the Codecov yaml
Codecov vs Coveralls