18장: 테스트

소프트웨어 테스트는 코드의 품질을 보장하고, 버그를 줄이며, 유지 보수성을 향상시키는 데 중요한 역할을 합니다. 파이썬에서는 다양한 테스트 프레임워크를 제공하며, 이 장에서는 `unittest`, `pytest`, 그리고 `mock` 라이브러리를 사용하여 테스트를 작성하고 실행하는 방법에 대해 알아보겠습니다.


#### 18.1 `unittest` 소개


`unittest`는 파이썬 표준 라이브러리에 포함된 기본 테스트 프레임워크입니다. 유닛 테스트는 코드의 작은 단위(예: 함수 또는 메서드)를 테스트하는 데 사용됩니다.


##### 18.1.1 기본 테스트 작성


다음은 `unittest`를 사용하여 기본적인 테스트를 작성하는 예제입니다.


```python

import unittest


# 테스트할 함수

def add(a, b):

    return a + b


class TestAddFunction(unittest.TestCase):

    def test_add_positive_numbers(self):

        self.assertEqual(add(1, 2), 3)

        

    def test_add_negative_numbers(self):

        self.assertEqual(add(-1, -2), -3)

        

    def test_add_zero(self):

        self.assertEqual(add(0, 0), 0)


if __name__ == '__main__':

    unittest.main()

```


##### 18.1.2 테스트 실행


위 코드를 `test_add.py` 파일로 저장하고, 터미널에서 다음 명령을 실행하여 테스트를 실행합니다.


```sh

python -m unittest test_add.py

```


#### 18.2 `pytest` 소개


`pytest`는 강력한 기능을 제공하는 또 다른 인기 있는 테스트 프레임워크입니다. 먼저 `pytest`를 설치해야 합니다.


```sh

pip install pytest

```


##### 18.2.1 기본 테스트 작성


다음은 `pytest`를 사용하여 기본적인 테스트를 작성하는 예제입니다.


```python

# test_add.py 파일

def add(a, b):

    return a + b


def test_add_positive_numbers():

    assert add(1, 2) == 3


def test_add_negative_numbers():

    assert add(-1, -2) == -3


def test_add_zero():

    assert add(0, 0) == 0

```


##### 18.2.2 테스트 실행


터미널에서 다음 명령을 실행하여 `pytest` 테스트를 실행합니다.


```sh

pytest test_add.py

```


#### 18.3 `mock` 라이브러리


`mock` 라이브러리는 테스트 중 외부 의존성을 모킹(mocking)하는 데 사용됩니다. 이를 통해 외부 시스템에 의존하지 않고 독립적으로 테스트할 수 있습니다.


##### 18.3.1 기본 모킹 예제


다음은 `unittest.mock`을 사용하여 기본적인 모킹 예제입니다.


```python

from unittest.mock import Mock


# 모킹할 객체

class MyClass:

    def method(self):

        pass


# 모킹 객체 생성

mock_obj = Mock(spec=MyClass)

mock_obj.method.return_value = "Mocked!"


# 테스트

def test_method():

    assert mock_obj.method() == "Mocked!"

```


#### 18.4 통합 테스트


통합 테스트는 여러 구성 요소가 올바르게 상호작용하는지 확인하는 데 사용됩니다. 다음은 통합 테스트의 간단한 예제입니다.


```python

# calculator.py 파일

def add(a, b):

    return a + b


def subtract(a, b):

    return a - b

```


```python

# test_calculator.py 파일

import unittest

from calculator import add, subtract


class TestCalculator(unittest.TestCase):

    def test_add(self):

        self.assertEqual(add(3, 7), 10)

        

    def test_subtract(self):

        self.assertEqual(subtract(10, 5), 5)


if __name__ == '__main__':

    unittest.main()

```


#### 18.5 테스트 커버리지 측정


테스트 커버리지는 코드베이스의 얼마나 많은 부분이 테스트되었는지를 측정합니다. `coverage.py` 라이브러리를 사용하여 테스트 커버리지를 측정할 수 있습니다.


##### 18.5.1 `coverage.py` 설치


먼저 `coverage.py`를 설치합니다.


```sh

pip install coverage

```


##### 18.5.2 커버리지 측정


다음 명령을 실행하여 테스트를 실행하고 커버리지를 측정합니다.


```sh

coverage run -m unittest discover

coverage report -m

```


#### 18.6 지속적 통합 (CI)


지속적 통합(CI)은 코드 변경이 발생할 때마다 자동으로 빌드와 테스트를 실행하는 방법입니다. GitHub Actions, Travis CI, CircleCI 등 다양한 CI 도구를 사용할 수 있습니다.


##### 18.6.1 GitHub Actions 설정 예제


다음은 GitHub Actions를 사용하여 파이썬 테스트를 자동화하는 예제입니다.


```yaml

# .github/workflows/python-app.yml

name: Python application


on: [push]


jobs:

  build:


    runs-on: ubuntu-latest


    steps:

    - uses: actions/checkout@v2

    - name: Set up Python

      uses: actions/setup-python@v2

      with:

        python-version: '3.x'

    - name: Install dependencies

      run: |

        python -m pip install --upgrade pip

        pip install -r requirements.txt

    - name: Run tests

      run: |

        python -m unittest discover

```


이상으로, 파이썬에서 테스트를 작성하고 실행하는 방법에 대해 알아보았습니다. 다음 장에서는 네트워크 프로그래밍에 대해 더 자세히 알아보겠습니다. 질문이나 요청사항이 있으시면 댓글로 남겨주세요!


---


이 글의 내용은 GoalKicker.com의 Python Notes for Professionals 책을 참조하였습니다.

댓글