파이썬에서 웹 응용 프로그램의 자동 단위 테스트

#파이썬#유니테스트#셀레늄#자동화

이 게시물에서는 기능의 정확성을 확인하기 위해 파이썬에서 웹 응용 프로그램을 단위 테스트하는 방법을 살펴 보겠습니다. 우와! 단위 테스트,웹 응용 프로그램 및 기능 테스트:그 문장은 전문 용어의 소수가 있습니다.

우리는 이전 포스트에서 파이썬 프로그램을 단위 테스트 보았다. 우리는 당신이 단위 테스트에 익숙하지 않은 경우,그것을 통해 이동하는 것이 좋습니다.

단위 테스트 란 무엇입니까?

단위는 프로그램 또는 응용 프로그램의 가장 작은 테스트 가능한 부분입니다.

따라서 단위 테스트는 테스트 가능한 각 구성 요소를 프로그래밍 방식으로 테스트하는 데 사용됩니다.

백엔드 프로그램이나 웹 응용 프로그램과 같은 프런트 엔드 프로그램을 단위 테스트할 수 있습니다.

백엔드 프로그램의 경우 코드의 각 함수 또는 메서드에 대한 단위 테스트를 논리적으로 가장 작은 단위로 작성합니다.

그러나 프론트 엔드의 경우 단위 테스트를 확인하고 그에 따라 작성하려는 다른 기능을 식별합니다.

이 게시물에서는 프론트 엔드 프로그램,즉 웹 응용 프로그램을 단위 테스트 할 것입니다.

웹 응용 프로그램이란 무엇입니까?

크롬,파이어 폭스 또는 사파리와 같은 웹 브라우저에서 렌더링하는 모든 응용 프로그램.

모든 웹 응용 프로그램에는 공통점이 하나 있습니다. 어떻게 구성 해야 설명 하기 위해 서식 언어입니다. 그것은 단순히 텍스트 파일입니다.이 페이지에는 웹 브라우저가 있습니다.)당신에게 예쁜 페이지를 보여주기 위해.

웹 응용 프로그램은 클라이언트-서버 아키텍처에서 작동하며,여기서 웹 서버는 액세스하려는 콘텐츠를 호스팅하고 웹 브라우저는 클라이언트 역할을 합니다.

클라이언트-서버 웹 아키텍처

기능 테스트란 무엇입니까?

이름에서 알 수 있듯이 기능 테스트 코드를 작성할 때 응용 프로그램의 기능을 테스트하는 것이 목표입니다. 즉,응용 프로그램이 기능 사양을 따르는지 확인해야 합니다.

성능 테스트,보안(침투)테스트 및 사용자 수용 가능성 테스트와 같은 다른 유형의 테스트가 있습니다.

작성하는 기능 테스트 코드는 새로운 개발로 인해 이전 기능이 손상되지 않았는지 확인하기 위해 주기적으로 실행되는 회귀 테스트라고 하는 코드에 포함될 수 있습니다.

이 게시물의 끝에서,당신은 아래에 언급 된 전체 코드를 이해할 것이다.

이것이 너무 많다고 느끼면 낙담하지 마십시오. 이 게시물의 목표는이를 해부하고이 코드를 이해하는 방법을 보여 다음 자신을 작성하는 것입니다!

다음 다이어그램에서는 웹 응용 프로그램(페이지)을 자동으로 테스트하는 고급 방법을 보여 줍니다.

웹 애플리케이션 테스트 단계

테스트를 작성하기 위해 유니테스트라는 테스트 프레임워크를 사용합니다. 그것은 매우 비슷합니다.

유니테스트를 통해 초기화 코드를 설정 기능으로 그룹화하고 코드 주석 분해 기능을 정리할 수 있습니다.

다음 다이어그램은 단위 테스트의 전반적인 접근 방식을 보여줍니다.

단위 테스트 프레임워크

위의 다이어그램에서 볼 수 있듯이 테스트 스위트는 하나 이상의 테스트 케이스로 구성됩니다.

테스트 케이스는 하나 이상의 테스트를 가질 수 있습니다. 이 게시물에서는 하나의 테스트로 테스트 케이스에 초점을 맞출 것입니다. 마지막에는 동일한 테스트 사례에 더 많은 테스트를 추가하고 테스트 스위트를 만드는 방법을 보여 드리겠습니다.

앞에서 언급했듯이 각 테스트 사례에는 초기화 및 정리를 각각 수행하는 설치(처음에 실행)및 해체(마지막에 실행)방법이 있습니다.

