Laravel5.Behat으로 해보자.

10961 단어 behatLaravelbddPHP

왜 Behat을 사용하는지


후쿠오카 PHP 회의에서 phpspeec와 behat의 말을 들었어요.
behat이 더 효율적이라고 생각해서 bethat부터 해 보기로 했어요.
↓ 슬라이드
phpspec으로 시작하는 BDD
http://www.slideshare.net/yuukitakezawa/phpspec-bdd
behat 연장 방법
http://www.slideshare.net/RyoTomidokoro/behat-49897353
그나저나 저는 지금까지 테스트 코드를 거의 쓴 적이 없어요...
항상 "테스트 코드가 있어야 하는구나"라고 생각하고 예전의 시뮬레이션 방법으로 했다.너는 정말 장작이다.

컨디션


라벨 5시대의 홈스테드를 기반으로 내 Vagrant 환경을 구축했다.
가상 Ubuntu에서 작업합니다.

쓸것


그런 게 있으니까 이걸로
https://github.com/laracasts/Behat-Laravel-Extension

단계 설정


위의 READMEmd와 애니메이션의 순서에 따라 진행합니다.
비디오
https://laracasts.com/lessons/laravel-5-and-behat-bffs

composter로 한 벌 담아요.


laavel 디렉터리로 이동하고 다음 동작을 수행합니다sudo composer require behat/behat behat/mink behat/mink-extension laracasts/behat-laravel-extension --dev

behat.만들다


내용도 README를 기반으로 한 env입니다.path 지정.envvim behat.ymlbehat.yml
default:
    extensions:
        Laracasts\Behat:
            env_path: .env
        Behat\MinkExtension:
            default_session: laravel
            laravel: ~
Behat를 위해 Laavel의.env를 준비하고 싶다면env_path 파일을 평론하거나 지정할 수 있습니다.이해했어.

behat --init


