스레드 애플리케이션 테스트
이 장에서는 스레드 응용 프로그램 테스트에 대해 알아 봅니다. 우리는 또한 테스트의 중요성을 배울 것입니다.
테스트해야하는 이유
테스트의 중요성에 대한 논의를 시작하기 전에 테스트가 무엇인지 알아야합니다. 일반적으로 테스트는 어떤 것이 얼마나 잘 작동하는지 확인하는 기술입니다. 반면에 특히 컴퓨터 프로그램이나 소프트웨어에 대해 이야기하는 경우 테스트는 소프트웨어 프로그램의 기능에 액세스하는 기술입니다.
이 섹션에서는 소프트웨어 테스트의 중요성에 대해 설명합니다. 소프트웨어 개발에서는 클라이언트에 소프트웨어를 출시하기 전에 다시 한 번 확인해야합니다. 그렇기 때문에 숙련 된 테스트 팀이 소프트웨어를 테스트하는 것이 매우 중요합니다. 소프트웨어 테스트의 중요성을 이해하려면 다음 사항을 고려하십시오.
소프트웨어 품질 향상
확실히, 어떤 회사도 저품질 소프트웨어를 제공하고 싶어하지 않으며 어떤 고객도 저품질 소프트웨어를 구입하고 싶어하지 않습니다. 테스트는 버그를 찾고 수정하여 소프트웨어의 품질을 향상시킵니다.
고객 만족
모든 비즈니스에서 가장 중요한 부분은 고객 만족입니다. 버그가없고 양질의 소프트웨어를 제공함으로써 회사는 고객 만족을 얻을 수 있습니다.
새로운 기능의 영향 감소
10000 라인의 소프트웨어 시스템을 만들고 새 기능을 추가해야한다고 가정하면 개발 팀은이 새 기능이 전체 소프트웨어에 미치는 영향에 대해 우려 할 것입니다. 여기서도 테스트는 중요한 역할을합니다. 테스트 팀이 좋은 테스트 모음을 만들면 잠재적 인 치명적인 중단으로부터 우리를 구할 수 있기 때문입니다.
사용자 경험
모든 비즈니스에서 가장 중요한 또 다른 부분은 해당 제품 사용자의 경험입니다. 테스트를 통해서만 최종 사용자가 제품을 간단하고 쉽게 사용할 수 있음을 확인할 수 있습니다.
비용 절감
테스트는 배포 후 수정하는 대신 개발 테스트 단계에서 버그를 찾아 수정하여 소프트웨어의 총 비용을 줄일 수 있습니다. 소프트웨어 제공 후 중대한 버그가 발생하면 비용 측면에서는 유형 비용이 증가하고 고객 불만, 회사의 부정적인 평판 등은 무형 비용이 증가합니다.
무엇을 테스트해야합니까?
테스트 대상에 대한 적절한 지식을 가지고있는 것이 항상 권장됩니다. 이 섹션에서는 소프트웨어를 테스트하는 동안 테스터의 주된 동기가 무엇인지 먼저 이해합니다. 코드 커버리지, 즉 테스트하는 동안 테스트 스위트가 히트 한 코드 라인 수는 피해야합니다. 테스트하는 동안 코드 줄 수에만 집중하면 시스템에 실제 가치가 추가되지 않기 때문입니다. 일부 버그가 남아있을 수 있으며 배포 후에도 나중에 반영됩니다.
테스트 대상과 관련된 다음 중요 사항을 고려하십시오.
코드 커버리지보다는 코드의 기능을 테스트하는 데 집중해야합니다.
먼저 코드의 가장 중요한 부분을 테스트 한 다음 코드에서 덜 중요한 부분으로 이동해야합니다. 확실히 시간을 절약 할 수 있습니다.
테스터는 소프트웨어를 한계까지 밀어 붙일 수있는 다양한 테스트를 거쳐야합니다.
동시 소프트웨어 프로그램 테스트를위한 접근 방식
멀티 코어 아키텍처의 진정한 기능을 활용하는 기능으로 인해 동시 소프트웨어 시스템이 순차 시스템을 대체하고 있습니다. 최근에는 휴대 전화부터 세탁기, 자동차, 비행기 등 모든 분야에서 동시 시스템 프로그램이 사용되고 있습니다. 단일 스레드 응용 프로그램에 여러 스레드를 추가하면 동시 소프트웨어 프로그램 테스트에 더 많은주의가 필요합니다. 이미 버그라면 여러 버그로 끝날 것입니다.
동시 소프트웨어 프로그램에 대한 테스트 기술은 경쟁 조건, 교착 상태 및 원 자성 위반과 같은 잠재적으로 유해한 패턴을 노출하는 인터리빙을 선택하는 데 광범위하게 초점을 맞추고 있습니다. 다음은 동시 소프트웨어 프로그램을 테스트하는 두 가지 방법입니다.
체계적인 탐색
이 접근 방식은 가능한 한 광범위하게 인터리빙 공간을 탐색하는 것을 목표로합니다. 이러한 접근 방식은 무차별 대입 기술을 채택 할 수 있고 다른 접근 방식은 부분 순서 감소 기술 또는 휴리스틱 기술을 채택하여 인터리빙 공간을 탐색 할 수 있습니다.
부동산 중심
속성 기반 접근 방식은 의심스러운 메모리 액세스 패턴과 같은 특정 속성을 노출하는 인터리빙에서 동시성 오류가 발생할 가능성이 더 높다는 관찰에 의존합니다. 서로 다른 속성 기반 접근 방식은 경쟁 조건, 교착 상태 및 원 자성 위반과 같은 다양한 결함을 대상으로하며 이는 하나 또는 다른 특정 속성에 더 의존합니다.
테스트 전략
테스트 전략은 테스트 접근 방식이라고도합니다. 이 전략은 테스트가 수행되는 방법을 정의합니다. 테스트 접근 방식에는 두 가지 기술이 있습니다.
사전 예방
빌드가 생성되기 전에 결함을 찾아 수정하기 위해 테스트 설계 프로세스를 가능한 한 빨리 시작하는 접근 방식입니다.
반응성
개발 프로세스가 완료 될 때까지 테스트가 시작되지 않는 접근 방식입니다.
파이썬 프로그램에 테스트 전략이나 접근 방식을 적용하기 전에 소프트웨어 프로그램이 가질 수있는 오류의 종류에 대한 기본적인 아이디어가 있어야합니다. 오류는 다음과 같습니다-
구문 오류
프로그램 개발 중에 많은 작은 오류가있을 수 있습니다. 오류는 대부분 입력 실수로 인해 발생합니다. 예를 들어, 콜론 누락, 키워드 철자 오류 등이 있습니다. 이러한 오류는 논리가 아닌 프로그램 구문의 오류로 인한 것입니다. 따라서 이러한 오류를 구문 오류라고합니다.
의미 오류
의미 오류는 논리 오류라고도합니다. 소프트웨어 프로그램에 논리 또는 의미 오류가있는 경우 명령문은 올바르게 컴파일되고 실행되지만 논리가 올바르지 않기 때문에 원하는 출력을 제공하지 않습니다.
단위 테스트
이것은 파이썬 프로그램을 테스트하기 위해 가장 많이 사용되는 테스트 전략 중 하나입니다. 이 전략은 코드의 단위 또는 구성 요소를 테스트하는 데 사용됩니다. 단위 또는 구성 요소는 코드의 클래스 또는 기능을 의미합니다. 단위 테스트는 "작은"단위를 테스트하여 대규모 프로그래밍 시스템의 테스트를 단순화합니다. 위의 개념의 도움으로 단위 테스트는 소스 코드의 개별 단위가 원하는 출력을 반환하는지 확인하기 위해 테스트하는 방법으로 정의 될 수 있습니다.
이후 섹션에서는 단위 테스트를위한 다양한 Python 모듈에 대해 알아 봅니다.
unittest 모듈
단위 테스트를위한 첫 번째 모듈은 unittest 모듈입니다. JUnit에서 영감을 얻었으며 기본적으로 Python3.6에 포함되어 있습니다. 테스트 자동화, 테스트를위한 설정 및 종료 코드 공유, 테스트를 컬렉션으로 집계,보고 프레임 워크에서 테스트의 독립성을 지원합니다.
다음은 unittest 모듈에서 지원하는 몇 가지 중요한 개념입니다.
텍스트 고정
테스트를 시작하기 전에 실행하고 테스트가 끝나면 해체 할 수 있도록 테스트를 설정하는 데 사용됩니다. 테스트를 시작하기 전에 필요한 임시 데이터베이스, 디렉토리 등의 생성이 포함될 수 있습니다.
테스트 케이스
테스트 케이스는 필요한 응답이 특정 입력 세트에서 오는지 여부를 확인합니다. unittest 모듈에는 새 테스트 케이스를 만드는 데 사용할 수있는 TestCase라는 기본 클래스가 포함되어 있습니다. 그것은 기본적으로 두 가지 방법을 포함합니다-
setUp()− 테스트 픽스처를 시험하기 전에 설치하는 후크 방법. 구현 된 테스트 메서드를 호출하기 전에 호출됩니다.
tearDown( − 클래스의 모든 테스트를 실행 한 후 클래스 픽스처를 분해하기위한 후크 메서드.
테스트 스위트
테스트 스위트, 테스트 케이스 또는 둘 다의 모음입니다.
테스트 러너
테스트 케이스 또는 슈트의 실행을 제어하고 사용자에게 결과를 제공합니다. 결과를 제공하기 위해 GUI 또는 간단한 텍스트 인터페이스를 사용할 수 있습니다.
Example
다음 Python 프로그램은 unittest 모듈을 사용하여 Fibonacci. 이 프로그램은 피보나치 수열을 계산하는 데 도움이됩니다. 이 예제에서는 다른 메서드를 사용하여 테스트 케이스를 정의하기 위해 Fibo_test라는 클래스를 만들었습니다. 이러한 메서드는 unittest.TestCase에서 상속됩니다. 기본적으로 setUp ()과 tearDown ()이라는 두 가지 메서드를 사용하고 있습니다. 우리는 또한 testfibocal 방법을 정의합니다. 테스트 이름은 문자 테스트로 시작해야합니다. 마지막 블록에서 unittest.main ()은 테스트 스크립트에 대한 명령 줄 인터페이스를 제공합니다.
import unittest
def fibonacci(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
class Fibo_Test(unittest.TestCase):
def setUp(self):
print("This is run before our tests would be executed")
def tearDown(self):
print("This is run after the completion of execution of our tests")
def testfibocal(self):
self.assertEqual(fib(0), 0)
self.assertEqual(fib(1), 1)
self.assertEqual(fib(5), 5)
self.assertEqual(fib(10), 55)
self.assertEqual(fib(20), 6765)
if __name__ == "__main__":
unittest.main()
명령 줄에서 실행하면 위의 스크립트는 다음과 같은 출력을 생성합니다.
산출
This runs before our tests would be executed.
This runs after the completion of execution of our tests.
.
----------------------------------------------------------------------
Ran 1 test in 0.006s
OK
이제 더 명확하게하기 위해 피보나치 모듈을 정의하는 데 도움이되는 코드를 변경하고 있습니다.
예를 들어 다음 코드 블록을 고려하십시오-
def fibonacci(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
코드 블록에 대한 몇 가지 변경 사항은 다음과 같습니다.
def fibonacci(n):
a, b = 1, 1
for i in range(n):
a, b = b, a + b
return a
이제 변경된 코드로 스크립트를 실행하면 다음과 같은 출력이 표시됩니다.
This runs before our tests would be executed.
This runs after the completion of execution of our tests.
F
======================================================================
FAIL: testCalculation (__main__.Fibo_Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "unitg.py", line 15, in testCalculation
self.assertEqual(fib(0), 0)
AssertionError: 1 != 0
----------------------------------------------------------------------
Ran 1 test in 0.007s
FAILED (failures = 1)
위의 출력은 모듈이 원하는 출력을 제공하지 못했음을 보여줍니다.
Docktest 모듈
docktest 모듈은 단위 테스트에도 도움이됩니다. 또한 파이썬과 함께 미리 패키지로 제공됩니다. unittest 모듈보다 사용하기 쉽습니다. unittest 모듈은 복잡한 테스트에 더 적합합니다. doctest 모듈을 사용하려면 가져와야합니다. 해당 함수의 독 스트링에는 출력과 함께 대화 형 파이썬 세션이 있어야합니다.
코드에서 모든 것이 정상이면 docktest 모듈에서 출력이 없습니다. 그렇지 않으면 출력을 제공합니다.
예
다음 Python 예제는 docktest 모듈을 사용하여 Fibonacci라는 모듈을 테스트합니다.이 모듈은 숫자의 Fibonacci 시리즈를 계산하는 데 도움이됩니다.
import doctest
def fibonacci(n):
"""
Calculates the Fibonacci number
>>> fibonacci(0)
0
>>> fibonacci(1)
1
>>> fibonacci(10)
55
>>> fibonacci(20)
6765
>>>
"""
a, b = 1, 1
for i in range(n):
a, b = b, a + b
return a
if __name__ == "__main__":
doctest.testmod()
fib라는 해당 함수의 독 스트링에 출력과 함께 대화 형 파이썬 세션이 있음을 알 수 있습니다. 우리 코드가 괜찮다면 doctest 모듈에서 출력이 없을 것입니다. 그러나 어떻게 작동하는지보기 위해 -v 옵션을 사용하여 실행할 수 있습니다.
(base) D:\ProgramData>python dock_test.py -v
Trying:
fibonacci(0)
Expecting:
0
ok
Trying:
fibonacci(1)
Expecting:
1
ok
Trying:
fibonacci(10)
Expecting:
55
ok
Trying:
fibonacci(20)
Expecting:
6765
ok
1 items had no tests:
__main__
1 items passed all tests:
4 tests in __main__.fibonacci
4 tests in 2 items.
4 passed and 0 failed.
Test passed.
이제 피보나치 모듈을 정의하는 데 도움이되는 코드를 변경하겠습니다.
예를 들어 다음 코드 블록을 고려하십시오-
def fibonacci(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
다음 코드 블록은 변경에 도움이됩니다.
def fibonacci(n):
a, b = 1, 1
for i in range(n):
a, b = b, a + b
return a
-v 옵션 없이도 변경된 코드로 스크립트를 실행하면 아래와 같이 출력됩니다.
산출
(base) D:\ProgramData>python dock_test.py
**********************************************************************
File "unitg.py", line 6, in __main__.fibonacci
Failed example:
fibonacci(0)
Expected:
0
Got:
1
**********************************************************************
File "unitg.py", line 10, in __main__.fibonacci
Failed example:
fibonacci(10)
Expected:
55
Got:
89
**********************************************************************
File "unitg.py", line 12, in __main__.fibonacci
Failed example:
fibonacci(20)
Expected:
6765
Got:
10946
**********************************************************************
1 items had failures:
3 of 4 in __main__.fibonacci
***Test Failed*** 3 failures.
위의 출력에서 세 가지 테스트가 실패했음을 알 수 있습니다.