Python에서 같음 주장

Aditya Raj 2023년6월21일
  1. Python에서 Assert 문이란 무엇입니까?
  2. Python의 assertEquals() 메서드
  3. Python의 assertEqual() 메서드
  4. 결론
Python에서 같음 주장

소프트웨어를 빌드하는 동안 코드를 사용하여 비즈니스 로직을 구현해야 합니다.

모든 논리와 제약 조건을 구현하기 위해 프로그램에서 assert 문을 사용합니다. 큰 응용 프로그램에서는 Python의 assertEquals()assertEqual() 메서드의 도움으로 단위 테스트를 사용합니다.

우리는 assert statement가 파이썬에서 어떻게 작동하는지 논의할 것입니다. 또한 assertEquals()assertEqual() 메서드를 사용하여 Python에서 비즈니스 논리와 제약 조건을 구현하는 방법도 살펴보겠습니다.

Python에서 Assert 문이란 무엇입니까?

Python에서 assert 문은 표현식이 True 또는 False인지 확인합니다. assert 문의 구문은 다음과 같습니다.

assert conditional_expression

여기에서 assert가 키워드입니다. conditional_expression은 문장을 True 또는 False로 평가하는 조건문입니다.

condition_expressionTrue로 평가되면 프로그램 실행이 다음 명령문으로 진행됩니다. 반대로 conditional_expressionFalse로 평가되면 프로그램에서 AssertionError 예외가 발생합니다.

아래에서 모두 볼 수 있습니다.

num1 = 10
num2 = 5
num3 = 10
print("This statement will get printed")
assert num1 == num3
print(
    "This statement will also get printed as the expression in the above assert statement is True."
)
assert num2 == num3
print(
    "This statement will not get printed as the expression in the above assert statement is False. This line of code is unreachable."
)

출력:

This statement will get printed
This statement will also get printed as the expression in the above assert statement is True.

Traceback (most recent call last):
  File "tempy.py", line 9, in <module>
    assert num2 == num3
AssertionError

여기에서 첫 번째 print 문이 자동으로 실행되는 것을 관찰할 수 있습니다.

assert num1 == num3 문은 10==10True로 평가되므로 오류가 발생하지 않습니다. 따라서 두 번째 print 문도 실행됩니다.

그 후 "assert num2 == num3" 문은 5==10False로 평가되므로 AssertionError를 발생시킵니다. 이로 인해 프로그램 실행이 중지되고 세 번째 인쇄 문은 실행되지 않습니다.

AssertionError 예외가 발생할 때 메시지를 표시할 수도 있습니다. 이를 위해 다음 구문을 사용합니다.

assert conditional_expression, message

여기서 messageconditional_expressionFalse로 평가되고 AssertionError가 발생할 때 출력되는 문자열입니다. 우리는 이것을 아래에서 볼 수 있습니다.

num1 = 10
num2 = 5
num3 = 10
print("This statement will get printed")
assert num1 == num3, "{} is not equal to {}".format(num1, num2)
print(
    "This statement will also get printed as the expression in the above assert statement is True."
)
assert num2 == num3, "{} is not equal to {}".format(num2, num3)
print(
    "This statement will not get printed as the expression in the above assert statement is False. This line of code is unreachable."
)

출력:

This statement will get printed
This statement will also get printed as the expression in the above assert statement is True.

Traceback (most recent call last):
  File "tempy.py", line 9, in <module>
    assert num2 == num3, "{} is not equal to {}".format(num2, num3)
AssertionError: 5 is not equal to 10

출력 5 is not equal to 10AssertionError를 통지한 후 인쇄됩니다. 이러한 유형의 메시지를 포함하면 AssertionError 예외가 발생할 때마다 메시지를 사용하여 요구 사항을 알릴 수 있으므로 프로그램 기능을 더 쉽게 테스트하는 데 도움이 됩니다.

assert 문을 사용하여 제약 조건을 적용하거나 Python에서 비즈니스 로직을 구현할 수 있습니다. 그러나 assert 문을 사용하면 assert 명령문의 조건문이 False로 평가되면 프로그램 실행이 중지된다는 단점이 있습니다.

따라서 수천 개의 제약 조건과 조건이 있는 대규모 프로그램에서는 AssertionError 예외가 발생하는 횟수만큼 프로그램을 실행해야 합니다.

이를 극복하기 위해 앞서 논의한 assertEquals() 또는 assertEqual() 문을 사용할 수 있습니다.

Python의 assertEquals() 메서드

소프트웨어에서 제약 조건과 비즈니스 로직을 적용하기 위해 unittest 모듈을 사용할 수 있습니다.