단위 테스트 케이스의 구조

위의 코드 조각은 단위 테스트 케이스의 구조를 보여줍니다.

줄 1:필요한 라이브러리를 가져옵니다. 우리의 경우 셀레늄 및 단위 테스트 라이브러리를 사용하고 있습니다.

줄 3:이 클래스를 만듭니다.테스트 케이스 클래스. 우리는 그 단위 테스트를 말한다.이 클래스는 자식 클래스입니다.

4 행:설정 방법에 초기화 코드를 추가합니다. 정확한 메서드 이름을 사용하여 유니테스트에 초기화 코드를 추가하고 있음을 알려야 합니다. 이 테스트 케이스를 실행하면 이 메서드가 먼저 실행됩니다.

7 행:테스트 케이스에 포함할 샘플 테스트입니다.

라인 10:테스트 케이스에 있는 또 다른 샘플 테스트입니다.

16 행:이 분해 방법 안에 정리 코드를 추가합니다. 설치 방법과 반대,해체 방법은 마지막으로 실행됩니다.

따라서 메서드 호출 순서는 다음과 같습니다.

설정>테스트 1>테스트 2>…>해체

줄 20:주 프로그램이 여기에서 시작한다고 말합니다.

줄 21:테스트 케이스를 실행하는 방법입니다.

이제 우리가하고 싶었던 실제 시험에 손을 대야 할 때입니다. 리콜,우리는 구글 검색 상자가 적어도 반환하는 경우 테스트 할 것을 5 주어진 검색 키워드에 대한 결과.

먼저 설정 방법을 살펴 보겠습니다.:

이 코드 스 니펫에서는 크롬 브라우저 드라이버를 만듭니다.

당신은 당신이 이미없는 경우 여기에서 셀레늄 크롬 드라이버를 다운로드해야합니다. 이 글을 쓰는 현재,크롬은 버전 74 가 있습니다. 내 크롬 브라우저 버전 73 이기 때문에,나는이 운동에 대한 버전 73 을 다운로드했습니다.

2 행 및 3 행 크롬 옵션을 만들고 셀레늄 웹 드라이버가 테스트를 실행할 때 브라우저를 표시하지 않기를 원한다는 것을 알립니다.

이 옵션을 추가하지 않으면 브라우저가 열리는 지점에서 테스트가 중단됩니다.

이제 해체 방법을 살펴 보겠습니다.:

우리는 단순히 종료 호출하여 드라이버를 정리()방법.

마지막으로,이 테스트 케이스에 포함시킬 테스트를 살펴볼 시간입니다. 반환되는 검색 결과의 수가 5 보다 크거나 같으면 테스트(어설션)할 수 있습니다.

실제 테스트 코드

1 행:테스트 방법은”테스트”라는 단어로 시작합니다.

라인 3:로드 www.google.com 드라이버에 웹 페이지(그 자체를합니다.설치 시간 동안 드라이버가 생성됩니다.)

6 행: 검색 상자를 찾습니다. 이를 확인하려면 페이지를 검사해야 합니다.

7 행:기본값이 있는 경우 검색 상자를 비워 둡니다.

10 행:검색 상자에 검색 문자열”자동 테스트”를 채 웁니다.

행 11:구글에 검색 쿼리를 제출합니다.

14 행:검색 결과 제목을 식별하는 경로.

라인 17:구글 결과 페이지가로드 될 때까지 10 초 동안 기다립니다.

줄 20:줄 14 에 정의된 경로를 사용하여 모든 검색 결과 제목을 가져옵니다.

라인 25 및 26: 검색 결과 제목은 실제로 목록이며,우리는 화면에 출력하기 위해 그들을 통해 반복. 우리는 데모 목적으로 만 이러한 두 줄을 추가. 일반적으로 테스트 스크립트에는 자동화될 때 이러한 출력을 보기 위해 화면을 응시할 수 있는 사람이 없기 때문에 인쇄 화면이 없습니다.

30 행:이것은 우리가하고있는 실제 주장입니다. 이 메서드는 단일 테스트에서 정의 된 메서드입니다.일부 출력이 일부 값보다 큰 경우 우리가 확인할 수 있습니다 테스트 케이스 클래스.

단위 테스트.사실 테스트 케이스는 우리에게 등등보다 큰,보다 작은을 확인하는 등의 방법의 집합을 제공합니다 당신이 주장하고 싶은 것에 따라. 다음 차트에서는 사용 가능한 몇 가지 일반적인 어설션 메서드를 보여 줍니다.

