[파이썬] unittest 테스트 리소스 설정 및 정리

테스트를 작성할 때, 종종 외부 리소스에 의존하는 상황이 발생합니다. 이러한 리소스는 파일, 데이터베이스 연결, 네트워크 리소스 등이 될 수 있습니다. 이러한 리소스에 의존하는 테스트를 작성할 때는 테스트의 신뢰성과 일관성을 보장하기 위해 리소스를 설정하고 정리하는 작업이 중요합니다.

파이썬에서는 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 파일을 삭제합니다.

테스트 리소스 설정 및 정리를 한 번에 수행하기

만약 각각의 테스트 케이스마다 setUptearDown 메서드를 작성하게 되면 중복된 코드가 발생하게 될 수 있습니다. 따라서, setUpClasstearDownClass 메서드를 사용하여 모든 테스트 케이스에서 공통으로 사용되는 리소스 설정 및 정리를 한 번에 수행할 수 있습니다.

다음은 setUpClasstearDownClass 메서드를 사용하여 데이터베이스 연결 및 해제를 수행하는 예제 코드입니다.

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 공식 문서를 참조하세요.