Behat으로 Drupal 웹사이트 테스트가 더 쉬워졌습니다(종합 튜토리얼)

게시 됨: 2020-09-08

위트와 지혜의 왕 티리온 라니스터(Tyrion Lannister)는 "세상에 좋은 이야기보다 더 강력한 것은 없다"고 말했습니다.

스토리와 원활한 커뮤니케이션의 힘은 협업적이고 효율적인 소프트웨어 제공을 가능하게 합니다. 애자일 방법론에서 발전한 행동 주도 개발(BDD) 기술은 이러한 능력을 최대한 활용하여 테스트 프로세스를 자동화합니다. Behat 은 "유비쿼터스 언어"를 사용하여 자동화된 테스트를 가능하게 하는 BDD 기술 중 하나입니다. Behat, Mink, Gherkin 및 Drupal에서 구현하는 방법에 대해 자세히 알아보겠습니다.

비트 드루팔

베하트란?

Behat은 BDD(행동 주도 개발)를 활용하여 테스트를 자동화하는 데 사용되는 오픈 소스 PHP 프레임워크입니다. BDD 접근 방식은 지속적인 커뮤니케이션과 간단한 텍스트 스토리에 중점을 두어 고품질 소프트웨어 제공을 보장합니다. BDD를 사용하여 테스터는 사람이 읽을 수 있는 언어로 테스트 케이스를 빌드합니다. 이 때문에 제품 소유자에서 개발자에 이르기까지 모든 사람이 현재 시나리오를 이해하고 지속적으로 피드백을 얻을 수 있으므로 전체 팀을 동일한 페이지에 모으기가 쉽습니다.

작은 오이 란 무엇입니까?

Behat 도구에서 사용하는 언어는 Gherkin으로, 비즈니스에서 읽을 수 있고 도메인별 언어입니다. Gherkin은 또한 살아있는 문서 역할을 하며 보고서를 생성하여 각 테스트 실행을 문서화할 수 있습니다. 이 간단한 공백 기반 언어는 간단한 언어 단어를 키워드로 사용합니다. 들여쓰기(공백/탭 사용)와 줄 끝은 테스트 케이스의 구조를 정의합니다. 언어를 작성하고 이해하는 것은 쉽지만 최종 결과는 더 나은 협업, 효율성, 자동화 및 추적 가능성을 구현하는 데 중점을 두어야 합니다. 테스트 케이스는 직관적으로 작성되어야 하며, 중요한 요소에 초점을 맞추고, 중복 레코드 확인을 피하고, 좋은 문법을 사용해야 합니다.

밍크는 무엇입니까?

Mink는 웹 애플리케이션으로 테스트 시나리오를 시뮬레이션하는 오픈 소스 브라우저 컨트롤러입니다. 테스트 케이스가 작성되면 실행하고 사용자 작업을 에뮬레이트해야 합니다. Mink를 사용하면 동일한 테스트 시나리오를 사용하고 Goutte, Selenium, Chrome, Zombie 등과 같은 다양한 브라우저 에뮬레이터에서 실행할 수 있습니다. Behat Drupal 확장을 설치하는 동안 Mink에 대한 종속성이 표시되므로 설치도 확인하십시오.

Drupal에서 Behat 설치 및 구현

Drupal 프로젝트에 Behat을 설치하는 공식적인 방법은 Composer를 사용하는 것입니다. Behat을 설치할 수 있을 뿐만 아니라 나중에 최신 버전이 나오면 쉽게 업데이트할 수 있습니다.

• 프로젝트 폴더 내에서 다음 명령을 실행합니다.

 $ 작곡가는 behat/behat 필요

• 또는 composer.json 파일 내부에 require 문을 추가하십시오.

 "필요하다": {
                "behat/behat": "^3.0.0",
     "phpunit/phpunit": "^5.0.0"
     }

• 다음으로 터미널에서 composer install 명령어를 실행합니다.
• 완료되면 Behat 파일이 있는 새 디렉토리 bin /도 표시됩니다. 이것은 Behat 실행 파일이며 테스트를 실행하고 디버그 정보를 얻는 데 사용할 것입니다.
• 다음으로 프로젝트의 루트 폴더 안에 behat.yml 이라는 파일을 생성합니다. Behat이 실행되면 구성에 사용하는 behat.yml 파일을 찾습니다.

기본:
  스위트룸:
    기본:
      컨텍스트:
        - Drupal\DrupalExtension\Context\DrupalContext
  확장:
    Behat\Mink 확장:
      통풍: ~
      base_url: http://example.org/ # 사이트의 URL로 대체
    Drupal\DrupalExtension:
      블랙박스: ~

프로젝트를 초기화하려면 다음 명령어를 실행하세요.

 공급업체/bin/behat –초기화

이렇게 하면 features / 폴더와 bootstrap/FeatureContext.php 기본 컨텍스트 파일이 features / 폴더 안에 생성됩니다.

Behat으로 스토리 작성 및 테스트 실행

우리의 목표는 가장 효과적인 방법으로 이야기를 설명하는 것입니다. 이야기는 사람이 읽을 수 있는 언어인 Gherkin으로 작성되었으며 확장자는 . 기능 / 디렉토리 아래의 기능 .

사이트의 기본 페이지 콘텐츠 형식에 콘텐츠를 성공적으로 추가할 수 있는지 여부를 테스트해야 한다고 가정해 보겠습니다. 그렇게 하려면 페이지에 액세스하여 필드를 채우고 관리자로 저장해야 합니다.

