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_expression
이 True
로 평가되면 프로그램 실행이 다음 명령문으로 진행됩니다. 반대로 conditional_expression
이 False
로 평가되면 프로그램에서 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==10
이 True
로 평가되므로 오류가 발생하지 않습니다. 따라서 두 번째 print 문도 실행됩니다.
그 후 "assert num2 == num3"
문은 5==10
이 False
로 평가되므로 AssertionError
를 발생시킵니다. 이로 인해 프로그램 실행이 중지되고 세 번째 인쇄 문은 실행되지 않습니다.
AssertionError
예외가 발생할 때 메시지를 표시할 수도 있습니다. 이를 위해 다음 구문을 사용합니다.
assert conditional_expression, message
여기서 message
는 conditional_expression
이 False
로 평가되고 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 10
도 AssertionError
를 통지한 후 인쇄됩니다. 이러한 유형의 메시지를 포함하면 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()
메소드를 구현한 것을 관찰할 수 있습니다. 여기서 우리는 condition1
과 condition2
라는 이름 앞에 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 statement
와 assertEqual()
메소드는 프로덕션 환경의 실제 애플리케이션에서 사용할 수 없다는 것을 기억하면 도움이 될 것입니다. 프로덕션 환경에 코드를 배포하기 전에 이러한 방법을 사용하여 애플리케이션을 테스트할 수 있습니다.
또한 assertEquals()
메서드 대신 assertEquals()
메서드를 사용해야 합니다. 후자는 파이썬 프로그래밍 언어에서 더 이상 사용되지 않기 때문입니다.
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