unittest 모듈은 제약 조건을 적용하는 데 사용할 수 있는 많은 방법을 제공합니다. 평등에 대한 주장을 구현하기 위해 assertEquals() 메서드와 assertEqual() 메서드를 사용할 수 있습니다.

assertEquals() 메서드를 사용하여 평등에 대한 주장을 구현하려면 먼저 unittest 모듈에 정의된 TestCase 클래스의 하위 클래스인 클래스를 생성합니다. 그런 다음 assertEquals() 메서드의 다음 구문을 사용하여 동등성에 대한 주장을 정의할 수 있습니다.

self.assertEquals(self, first, second)

여기에서 first 매개변수는 첫 번째 값을 입력 인수로 받아들입니다. second 매개변수는 두 번째 값을 입력 인수로 받아들입니다.

first 매개변수가 second 매개변수의 값과 같으면 단위 테스트가 성공적으로 통과합니다. 그렇지 않으면 현재 줄에서 AssertionError 예외가 발생하고 사용자에게 오류에 대해 알립니다.

따라서 테스트 케이스는 실패하지만 assert 문의 경우와 같이 프로그램 실행은 중지되지 않습니다. 프로그램은 모든 테스트 케이스를 실행한 다음 모든 오류를 개발자에게 알립니다.

우리는 이것을 아래에서 볼 수 있습니다.

import unittest