따라서 첫 번째 이야기를 작성해 보겠습니다.

 기능: 기본페이지 확인 CT
 페이지를 생성하려면
 관리자로서
 /node/add/page에 액세스하고 싶습니다.
 페이지를 만들 수 있도록

시나리오: 기본 페이지 CT
 "관리자" 역할을 가진 사용자로 로그인한 경우
 "/노드/추가/페이지"로 이동하면
 그리고 "edit-title-0-value"에 "기본 페이지 제목"을 입력합니다.
 "편집-제출"을 눌렀을 때
 그런 다음 "기본 페이지 기본 페이지 제목이 생성되었습니다"가 표시되어야 합니다.

이 파일의 이름은 basic_page.feature 로 지정할 수 있습니다. 각 기능에는 기능의 특정 동작을 설명하는 여러 시나리오가 있을 수 있습니다. 각 시나리오에는 다음 섹션이 있습니다.
주어진 - 시스템의 시작 상태를 자세히 설명합니다.
언제 - 사용자가 취하는 작업을 포함합니다.
그런 다음 - 사용자가 조치를 취한 후 표시되는 내용을 설명합니다.
그리고 - 시나리오에서 연결을 유지합니다.
Then, And, But 사이에는 큰 차이가 없습니다. 이 단어는 시나리오를 자연스럽고 읽기 쉽게 만드는 데 사용할 수 있습니다.

모든 기능 파일은 vendor/bin/behat에서 실행할 수 있습니다. 특정 기능 파일을 실행하려면 vendor/bin/behat features/basic_page.feature를 실행하세요. 시나리오가 정의된 행 번호를 추가하여 단일 시나리오를 실행하는 방법도 있습니다: vendor/bin/behat features/basic_page.feature:11 .

시나리오에서 사용되는 모든 명령문 구문을 제공하는 vendor/bin/behat -dl과 같은 명령이 있으며 vendor/bin/behat -di는 예제와 함께 구문을 제공합니다.

기능 파일을 작성하는 방법

 Behat은 웹 사이트의 URL에 대해 컬 요청을 실행하므로 테스트 프로세스가 상당히 빨라지지만 Behat은 Javascript가 필요한 기능을 테스트할 수 있는 능력을 잃게 됩니다. 따라서 기능을 테스트하려면 다음과 같이 Javascript가 필요한 모든 시나리오 전에 @javascript 태그만 추가하면 됩니다.

기능: 기본페이지 확인 CT
 페이지를 생성하려면
 관리자로서
 /node/add/page에 액세스하고 싶습니다.
 페이지를 만들 수 있도록

@api @자바스크립트
시나리오: 기본 페이지 CT
 나는 "관리자"역할을 가진 사용자로 로그인하고 주어진
 "/노드/추가/페이지"로 이동 하면
그리고 "edit-title-0-value"에 "기본 페이지 제목"을 입력합니다.
그리고 "기본 페이지 콘텐츠"로 "edit-body-0-value" 필드에 wysiwyg를 채웁니다.
"편집-제출"을 눌렀을 
 그런 다음 "기본 페이지 기본 페이지 제목이 생성되었습니다"가 표시되어야 합니다.


이를 테스트하려면 vendor/bin/behat 을 실행 하십시오 . 시나리오는 함수에 매핑되어야 하기 때문에 시나리오에서 정의되지 않은 단계를 보여줍니다.

행동하다


코드 조각을 복사하여 컨텍스트 파일 FeatureContext.php에 붙여넣거나 vendor/bin/behat --dry-run --append-snippets를 실행할 수 있습니다.

그런 다음 다음과 같이 FeatureContext.php에 함수에 대한 정의를 작성할 수 있습니다.

 <?php

Behat\Mink\Exception\ExpectationException을 사용하십시오.
Drupal\DrupalExtension\Context\RawDrupalContext 사용;

/**
 * 특정 컨텍스트에서 애플리케이션 기능을 정의합니다.
 */
클래스 FeatureContext 확장 RawDrupalContext {

  /**
   * 밍크 컨텍스트.
   *
   * @var Drupal\DrupalExtension\Context\MinkContext
   */
  보호된 $minkContext;

  /**
   * 컨텍스트를 초기화합니다.
   *
   * 모든 시나리오에는 고유한 컨텍스트 인스턴스가 있습니다.
   * 당신은 또한 임의의 인수를 전달할 수 있습니다
   * behat.yml을 통한 컨텍스트 생성자.
   */
  공개 함수 __construct() {
  }

  /**
   * 필드에 wysiwyg를 입력하십시오.
   *
   * @Then 나는 wysiwyg 필드에 :locator를 :value로 채운다.
   */
  공개 함수 iFillInWysiwygOnFieldWith($locator, $value) {
    $el = $this->getSession()->getPage()->findField($locator);
    if (빈($el)) {
      throw new ExpectationException('로케이터가 있는 WYSIWYG를 찾을 수 없음: ' . $locator, $this->getSession());
    }
    $fieldId = $el->getAttribute('id');
    if (빈($fieldId)) {
      throw new Exception('로케이터가 있는 필드의 ID를 찾을 수 없습니다: ' . $locator);
    }
    $this->getSession()
      ->executeScript("CKEDITOR.instances[\"$fieldId\"].setData(\"$value\");");
  }

}

이제 vendor/bin/behat 명령을 실행하고 작성된 모든 시나리오를 통과해야 합니다. 정의된 JS 함수는 " 그리고 나는 wysiwyg on-field "edit-body-0-value" 를 "Basic page content "로 채웁니다 .