ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬으로 TDD 진행해보기(feat. unittest 예제)
    Programing/TDD 2022. 11. 24. 01:11
    반응형

    스터디 도서의 내용을 실습하기 이전에,

    파이썬으로 TDD를 진행할 수 있는지 자체를 먼저 확인해 봐야겠습니다.

     

    엄밀히 따지면, 이 글의 제목은 잘못되었습니다.

    "TDD 진행해보기"가 아니라, "코드 테스트하기"가 더 정확할 겁니다.

    그치만 전 TDD를 공부하기 위해서 unittest를 사용하는거니까요...

     

    import unittest

    파이썬에서는 기본 라이브러리인 unittest를 이용해서 TTD를 진행할 수 있습니다.

     

    unittest는 코드를 테스트할 수 있도록 도와주는 라이브러리입니다.

    unittest를 활용하면 코드 테스트도 할 수 있고, 테스트가 가능하니 TDD도 진행할 수 있습니다.

     

    아래는 덧셈,뺄셈,곱셈,나눗셈을 할 수 있는 calculator.py,

    이 calculator.py가 돌아갈 때 문제가 없는지 테스트하는 test_calculator.py의 모습입니다.

    그럼 이제 위의 화면과 같이 unittest를 활용해 코드를 테스트 해봅시다.

     

     

    1. test_calculator.py 만들기

    테스트 하고자 하는 코드(calculator.py)는 이미 있다고 가정하겠습니다.

    def add(x, y):
        return x + y
    
    def sub(x, y):
        return x - y
    
    def multiply(x, y):
        return x * y
    
    def divide(x, y):
        return x / y

    calculator.py가 있는 디렉토리 안에 테스트코드(test_calculator.py)를 만들어주세요

    • 꼭 같은 디렉토리가 아니여도 괜찮습니다. 여기서는 calculator.py를 쉽게 import하기 위함입니다.
    • test코드의 이름은 "test_*", "*_test"과 같이 구분 가능한 것이 좋습니다. 아래처럼 테스트 코드를 전부 탐색해서 자동으로 돌려버리는게 가능하기 때문입니다. (이 글에서는 이 내용을 다루지 않습니다.)
    python -m unittest discover project_directory "*_test.py"

     

     

    2. unittest 클래스 상속하고 테스트용 메소드 만들기

    import unittest
    import calculator
    
    
    class TestCalculator(unittest.TestCase):
    
        def test_add(self):
    • 클래스명(unittetst.TestCase) : 테스트를 돌리기 위해 unittest를 상속받았습니다.
    • 모든 메소드는 "test_" : unittest가 자동으로 테스트를 돌려주기 위해서는 이름을 특별하게 지정해주어야 합니다.
      unittest는 이름이 "test_"으로 시작하는 메소드만 테스트용으로 취급하기 때문입니다.

     

     

    3. 메소드 안에 테스트할 내용 넣기

    calculator.py의 add함수만 테스트 해보려고 합니다.

    import unittest
    import calculator
    
    
    class TestCalculator(unittest.TestCase):
    
        def test_add(self):
            result = calculator.add(1, 2)
            self.assertEqual(result, 3)  # (result == 3)인지 확인
    • unittest.TestCase를 상속받았으므로, 메소드들을 사용할 수 있습니다.
    • 여기서는 assertEqual 메소드를 사용했습니다. 둘이 같은 값인지 확인합니다.
      같은 값이라면 테스트 성공, 다른 값이라면 테스트 실패입니다.
    • assertEqual 말고도 다양한 종류가 있습니다.

    https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.debug

     

     

    4. 테스트 돌리기

    방법1 : CMD에서 테스트하기 (보편적인 방법)

    >python -m unittest test_calculator.py

     

    방법2 : PyCharm에서 테스트하기 (매우 쉬움)

     

    방법3 : if __name__ == '__main__' 추가하기 (나중에 편함)

    test_calculator.py가 위의 코드 상태 그대로일 때,

     

    cmd에서 test_calculator.py를 바로 돌리면 아무런 반응이 없습니다. 그냥 클래스 하나 덜렁 있는 코드일 뿐인거죠.

    아무런 반응 없음

    그런데 아래와 같이 설정을 추가해주면

    import unittest
    import calculator
    
    
    class TestCalculator(unittest.TestCase):
    
        def test_add(self):
            result = calculator.add(1, 2)
            self.assertEqual(result, 3)
    
    
    if __name__ == '__main__':
        unittest.main()

    cmd에서 unittest 모듈을 불러오지 않아도 바로 테스트 코드를  돌릴 수 있습니다.

    이제 바로 실행시켜도 잘 돌아갑니다.

     

    5. 다른 함수들에 대한 테스트도 추가해주기

    import unittest
    import calculator
    
    
    class TestCalculator(unittest.TestCase):
    
        def test_add(self):
            self.assertEqual(calculator.add(1, 2), 3)
    
        def test_sub(self):
            self.assertEqual(calculator.sub(1, 2), -1)
    
        def test_multiply(self):
            self.assertEqual(calculator.multiply(1, 2), 2)
    
        def test_divide(self):
            self.assertEqual(calculator.divide(1, 2), 0.5)
    
    
    if __name__ == '__main__':
        unittest.main()

    4개의 테스트를 진행했고, 4개의 테스트 모두 이상이 없습니다.

     

    반응형

    댓글

Designed by Tistory.