단위 테스트에서 일반적인 어설션 방법.테스트 케이스

처음 그림과 같이 코드에서 다음을 호출하여 테스트 케이스를 작성할 수 있습니다:

unittest.main()

명령줄에 테스트 케이스를 저장하는 데 사용한 파일 이름을 입력할 수 있습니다.이 문제를 해결하는 데 도움이되는 몇 가지 방법이 있습니다.

다음과 유사한 출력이 표시됩니다:

테스트 사례 실행 출력

테스트가 실패하면 실패한 테스트 방법과 함께 실패 메시지가 표시됩니다.

이것이 첫 번째 성공적인 셀레늄/단위 테스트 테스트 사례입니다. 축하해! 그것은 중요한 이정표입니다.

보너스

당신이 스팀이있는 경우,나는 셀레늄/유니테스트 기본 웹 응용 프로그램 자동화 테스트에 더 깊이 얻기 위해 나머지를 수행하는 것이 좋습니다 것입니다.

제목이”구글”과 같은지 테스트하고 싶다고 가정 해 봅시다.

테스트 코드는 다음과 같습니다:

def test_header(self):
self.driver.get("http://www.google.com")
self.assertEqual("Google", self.driver.title)

이제 전체 테스트 케이스는 다음과 같습니다:

class GoogleSearchTest(unittest.TestCase):
def setUp(self): def test_header(self): def test_result_count(self): def tearDown(self):
if __name__ == "__main__":
unittest.main()

위의 인쇄 화면이 주석 처리되었다고 가정 해 봅시다. 업데이트된 테스트 사례를 실행할 때 다음과 같이 출력을 가져와야 합니다:

test_header (__main__.GoogleSearchTest) ... ok
test_result_count (__main__.GoogleSearchTest) ... ok----------------------------------------------------------------------
Ran 2 tests in 13.799s
OK

그것은 두 가지 테스트를 실행했으며 둘 다 성공적이라고 말합니다.

첫 번째 테스트에서 어설션 동일 조건을 다음과 같이 변경한다고 가정해 보겠습니다:

self.assertEqual("Microsoft", self.driver.title)

당신은 여기서 무슨 일이 일어날 것이라고 생각하십니까?

예,당신은 바로 그것을 짐작. 첫 번째 테스트 케이스는 자체 실패 할 것입니다.드라이버.제목은 구글과 동일,하지 마이크로 소프트.

다음과 유사한 출력을 얻을 수 있습니다:

test_header (__main__.GoogleSearchTest) ... FAIL
test_result_count (__main__.GoogleSearchTest) ... ok
====================================================================
FAIL: test_header (__main__.GoogleSearchTest)
--------------------------------------------------------------------
Traceback (most recent call last):
File "google_search_test.py", line 19, in test_header
self.assertEqual("Microsoft", self.driver.title)
AssertionError: 'Microsoft' != 'Google'
- Microsoft
+ Google
--------------------------------------------------------------------
Ran 2 tests in 14.011s
FAILED (failures=1)

위의 출력은 하나의 테스트 만 성공하고 실패했다고 말합니다.

테스트 사례를 처음 작성할 때 다음과 같은 상황이 발생할 수 있습니다.

테스트 사례가 정확하다고 가정하면 코드에서 버그를 식별하고 각 개발자가 문제를 해결하고 다시 테스트하도록 유도합니다.

이 오류가 회귀 테스트에서 발생하는 경우,이 버그는 기존 코드 기반 위에 수행 된 새로운 소프트웨어 개발로 인해 도입됩니다.

이것은 이전 기능이 작동하는지 확인하기 위해 수정해야하는 새로운 코드베이스에 문제가 있음을 보여줍니다. 다시 말하지만,개발자는 알아서 할 필요가있다.

많은 테스트 케이스를 갖는 것은 어떻습니까? 테스트 케이스 1 과 테스트 케이스 2 가 있다고 가정 해 봅시다.

다음과 같이 테스트 도구 모음을 만들고 테스트 러너를 사용하여 실행할 수 있습니다:

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestCase1))
suite.addTest(unittest.makeSuite(TestCase2))
runner = unittest.TextTestRunner()
runner.run(suite)

위의 코드는 테스트 케이스 1 에서 모든 테스트를 실행 한 다음 테스트 케이스 2 에서 실행됩니다.

오늘입니다. 희망이 도움이됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다.