테스트를 작성할 때, 종종 외부 리소스에 의존하는 상황이 발생합니다. 이러한 리소스는 파일, 데이터베이스 연결, 네트워크 리소스 등이 될 수 있습니다. 이러한 리소스에 의존하는 테스트를 작성할 때는 테스트의 신뢰성과 일관성을 보장하기 위해 리소스를 설정하고 정리하는 작업이 중요합니다.
파이썬에서는 unittest
모듈을 활용하여 테스트 리소스를 설정하고 정리할 수 있습니다. 이 모듈은 테스트 케이스, 테스트 스위트, 테스트 실행 및 결과 보고 등을 지원하는 기능을 제공합니다.
테스트 리소스 설정
테스트 리소스를 설정하기 위해서는 setUp
메서드를 사용합니다. 이 메서드는 각 테스트 케이스가 실행되기 전에 실행되며, 테스트에 필요한 리소스를 초기화하는 작업을 수행합니다.
다음은 setUp
메서드를 사용하여 파일을 생성하고 초기화하는 예제 코드입니다.
import unittest
class MyTestCase(unittest.TestCase):
def setUp(self):
self.file = open('test_file.txt', 'w')
self.file.write('Hello, World!')
self.file.close()
def test_file_content(self):
with open('test_file.txt', 'r') as file:
content = file.read()
self.assertEqual(content, 'Hello, World!')
if __name__ == '__main__':
unittest.main()
위의 예제에서 setUp
메서드는 test_file_content
테스트 케이스가 실행되기 전에 test_file.txt
파일을 생성하고 초기 데이터를 작성합니다.
테스트 리소스 정리
테스트 리소스를 정리하기 위해서는 tearDown
메서드를 사용합니다. 이 메서드는 각 테스트 케이스의 실행이 완료된 후 실행되며, 테스트에 사용된 리소스를 정리하는 작업을 수행합니다.
다음은 tearDown
메서드를 사용하여 파일을 삭제하는 예제 코드입니다.
import unittest
import os
class MyTestCase(unittest.TestCase):
def setUp(self):
self.file = open('test_file.txt', 'w')
self.file.write('Hello, World!')
self.file.close()
def tearDown(self):
os.remove('test_file.txt')
def test_file_deleted(self):
self.assertFalse(os.path.exists('test_file.txt'))
if __name__ == '__main__':
unittest.main()
위의 예제에서 tearDown
메서드는 test_file_deleted
테스트 케이스가 실행된 후 test_file.txt
파일을 삭제합니다.
테스트 리소스 설정 및 정리를 한 번에 수행하기
만약 각각의 테스트 케이스마다 setUp
및 tearDown
메서드를 작성하게 되면 중복된 코드가 발생하게 될 수 있습니다. 따라서, setUpClass
및 tearDownClass
메서드를 사용하여 모든 테스트 케이스에서 공통으로 사용되는 리소스 설정 및 정리를 한 번에 수행할 수 있습니다.
다음은 setUpClass
및 tearDownClass
메서드를 사용하여 데이터베이스 연결 및 해제를 수행하는 예제 코드입니다.
import unittest
import sqlite3
class MyTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.conn = sqlite3.connect('test.db')
cls.cur = cls.conn.cursor()
# Create a test table
cls.cur.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, data TEXT)")
@classmethod
def tearDownClass(cls):
cls.conn.close()
os.remove('test.db')
def test_insert_data(self):
self.cur.execute("INSERT INTO test (id, data) VALUES (1, 'Test Data')")
self.conn.commit()
self.cur.execute("SELECT * FROM test WHERE id=1")
row = self.cur.fetchone()
self.assertEqual(row[1], 'Test Data')
if __name__ == '__main__':
unittest.main()
위의 예제에서 setUpClass
메서드는 테스트 시작 시 test.db
파일에 대한 연결을 설정하고, tearDownClass
메서드는 테스트 종료 시 연결을 해제하고 파일을 삭제합니다.
결론
unittest
모듈을 사용하여 테스트 리소스를 설정하고 정리하는 작업은 테스트 코드의 일관성과 신뢰성을 높이는 데 있어서 매우 중요합니다. setUp
, tearDown
, setUpClass
, tearDownClass
메서드를 적절히 활용하여 테스트 리소스를 효율적으로 관리해야합니다.
더 자세한 내용은 Python 공식 문서를 참조하세요.