class Tester(unittest.TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        self.assertEquals(self.num1, self.num3)

    def test_condition2(self):
        self.assertEquals(self.num2, self.num3)


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

출력:

/home/aditya1117/PycharmProjects/pythonProject/webscraping.py:14: DeprecationWarning: Please use assertEqual instead.
  self.assertEquals(self.num1, self.num3)
.F
======================================================================
FAIL: test_condition2 (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 17, in test_condition2
    self.assertEquals(self.num2, self.num3)
AssertionError: 5 != 10

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Test case completed. Result:

Test case completed. Result:

여기에서 unittest.main() 메소드가 실행되면 Tester 클래스의 인스턴스가 생성됩니다. 그 후 setUp() 메소드가 실행됩니다. setUp() 메소드는 변수를 초기화하고 다른 모듈의 값을 Tester 클래스로 가져옵니다.

또한 test_condition1()test_condition2() 메소드를 구현한 것을 관찰할 수 있습니다. 여기서 우리는 condition1condition2라는 이름 앞에 test_를 포함하여 인터프리터가 이러한 방법이 테스트 사례를 시행하는 데 사용된다는 것을 이해할 수 있도록 했습니다.

test_로 시작하는 메서드 이름을 지정하지 않으면 파이썬 인터프리터에서 메서드를 실행하지 않습니다.

tearDown() 메소드는 모든 테스트 케이스 후에 실행됩니다. 이 방법을 사용하여 변수 및 기타 값을 다시 초기화할 수 있습니다.

모든 테스트 케이스를 실행한 후 결과는 테스트 케이스가 실패했음을 보여줍니다. assertEquals() 메소드가 AssertionError 예외를 발생시킬 때마다 선택적 메시지를 인쇄할 수도 있습니다(즉, 테스트 케이스가 실패함).

이를 위해 아래와 같이 assertEquals() 메소드에 세 번째 입력 인수로 메시지 문자열을 전달해야 합니다.

import unittest


class Tester(unittest.TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        message = "{} is not equal to {}".format(self.num1, self.num3)
        self.assertEquals(self.num1, self.num3, message)

    def test_condition2(self):
        message = "{} is not equal to {}".format(self.num2, self.num3)
        self.assertEquals(self.num2, self.num3, message)


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

출력:

Test case completed. Result:

Test case completed. Result:
/home/aditya1117/PycharmProjects/pythonProject/webscraping.py:15: DeprecationWarning: Please use assertEqual instead.
  self.assertEquals(self.num1, self.num3,message)
.F
======================================================================
FAIL: test_condition2 (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 19, in test_condition2
    self.assertEquals(self.num2, self.num3,message)
AssertionError: 5 != 10 : 5 is not equal to 10

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

여기에서 인터프리터는 두 번째 테스트 케이스가 실패할 때 5 is not equal to 10이라는 메시지도 출력하는 것을 볼 수 있습니다.

assertEquals() 메서드는 2010년에 더 이상 사용되지 않습니다. 따라서 assertEquals() 메서드를 사용하는 동안 DeprecationWarning: 대신 assertEqual을 사용하세요.라는 메시지와 함께 메서드가 더 이상 사용되지 않는다는 경고가 표시됩니다.

Python이 assertEqual() 메서드를 사용하도록 제안하므로 Python에서 같음에 대한 주장을 구현하는 데 이 메서드를 사용하겠습니다.

Python의 assertEqual() 메서드

이름의 s를 제외하고 assertEqual() 메소드의 작동은 assertEquals() 메소드와 완전히 유사합니다. 두 메서드의 구문도 동일합니다.

따라서 다음과 같이 assertEquals() 메서드 대신 assertEqual() 메서드를 사용할 수 있습니다.

import unittest


class Tester(unittest.TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        self.assertEqual(self.num1, self.num3)

    def test_condition2(self):
        self.assertEqual(self.num2, self.num3)


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

출력:

.F
======================================================================
FAIL: test_condition2 (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 17, in test_condition2
    self.assertEqual(self.num2, self.num3)
AssertionError: 5 != 10

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=1)

Test case completed. Result:

Test case completed. Result:

Process finished with exit code 1

출력에서 프로그램이 이전 코드와 동일하게 작동하는 것을 관찰할 수 있습니다. 또한 감가상각에 대한 경고도 받지 못했습니다.

다음과 같이 테스트 케이스에 메시지를 추가할 수 있습니다.

import unittest


class Tester(unittest.TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        message = "{} is not equal to {}".format(self.num1, self.num3)
        self.assertEqual(self.num1, self.num3, message)

    def test_condition2(self):
        message = "{} is not equal to {}".format(self.num2, self.num3)
        self.assertEqual(self.num2, self.num3, message)


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

출력:

.F
======================================================================
FAIL: test_condition2 (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 19, in test_condition2
    self.assertEqual(self.num2, self.num3, message)
AssertionError: 5 != 10 : 5 is not equal to 10

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Test case completed. Result:

Test case completed. Result:

이 기사에서는 assertEquals() 메소드와 assertEqual() 메소드를 사용하기 위해 unittest 모듈에 정의된 TestCase 클래스의 서브클래스를 구현했음을 관찰할 수 있습니다.

Django 프레임워크로 프로그램을 개발하는 동안 Django.test 모듈에 정의된 TestCase 클래스의 하위 클래스를 구현하게 될 수 있습니다. 이 경우 프로그램은 아래와 같이 오류가 발생합니다.

import unittest
from django.test import TestCase


class Tester(TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        message = "{} is not equal to {}".format(self.num1, self.num3)
        self.assertEqual(self.num1, self.num3, message)

    def test_condition2(self):
        message = "{} is not equal to {}".format(self.num2, self.num3)
        self.assertEqual(self.num2, self.num3, message)


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

출력:

E
======================================================================
ERROR: setUpClass (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/test/testcases.py", line 1201, in setUpClass
    super().setUpClass()
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/test/testcases.py", line 187, in setUpClass
    cls._add_databases_failures()
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/test/testcases.py", line 209, in _add_databases_failures
    cls.databases = cls._validate_databases()
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/test/testcases.py", line 195, in _validate_databases
    if alias not in connections:
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/utils/connection.py", line 73, in __iter__
    return iter(self.settings)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/utils/connection.py", line 45, in settings
    self._settings = self.configure_settings(self._settings)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/db/utils.py", line 144, in configure_settings
    databases = super().configure_settings(databases)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/utils/connection.py", line 50, in configure_settings
    settings = getattr(django_settings, self.settings_name)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/conf/__init__.py", line 84, in __getattr__
    self._setup(name)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/conf/__init__.py", line 65, in _setup
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

----------------------------------------------------------------------
Ran 0 tests in 0.003s

FAILED (errors=1)

여기에서 django.test 모듈의 TestCase 클래스를 사용할 때 프로그램이 오류가 발생하는 것을 관찰할 수 있습니다. 따라서 테스트 케이스가 실행되지 않습니다.

따라서 Django.test 모듈이 아닌 unittest 모듈에 정의된 TestCase 클래스를 항상 사용해야 합니다.

결론

우리는 애플리케이션을 테스트하기 위해 assert 문, assertEquals()assertEqual() 메서드를 사용하여 논의했습니다.

여기서 assert statementassertEqual() 메소드는 프로덕션 환경의 실제 애플리케이션에서 사용할 수 없다는 것을 기억하면 도움이 될 것입니다. 프로덕션 환경에 코드를 배포하기 전에 이러한 방법을 사용하여 애플리케이션을 테스트할 수 있습니다.

또한 assertEquals() 메서드 대신 assertEquals() 메서드를 사용해야 합니다. 후자는 파이썬 프로그래밍 언어에서 더 이상 사용되지 않기 때문입니다.

작가: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub