Python의 매개변수화된 단위 테스트

Abid Ullah 2023년6월21일
  1. Python에서 매개변수화된 단위 테스트의 목적
  2. Python에서 매개변수화된 단위 테스트의 예
  3. Python에서 매개변수화된 단위 테스트의 이점
  4. 매개 변수화된 단위 테스트를 지원하는 Python 라이브러리
Python의 매개변수화된 단위 테스트

단위 테스트는 소프트웨어 품질을 유지하는 강력한 도구 중 하나입니다. 소프트웨어에 대한 단위 테스트는 소프트웨어가 소프트웨어 설계 사양에 따라 개발되고 최종 사용자를 위해 의도된 대로 작동하거나 응답하는지 확인하기 위해 코드 조각에 대한 일련의 검사입니다.

Python에서는 매개변수화된 단위 테스트를 사용하여 이동 중에 각 항목 또는 테스트 사례에 대해 하나의 테스트를 생성할 수 있습니다. 이 기사에서는 Python의 매개변수화된 단위 테스트를 살펴봅니다.

Python에서 매개변수화된 단위 테스트의 목적

개발자는 단위 테스트를 작성할 때 종종 하나의 사례 접근 방식에 대해 하나의 테스트를 채택합니다. 그런 다음 가장 유사하거나 관련된 테스트가 제품군으로 결합됩니다.

아래 코드에서 일련의 테스트를 살펴보십시오.

class TestSuite(TestCase):
    def test_first_case(self):
        assert example_test()

    def test_second_case(self):
        assert more_example_tests()

    def test_third_case(self):
        assert another_example_test()

이와 같은 제품군을 통한 테스트는 각 테스트 사례가 준비, 실행 및 마지막으로 어설션의 일련의 사용자 지정 단계를 거쳐야 함을 의미합니다. 이러한 각각의 테스트 사례가 유사하다면 결과 제품군은 중복되거나 중복된 코드로 엉망이 될 것이며 이는 소프트웨어 개발자의 세계에서 저주나 다름없습니다.

이러한 제품군은 또한 변경이 있을 때 유지하기가 매우 어려운 대규모 코드 베이스를 생성합니다(예상됨). 이 문제를 해결하기 위해 Python의 동적 또는 매개변수화된 단위 테스트를 통해 여러 사례에 대한 단일 테스트를 생성할 수 있습니다.

Python에서 매개변수화된 단위 테스트의 예

Python에서 매개변수화된 단위 테스트를 이해하기 위한 기본으로 사용할 수 있는 예제 테스트 시나리오 또는 방법과 이것이 소프트웨어 개발자로서의 삶을 훨씬 쉽게 만드는 방법에 대해 자세히 살펴보겠습니다.

다음은 테스트하려는 간단한 함수입니다.

def compute(a, b):
    return (a + b) / (a * b)

이제 모든 테스트와 마찬가지로 원하는 방식으로 작동하는지 테스트하기 위해 위의 함수에 적용해야 하는 여러 입력이 있음을 알고 있습니다. 테스트 매개변수를 보다 정교하게 지정하려면 다음과 같은 매개변수에 대해 메서드를 테스트해야 합니다.

  • 양의 정수
  • 음의 정수
  • 긴 정수
  • 일반 정수
  • 플로트 번호
  • 숫자 중 하나 또는 둘 다 0입니다.
  • 인수 중 하나 또는 둘 다 정의되지 않음
  • 인수 중 하나 또는 둘 다 문자열 또는 다른 종류의 개체입니다.

이것이 사례당 하나의 테스트 방법을 사용하여 테스트된다면 한 줄 방법에 대해 긴 일련의 반복 코드를 작성하게 될 것입니다. 루프 및 조건과 관련된 여러 줄의 코드를 기반으로 하는 메서드에 대해 이것이 얼마나 바쁘고 지루할 수 있는지 상상할 수 있습니다.

매개변수화를 사용하면 다음 작업만 수행하면 됩니다.

def test_compute(self, a, b, expected, raises=None):
    if raises is not None:
        with self.assertRaises(raises):
            compute(a, b)
    else:
        assert compute(a, b) == expected

이를 통해 계산 방법에 대한 모든 가능성을 가장 잘 테스트하는 매개변수 목록을 준비해야 합니다. 매개변수 목록은 원하는 만큼 길거나 테스트해야 하는 경우의 모음일 수 있습니다.

다음은 위의 단위 테스트에 전달할 수 있는 매개변수 목록의 예입니다.

코드 출력:

a           | b   | expected | raises
------------+-----+----------+-------
-2          | 2   | 0        |
0           | 2   |          | ZeroDivisionError
2           | 2   | 1        |
0.5         | 0.4 | 4.5      |
None        | 2   |          | TypeError
"10"        | "1" |          | TypeError
3000000000L | 2   | 0.5      |

보시다시피, 이 목록과 위의 매개변수화된 단위 테스트는 compute() 메서드로 전달될 수 있는 인수의 다양한 시나리오를 테스트하는 데 훨씬 더 효율적입니다. 또한 다양한 결과를 훨씬 쉽게 기록할 수 있습니다.

Python에서 매개변수화된 단위 테스트의 이점

정기적인 단위 테스트를 작성하는 것은 매우 반복적이고 철저하며 시간이 많이 걸리고 신경이 쓰일 수 있습니다. 특히 테스트가 각 소프트웨어 시나리오를 살펴보고 모든 것이 목표에 부합하는지 확인하려는 경우 더욱 그렇습니다.

Python에서 매개변수화된 단위 테스트를 사용한다는 것은 개발자로서 품질을 유지하기 위해 개발 중인 소프트웨어에서 발생할 수 있는 다양한 시나리오를 테스트하기 위해 수백 개의 코드 라인을 작성하는 것에 대해 걱정할 필요가 없다는 것을 의미합니다. 우리에게 필요한 것은 테스트해야 하는 모든 시나리오를 테스트하기 위한 단일 테스트입니다.

이는 테스트 코드 베이스가 반복이 거의 또는 전혀 없이 항상 쉽게 유지 관리되어 효율적인 테스트 사례와 시간 절약 결과를 얻을 수 있음을 의미합니다.

또한 매개변수화된 단위 테스트는 해당 개발자가 메서드에 들어가는 모든 가능한 입력에 대해 보다 명확하고 명확하게 생각하도록 합니다. 위의 예에 대한 큰 정수 또는 일관되지 않은 입력 유형과 정의되지 않은 입력과 같은 잘못된 경우와 같은 엣지 케이스를 추적하는 데 도움이 됩니다.

또한 이 테스트는 자연스럽게 개발자가 코드를 깨뜨릴 수 있는 입력 유형에 대해 생각하는 대신 엣지 케이스를 처리할 수 있는 방법에 대해 더 많이 생각하도록 합니다. 특정 상황 조합에서 함수가 수행할 것으로 예상되는 작업을 예측하도록 강제함으로써 코드의 품질을 유지하는 데 도움이 되며 직면한 모든 문제에 대한 개념적이고 효율적인 솔루션을 개발할 수 있습니다.

모든 것을 추가하기 위해 우리가 메서드를 테스트하기 위해 더 철저하거나 광범위한 매개 변수 목록을 사용하기로 결정하면 처음에는 테스트 사례를 작성하기에는 너무 사소하다고 생각한 테스트 사례에 대한 결과와 솔루션을 얻게 될 수 있습니다. 그러나 마음대로 사용할 수 있는 매개변수화된 테스트를 사용하면 코드가 어떻게 반응하는지 확인하기 위해 테스트하려는 조합만 입력하면 됩니다.

매개 변수화된 단위 테스트를 지원하는 Python 라이브러리

Python은 테스트 방법을 간단하게 개발할 수 있게 해주는 매개변수화된 라이브러리를 통해 우리의 삶을 더 쉽게 만들어줍니다. 우리가 해야 할 일은 매개변수화를 가져오고 다음과 같이 테스트 스위트의 메소드에서 매개변수화 데코레이터를 통해 테스트하려는 매개변수를 전달하는 것입니다.

from parameterized import parameterized


class TestSuite(TestCase):
    @parameterized.expand([("test_1", 0, 0, 0), ("test_2", 0, 1, 1)])
    def test_my_feature(self, name, in_1, in_2, expected):
        assert my_feature(in_1, in_2) == expected

이를 수행하는 또 다른 방법은 모든 매개변수 목록이 포함된 .csv 파일을 생성하는 것입니다. 그런 다음 데코레이터에 전달하여 다음과 같이 테스트합니다.

def load_test_cases():
    return load_from_csv("my_feature_parameters.csv")


class TestSuite(TestCase):
    @parameterized.expand(load_test_cases)
    def test_my_feature(self, name, in_1, in_2, expected):
        assert my_feature(in_1, in_2) == expected

동적(파라미터화된) 단위 테스트를 사용해야 하는 이유부터 이를 구현할 수 있는 다양한 방법 및 소프트웨어 개발 수명 주기에서의 이점에 이르기까지 모든 것을 다루었습니다. 이 기사가 Python에서 단위 테스트를 생성하는 방법을 이해하는 데 도움이 되기를 바랍니다.

작가: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn

관련 문장 - Python Unit Test