무엇을 공부했나요?
이번 시간에는 Two scoops of Django의 ‘22장 테스트, 정말 거추장스럽고 낭비일까?’ 와 ‘23장 문서화에 집착하자’에 대해서 함께 이야기를 나누었습니다. 22장 요약, 심화를 희진님이 준비해주셨고, 제가 23장을 요약했습니다.
테스트
부끄럽게도 제가 다닌 회사 중에 테스트를 강조하는 곳은 8퍼센트가 처음입니다. 8퍼센트의 CTO인 호성님은 파이콘 2015년 Python 테스트 시작하기 관련 발표도 하신적이 있죠. 그만큼 테스트의 중요성을 강조하고 있고, 같이 일하는 팀원들과 공감대를 형성하고 있습니다.
테스트를 제대로 짜려면.
사실 테스트는 짜기가 쉽지 않습니다. 테스트의 효용에 대해서는 다들 동의하지만 시작을 하기가 쉽지 않죠.
그 중에 몇가지 기억해둘만한 것들을 말씀드려봅니다.
- 하나의 테스트 메소드는 하나의 테스트를 다룹니다. 테스트를 짜다보면 하나의 테스트 메소드에서 여러 개의 테스트를 하게 됩니다. 어떤 것을 테스트하는지 명확하지 않으니 나중에 테스트 코드를 수정하기도 쉽지 않고, 테스트 실패의 원인을 찾는데도 쉽지 않습니다.
- 테스트가 필요한 테스트 코드를 작성하지 않습니다. 테스트 코드를 작성하다보면 테스트 코드 자체가 이해하기 어려운 수준으로 복잡해질 때가 있습니다. 그럴 경우 테스트 코드가 제대로 테스트를 수행하는지에 대한 의문이 들기도 합니다. 테스트 코드를 수정하거나 실제 코드를 리팩토링해야 하는게 아닌지 살펴봅시다.
- 테스트케이스에서 DRY는 예외입니다. 테스트케이스를 작성하다보면 테스트를 하기 위한 초기 작업 코드가 중복인거처럼 느껴질 때가 많습니다. 개발자라면 중복을 제거하고 싶은 생각이 많이 들겠지만, 도리어 테스트가 복잡해지거나 의미를 파악하기 어려워지는 경우가 발생합니다. 테스트의 이해가능성에 중점을 두고 작성하는게 좋겠습니다.
- 픽스처를 너무 신뢰하지 말아야 합니다. 픽스처는 갱신이 제대로 이루어지지 않는 경우가 많습니다. 차라리
factory_boy
,model_mommy
,mock
와 같은 것을 사용하는 것을 검토해보세요. - 테스트 작성에 재미요소를 넣어봅니다. 8퍼센트에서는 테스트 커버리지를 확인하는 서비스인 codecov를 연동해 사용합니다. 테스트 코드를 작성하면서 커버리지 수치가 상승하는 모습을 보면서 소소한 재미를 느낄 수 있습니다. 보물찾기처럼 테스트되지 않은 코드를 찾아서 테스트를 작성하기도 하고, CTO님이 마일스톤을 지정해 재미난 이벤트를 진행해 보기도 합니다. (물론 커버리지 수치가 높다고 더 좋은 코드를 보장하는 것은 아닙니다.)
문서화
문서화 툴인 reStructuredText라는 것에 대해서 공부를 했습니다. 그리고 문서화를 어떻게 구조화할지에 대해서 다른 프로젝트를 통해 살펴보았습니다. sphinx를 통해서 작성된 문서를 빌드할 수 있고, readthedocs.io 같은 곳에서 이렇게 빌드한 문서를 제공한다는 것을 배웠습니다.
심화
심화에는 pytest에 대해서 이야기를 나누었습니다. Python에서 기본으로 제공해주는 unittest 모듈이나 Django에서 그것을 확장한 django.test의 모듈의 경우 테스트를 작성하기 위한 보일러플레이트 작업이 꽤 많습니다. 장황한 테스트 코드들을 작성해야 하죠. 반면에 pytest는 훨씬 간단하게 작성할 수 있게 되어 있으며, 더욱 자세한 아웃풋을 제공해줍니다. pytest-django 모듈도 있어서 django로 개발된 프로젝트들도 테스트할 수 있습니다. 또한 기존에 작성한 테스트들도 실행을 할 수 있다고 하니 점진적으로 적용하기도 수월할 거 같습니다. 그외 다양한 기능들과 유용한 플러그인 생태계가 구축되어 있는 만큼 8퍼센트에서도 시도를 해볼 예정입니다.
어땠나요?
8퍼센트에 들어오기전에 개인적으로 테스트 코드를 작성하는 것말고, 회사에서 테스트를 작성해본 경험은 없었습니다. 테스트 작성에 대한 인식이 높지 않았던 만큼 일을 하면서 불안감을 떨쳐낼 수가 없었습니다. 지금은 새로운 기능 개발과 기존 기능 개선을 동시에 진행하지만 테스트 코드 덕분에 큰 걱정없이 진행을 할 수 있습니다. 다른 분들도 테스트를 짜는 데 부담을 느끼지 말고, 작은 함수라도 시작을 해보는게 어떨까요?