코드 테스트하기

PythonBeginner
지금 연습하기

소개

이 랩에서는 내장된 unittest 모듈을 사용하여 Python 코드에 대한 유닛 테스트를 작성하는 방법을 배웁니다. 간단한 함수부터 시작하여 데이터베이스와 상호 작용하는 코드를 포함하여 더 복잡한 코드를 테스트하는 방법까지 살펴볼 것입니다.

사전 요구 사항

이 랩을 시작하기 전에 Python 프로그래밍 언어에 대한 기본적인 이해가 있어야 합니다. 또한 Python 에서 함수를 작성하는 데 익숙해야 합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

숫자 더하기

설정

시작하려면 테스트를 위한 새로운 Python 파일을 만들어야 합니다. 이를 test_my_code.py라고 부르겠습니다. 또한 테스트하려는 코드를 포함하는 모듈을 만들 것입니다. 이 모듈을 my_code.py라고 부르겠습니다.

간단한 테스트

두 숫자의 합을 반환하는 간단한 함수부터 시작해 보겠습니다. my_code.py에서 두 개의 인수를 받아 합을 반환하는 add_numbers라는 함수를 만듭니다.

def add_numbers(a, b):
    return a + b

이제 test_my_code.py에서 이 함수에 대한 테스트를 작성해 보겠습니다. 먼저 unittest 모듈과 add_numbers 함수를 가져와야 합니다.

import unittest
from my_code import add_numbers

다음으로, unittest.TestCase에서 상속받는 TestAddNumbers라는 클래스를 만들 것입니다.

class TestAddNumbers(unittest.TestCase):
    pass

이 클래스 내부에 add_numbers 함수를 테스트할 test_add_numbers라는 메서드를 만들 것입니다. assertEqual 메서드를 사용하여 함수가 올바른 합을 반환하는지 확인할 것입니다.

class TestAddNumbers(unittest.TestCase):
    def test_add_numbers(self):
        result = add_numbers(2, 3)
        self.assertEqual(result, 5)

이제 다음 명령을 사용하여 테스트를 실행할 수 있습니다.

python -m unittest test_my_code.py

테스트가 통과하면 다음과 같은 출력이 표시됩니다.

...
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

**.**는 하나의 테스트가 통과했음을 나타냅니다.

예외 처리 테스트

다음으로, 예외를 발생시키는 함수를 테스트해 보겠습니다. my_code.py에서 두 개의 인수를 받아 몫을 반환하는 divide라는 함수를 만듭니다. 두 번째 인수가 0 이면 함수는 ZeroDivisionError를 발생시켜야 합니다.

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError('Cannot divide by zero')
    return a / b

이제 test_my_code.py에서 이 함수에 대한 테스트를 작성해 보겠습니다. 두 번째 인수가 0 일 때 함수가 ZeroDivisionError를 발생시키는지 확인하기 위해 assertRaises 메서드를 사용합니다.

class TestDivide(unittest.TestCase):
    def test_divide_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            divide(1, 0)

이제 다시 테스트를 실행할 수 있습니다.

python -m unittest test_my_code.py

테스트가 통과하면 다음과 같은 출력이 표시됩니다.

...
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

**..**는 두 개의 테스트가 통과했음을 나타냅니다.

데이터베이스를 이용한 테스트

마지막으로, 데이터베이스와 상호 작용하는 코드를 테스트해 보겠습니다. 이 예제에서는 SQLite 와 sqlite3 모듈을 사용합니다.

my_code.py에서 SQLite 데이터베이스에 새 테이블을 만드는 create_table이라는 함수를 만듭니다.

import sqlite3

def create_table():
    conn = sqlite3.connect('my_database.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)')
    conn.commit()
    conn.close()

이 코드에서는 "id"와 "name"의 두 열이 있는 "my_table"이라는 새 SQLite 데이터베이스 테이블을 만듭니다. 그런 다음 테스트를 위해 SQLite 데이터베이스를 만드는 setUp 메서드가 있는 TestCreateTable이라는 테스트 클래스를 정의합니다.

이제 create_table 함수에 대한 테스트를 작성해 보겠습니다. 먼저 테스트를 위한 새 데이터베이스를 만들어야 합니다. 각 테스트 전에 실행되는 설정 메서드에서 이 작업을 수행합니다.

class TestCreateTable(unittest.TestCase):
    def setUp(self):
        self.conn = sqlite3.connect('my_database.db')

    def test_create_table(self):
        create_table()
        c = self.conn.cursor()
        c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='my_table'")
        result = c.fetchone()
        self.assertIsNotNone(result)

setUp 메서드에서 새 SQLite 데이터베이스를 만듭니다.

test_create_table 메서드에서 create_table 함수를 호출한 다음 SQL 쿼리를 사용하여 테이블이 생성되었는지 확인합니다.

이제 다시 테스트를 실행할 수 있습니다.

python -m unittest test_my_code.py

테스트가 통과하면 다음과 같은 출력이 표시됩니다.

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

**...**는 세 개의 테스트가 통과했음을 나타냅니다.

요약

이 랩에서는 unittest 모듈을 사용하여 Python 코드에 대한 단위 테스트를 작성하는 방법을 배웠습니다. 간단한 함수로 시작하여 데이터베이스와 상호 작용하는 코드를 포함하여 더 복잡한 코드를 테스트하는 방식으로 발전했습니다. 이 지식을 통해 Python 코드에 대한 테스트를 작성하여 예상대로 작동하고 개발 프로세스 초기에 버그를 포착할 수 있습니다.