[파이썬] unittest GUI 애플리케이션과 unittest

우리는 품질 관리를 위해 테스트 작성을 자주 사용합니다. Python에서는 unittest라는 내장 모듈을 사용하여 테스트를 작성할 수 있습니다. 하지만 이러한 테스트는 일반적으로 터미널에서 실행되어 결과를 출력하기 때문에 GUI 애플리케이션을 테스트할 때는 다소 불편할 수 있습니다.

그러나 우리는 unittest 모듈을 사용하여 GUI 애플리케이션에 대한 테스트를 작성할 수 있습니다. 이를 위해 unittest 모듈의 기능을 이용해 GUI 테스트를 작성하고 실행해볼 것입니다.

unittest 모듈 소개

unittest 모듈은 Python 표준 라이브러리에 포함된 테스트 작성용 모듈입니다. 이 모듈을 사용하면 깔끔하고 구조화된 테스트를 작성할 수 있으며, 통합 테스트, 단위 테스트 등을 모두 다룰 수 있습니다. unittest 모듈은 여러 기능을 제공하며, 직접 테스트 케이스를 작성하고 실행하는 것 외에도 테스트 픽스처 설정, 테스트 대상 클래스의 메소드를 직접 호출하는 등의 기능을 지원합니다.

GUI 애플리케이션 테스트

일반적으로 GUI 애플리케이션을 테스트할 때는 사용자의 입력과 애플리케이션의 상태 및 동작을 모두 테스트해야합니다. unittest 모듈을 사용하여 GUI 애플리케이션을 테스트할 때는 다음 단계를 따를 수 있습니다.

  1. 테스트 케이스 클래스 설계
  2. 테스트에 필요한 픽스처 설정
  3. 테스트 케이스 작성
  4. 테스트 실행

예제 코드

다음은 예시로 사용할 간단한 GUI 애플리케이션 클래스입니다.

import tkinter as tk

class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, num):
        self.result += num

    def subtract(self, num):
        self.result -= num

    def clear(self):
        self.result = 0

    def get_result(self):
        return self.result

class CalculatorGUI(tk.Tk):
    def __init__(self, calculator):
        tk.Tk.__init__(self)
        self.calculator = calculator
        self.title("Calculator")
        self.result_label = tk.Label(self, text="Result: 0")
        self.result_label.pack()
        self.add_button = tk.Button(self, text="Add 5", command=self.add_5)
        self.add_button.pack()
        self.subtract_button = tk.Button(self, text="Subtract 2", command=self.subtract_2)
        self.subtract_button.pack()
        self.clear_button = tk.Button(self, text="Clear", command=self.clear)
        self.clear_button.pack()

    def add_5(self):
        self.calculator.add(5)
        self.update_result_label()

    def subtract_2(self):
        self.calculator.subtract(2)
        self.update_result_label()

    def clear(self):
        self.calculator.clear()
        self.update_result_label()

    def update_result_label(self):
        self.result_label.config(text=f"Result: {self.calculator.get_result()}")

이제 위 예제에서 정의한 Calculator 클래스와 CalculatorGUI 클래스를 테스트하기 위해 unittest 모듈을 사용한 테스트 코드를 작성해보겠습니다.

import unittest

class CalculatorTestCase(unittest.TestCase):
    def setUp(self):
        self.calculator = Calculator()

    def test_add(self):
        self.calculator.add(5)
        self.assertEqual(self.calculator.get_result(), 5)

    def test_subtract(self):
        self.calculator.subtract(2)
        self.assertEqual(self.calculator.get_result(), -2)

    def test_clear(self):
        self.calculator.add(5)
        self.calculator.clear()
        self.assertEqual(self.calculator.get_result(), 0)

class CalculatorGUITestCase(unittest.TestCase):
    def setUp(self):
        self.calculator = Calculator()
        self.app = CalculatorGUI(self.calculator)
        self.app.update()

    def tearDown(self):
        self.app.destroy()

    def test_add_button(self):
        self.app.add_5()
        self.assertEqual(self.calculator.get_result(), 5)
        self.assertEqual(self.app.result_label.cget("text"), "Result: 5")

    def test_subtract_button(self):
        self.app.subtract_2()
        self.assertEqual(self.calculator.get_result(), -2)
        self.assertEqual(self.app.result_label.cget("text"), "Result: -2")

    def test_clear_button(self):
        self.calculator.add(5)
        self.app.clear()
        self.assertEqual(self.calculator.get_result(), 0)
        self.assertEqual(self.app.result_label.cget("text"), "Result: 0")

if __name__ == "__main__":
    unittest.main()

위의 코드는 Calculator 클래스와 CalculatorGUI 클래스에 대한 테스트 케이스를 정의하고 실행합니다. unittest.TestCase 클래스를 상속받은 테스트 케이스 클래스를 작성하고, 각 테스트 메소드에서 필요한 테스트를 진행합니다. setUp 메소드를 통해 테스트에 필요한 픽스처를 설정하고, tearDown 메소드를 통해 테스트가 종료된 후 정리 작업을 수행합니다.

이제 코드를 실행해보면 테스트 결과를 알 수 있으며, 문제가 있는 경우 해당 부분을 수정하고 다시 실행하여 문제를 해결할 수 있습니다.

결론

unittest 모듈을 사용하여 GUI 애플리케이션에 대한 테스트를 작성하고 실행하는 방법을 알아보았습니다. 테스트를 통해 코드의 신뢰성을 높일 수 있고, 유지 및 보수에도 도움이 됩니다. GUI 애플리케이션을 개발한다면 테스트 케이스를 작성하여 품질을 관리하는 것을 권장합니다.