1. Coverage
Code Coverage에 대해서는 <코드 커버리지(Code Coverage)가 뭔가요?> 를 보고 쉽게 이해할 수 있었습니다.
- Installation: $ pip install coverage
- Unittest: $ coverage run --branch -m unittest
- Pytest: $ coverage run --branch -m pytest
- Use $ coverage report -m to report on the results
- $ 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
- Fixture를 통해 테스트 의존 자원을 모듈화: Pytest에서는 테스트의 독립성과 자원 재사용 사이의 조화를 위해 다양한 fixture를 제공합니다. 그리고 각 테스트 케이스에서 필요로하는 fixture를 Dependency Injection의 형태로 선택적으로 쉽게 사용할 수 있으며 scope 마다 재사용의 범위를 적용할 수 있습니다.
- pytest는 다양한 플러그인을 지원합니다.
지금까지 Python test framework인 Unittest와 Pytest에 대해 알아본 것을 정리해보았습니다.🙏🏻
Reference
'Dev > SW Engineering' 카테고리의 다른 글
[MSA, Monorepo] 사내 모노레포 도입기에 대해서 글을 썼다. (0) | 2024.03.08 |
---|---|
[Lecture] DDD 기반 MSA 모델링 - Intro, Strategic Design, Event Storming (0) | 2023.05.31 |
[TDD] Python Testing Framework2 - Pytest, Unittest - mocking (0) | 2021.08.16 |
[TDD] Python Testing Framework 1 - Pytest, unittest (0) | 2021.05.21 |
[TDD] 통합 테스트(Integration Test) (0) | 2021.02.26 |