vender에 behat이 있기 때문에 명령을 실행합니다
$ vendor/behat/behat/bin/behat --init
+d features - place your *.feature files here 
+d features/bootstrap - place your context classes here 
+f features/bootstrap/FeatureContext.php - place your definitions, transformations and hooks here
  • 피처스 목록을 만들었어요!피처 파일을 여기에 놓으세요!
  • 그중에서도 bootstrap을 했어요!
  • FeatureContext.php도 모형을 만들었어요!너의 정의는 여기에 써라
  • 이런 곳인가

    feature 쓰기


    Laravel5.1을 넣은 상태라서 시험 내용은
    "첫 페이지에 액세스하면 Laavel 5로 표시"
    써 보아라.
    features/home.feature
    Feature: show laravel home
    
      Scenario: Home
        Given I am on the homepage
        Then I should see "Laravel 5"
    

    FeatureContext.php


    behat의 초기 형태를 유지하여 움직이지 않다
    "Behat\Mink Extension\Context\Mink Context를 계승하십시오."그래서 읽고 extends를 씁니다.
    features/bootstrap/FeatureContext.php
    <?php
    
    use Behat\Behat\Context\Context;
    use Behat\Behat\Context\SnippetAcceptingContext;
    use Behat\MinkExtension\Context\MinkContext;
    
    /**
     * Defines application features from the specific context.
     */
    class FeatureContext extends MinkContext implements Context, SnippetAcceptingContext
    {
        /**
         * Initializes context.
         *
         * Every scenario gets its own context instance.
         * You can also pass arbitrary arguments to the
         * context constructor through behat.yml.
         */
        public function __construct()
        {
        }
    }
    
    DB에 대한 변경 사항을 반영하지 않기 위해 Transaction의 스크롤을 사용하거나
    메일을 보내는 테스트에서도 보내고 싶지 않을 때 쓰는 트레이트를 준비했다.
    사용할 때는 FeatureContext에서 사용하고 싶은trait로 읽으면 됩니다.

    시험해 보다

    $ vendor/behat/behat/bin/behat
    Feature: show laravel home
    
      Scenario: Home                  # features/home.feature:3
        Given I am on the homepage    # FeatureContext::iAmOnHomepage()
        Then I should see "Laravel 5" # FeatureContext::assertPageContainsText()
    
    1 scenario (1 passed)
    2 steps (2 passed)
    0m1.16s (23.85Mb)
    
    시험이 순조롭게 끝났다.

    쓸 수 있는 시험 일람표


    아직 쓸 수 있는 시험을 제대로 파악하지 못했다.
    수행vendor/behat/behat/bin/behat -dl하면 차트 표시
    이것을 참고로 모색하다.
    변형은 다음과 같은 테스트를 쓸 수 있다.
    $ vendor/behat/behat/bin/behat -dl
    default | Given /^(?:|I )am on (?:|the )homepage$/
    default |  When /^(?:|I )go to (?:|the )homepage$/
    default | Given /^(?:|I )am on "(?P<page>[^"]+)"$/
    default |  When /^(?:|I )go to "(?P<page>[^"]+)"$/
    default |  When /^(?:|I )reload the page$/
    default |  When /^(?:|I )move backward one page$/
    default |  When /^(?:|I )move forward one page$/
    default |  When /^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/
    default |  When /^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/
    default |  When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/
    default |  When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with:$/
    default |  When /^(?:|I )fill in "(?P<value>(?:[^"]|\\")*)" for "(?P<field>(?:[^"]|\\")*)"$/
    default |  When /^(?:|I )fill in the following:$/
    default |  When /^(?:|I )select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/
    default |  When /^(?:|I )additionally select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/
    default |  When /^(?:|I )check "(?P<option>(?:[^"]|\\")*)"$/
    default |  When /^(?:|I )uncheck "(?P<option>(?:[^"]|\\")*)"$/
    default |  When /^(?:|I )attach the file "(?P<path>[^"]*)" to "(?P<field>(?:[^"]|\\")*)"$/
    default |  Then /^(?:|I )should be on "(?P<page>[^"]+)"$/
    default |  Then /^(?:|I )should be on (?:|the )homepage$/
    default |  Then /^the (?i)url(?-i) should match (?P<pattern>"(?:[^"]|\\")*")$/
    default |  Then /^the response status code should be (?P<code>\d+)$/
    default |  Then /^the response status code should not be (?P<code>\d+)$/
    default |  Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)"$/
    default |  Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)"$/
    default |  Then /^(?:|I )should see text matching (?P<pattern>"(?:[^"]|\\")*")$/
    default |  Then /^(?:|I )should not see text matching (?P<pattern>"(?:[^"]|\\")*")$/
    default |  Then /^the response should contain "(?P<text>(?:[^"]|\\")*)"$/
    default |  Then /^the response should not contain "(?P<text>(?:[^"]|\\")*)"$/
    default |  Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/
    default |  Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/
    default |  Then /^the "(?P<element>[^"]*)" element should contain "(?P<value>(?:[^"]|\\")*)"$/
    default |  Then /^the "(?P<element>[^"]*)" element should not contain "(?P<value>(?:[^"]|\\")*)"$/
    default |  Then /^(?:|I )should see an? "(?P<element>[^"]*)" element$/
    default |  Then /^(?:|I )should not see an? "(?P<element>[^"]*)" element$/
    default |  Then /^the "(?P<field>(?:[^"]|\\")*)" field should contain "(?P<value>(?:[^"]|\\")*)"$/
    default |  Then /^the "(?P<field>(?:[^"]|\\")*)" field should not contain "(?P<value>(?:[^"]|\\")*)"$/
    default |  Then /^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox should be checked$/
    default |  Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" (?:is|should be) checked$/
    default |  Then /^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox should not be checked$/
    default |  Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" should (?:be unchecked|not be checked)$/
    default |  Then /^the checkbox "(?P<checkbox>(?:[^"]|\\")*)" is (?:unchecked|not checked)$/
    default |  Then /^(?:|I )should see (?P<num>\d+) "(?P<element>[^"]*)" elements?$/
    default |  Then /^print current URL$/
    default |  Then /^print last response$/
    default |  Then /^show last response$/
    
    시험에 실패한 원인을 모르면 다음 세 가지 방법으로 상황을 관찰할 수 있다.
    default | Then/^print current URL$/
    default | Then/^print last response$/
    default | Then/^show last response$/

    다음


    2015.7.29 추가 테스트
    Behat-Laavel-Extension을 사용하여 Laavel5의 로그인 인증 테스트
    지금까지 이 테스트가 만들어졌습니다.
    기릿허브에서 푸시를 하면 이동할 수 있는 제인킨스 씨는 테스트가 뛸 수 있도록 설정해 보세요.
    벚꽃의 VPS에 제인킨스를 설치하고 테스트 OK에서 자동 디버깅 환경 구축(1)
    벚꽃의 VPS에 제인킨스를 설치하고 테스트 OK 자동 디버깅 환경 구축(2)
    벚꽃의 VPS에 제인킨스를 설치하고 테스트 OK에서 자동 디버깅 환경 구축(3)
    벚꽃의 VPS에 제인킨스를 설치하고 테스트 OK에서 자동 디버깅 환경을 구축(4)

    좋은 웹페이지 즐겨찾기