파이썬 테스트

이 문서는 파이썬 테스트 방법과 가이드라인을 제공한다. 이는 파이썬 테스트 추천 라이브러리와 활용 방법에 대한 내용을 포함한다. 해당 문서 내용은 추천 사항이며, 각 프로젝트에 따라 다른 방법을 적용하거나 제안할 수 있다. 다만 이 경우에도 프로젝트 내에서는 통일성을 갖는 것을 장려한다.

유닛 테스트

이 문서에서는 python 이 제공하는 기본 라이브러리인 unittest를 사용해서 유닛 테스트를 구성한다. 더 효율적으로 테스트를 구성하기 위해 pytest를 활용할 수 있다. 유닛 테스트 기본 가이드라인은 테스트 기본 원칙 문서를 참고한다.

테스트 레이아웃

프로젝트 최상위 폴더에 tests 폴더를 추가한 뒤 해당 폴더에 테스트 파일을 추가한다. 이 레이아웃을 통해 애플리케이션 코드와 테스트 코드를 분리할 수 있다. 한편 테스트 코드를 애플리케이션 코드의 일부로 배치하는 레이아웃도 가능하다. 프로젝트에 따라 각자 테스트 레이아웃을 선택하되 Choosing a test layout / import rules 문서를 참고하여 판단한다.

테스트 구성

unittest.TestCase 를 사용하여 테스트 클래스를 구성한다. 해당 클래스의 단정 메소드(assert methods)를 활용해서 검증하고자 하는 상태를 확인한다.

import unittest
from unittest.mock import Mock
from actual.package import some_method

class TestClass(unittest.TestCase):
    def test_some_method(self):
        target = some_method()
        self.assertIsNotNone(target)
        self.assertEqual(target.value, 42)

테스트 전/후처리

unittest.TestCasesetUp 를 통해서 테스트에 필요한 전 처리를 수행할 수 있다. 테스트 대상 객체 초기화나 테스트마다 재사용되는 디펜던시 객체 초기화 등이 이에 포함된다.

import unittest
from unittest.mock import Mock
from actual.package.repo import Repo

class TestRepo(unittest.TestCase):
    def setUp(self):
        self.target = Target()

    def test_target_method(self):
        return_value = self.target.do_something()
        self.assertTrue(return_value)

또한 unittest.TestCasetearDown 메소드를 통해 테스트 도중 발생한 변경 사항을 초기화 할 수 있다. 예를 들어 불가피하게 데이터베이스 사용이 필요한 테스트의 경우 tearDown 메소드에서 생성된 데이터를 초기화할 수 있다.

디펜던시 모킹

테스트 대상이 가지고 있는 디펜던시는 모킹하여 사용한다. 디펜던시 객체의 구현에 따라 테스트 결과가 달라지지 않게 주의한다.

repo.py

class Repo:
    def __init__(self, cache_data_source: DataSource, remote_data_source: DataSource):
        self.cache_data_source = cache_data_source
        self.remote_data_source = remote_data_source

    # ...

test_repo.py

import unittest
from unittest.mock import Mock
from actual.package.repo import Repo

class TestRepo(unittest.TestCase):
    def test_some_method(self):
        cache_data_source = Mock()
        remote_data_source = Mock()
        repo = Repo(cache_data_source, remote_data_source)

        # ...

테스트 픽스쳐(Fixture)

테스트에 필요한 리소스를 미리 구성하여 사용할 수 있다.

TBD