소개
이 랩에서는 내장된 unittest 모듈을 사용하여 Python 코드에 대한 유닛 테스트를 작성하는 방법을 배웁니다. 간단한 함수부터 시작하여 데이터베이스와 상호 작용하는 코드를 포함하여 더 복잡한 코드를 테스트하는 방법까지 살펴볼 것입니다.
사전 요구 사항
이 랩을 시작하기 전에 Python 프로그래밍 언어에 대한 기본적인 이해가 있어야 합니다. 또한 Python 에서 함수를 작성하는 데 익숙해야 합니다.
이 랩에서는 내장된 unittest 모듈을 사용하여 Python 코드에 대한 유닛 테스트를 작성하는 방법을 배웁니다. 간단한 함수부터 시작하여 데이터베이스와 상호 작용하는 코드를 포함하여 더 복잡한 코드를 테스트하는 방법까지 살펴볼 것입니다.
이 랩을 시작하기 전에 Python 프로그래밍 언어에 대한 기본적인 이해가 있어야 합니다. 또한 Python 에서 함수를 작성하는 데 익숙해야 합니다.
시작하려면 테스트를 위한 새로운 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 코드에 대한 테스트를 작성하여 예상대로 작동하고 개발 프로세스 초기에 버그를 포착할 수 있습니다.