codeception을 cakephp3로 다루는 튜토리얼

6799 단어 codeceptioncakephp3
cakephp3 어드벤트 캘린더 15 일째는 codeception을 사용한 테스트 시작입니다!
연말이 되면 아무것도 없는데 즐거움을 느끼네요!

14일째는 @ 가슴씨의 기사가 됩니다.
CakePHP Migrations limit 옵션 정보

codeception이란?



php에 의한 테스트 프레임 워크입니다.
유닛 테스트, 펑셔널 테스트, 수락 테스트 모두에 대응하여 직관적인 쓰기가 가능합니다. 문서도 충실하기 때문에 한 번 시도해보십시오.
h tp : // 코데세 p 치온. 코m/

시도한 환경


  • vagrant
  • centos7
  • php7.1
  • google chrome
  • chrome driver

  • 주의
    phantomjs를 사용할 수도 있지만 움직이지 않는 함수가 있으므로 권장하지 않습니다.

    google chrome + chromedriver 소개



    아래 URL을 참고하여 자신의 환경에 chrome과 chromedriver를 도입하십시오.
  • htps : // 이 m/유키-k/있어 ms/716bd05f087fc0f835bf
  • htps : // / s. 오, ぇ. 코 m/아/ch 로미우 m. 오 rg / ch rome dri ゔ ぇ r / w
  • chrome driver는 적당히 bin/폴더에 넣어 둡니다.

  • 애플리케이션 작성



    테스트하는 애플리케이션이 없으면 시작되지 않으므로 처음부터 만들어 갑시다.composer create-project --prefer-dist cakephp/app codeception

    DB 설정


    config/app.php 를 자신의 DB 설정에 맞게 설정합니다.
    'username' => 'app_test',
    'password' => 'app_test_P@ssw0rd',
    'database' => 'app_test',
    

    모델, 템플릿 생성



    Pages라는 모델을 적절하게 만듭니다.
    bin/cake bake migration CreatePages title:string content:text
    bin/cake migrations migrate
    bin/cake bake all pages
    chmod 777 tmp/
    chmod -R 666 tmp/*
    
    config/routes.php 를 다음과 같이 수정
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'index', 'home']);
    $routes->resources('Pages');
    

    지금까지 기본 응용 프로그램의 병아리가 완성되었습니다.

    codeception 도입



    드디어 codeception을 도입해, 테스트를 써 갑니다.
    composer require "codeception/codeception" --dev
    초기에 만든 tests 폴더가 필요 없으므로 일단 삭제하십시오.
  • codeception의 초기 파일 생성을 수행합니다.vendor/bin/codecept bootstrap이제 tests 폴더와 필요한 파일이 생성됩니다.

  • 여기서 다음을 실행하면 다음과 같은 화면이 됩니다.vendor/bin/codecept run functional


    구성 파일에 작성



    chrome driver를 사용해 폼의 입력등을 실시하고 싶으므로, 초기 설정을 기술합니다.codeception.yml
    paths:
        tests: tests
        output: tests/_output
        data: tests/_data
        support: tests/_support
        envs: tests/_envs
    actor_suffix: Tester
    
    extensions:
        enabled:
          - Codeception\Extension\RunFailed
    modules:
      config:
        Db:
          dsn: 'mysql:host=localhost;dbname=your database name'
          user: 'your database name'
          password: 'your database pass'
    
    
    tests/functional.suite.yml
    actor: FunctionalTester
    extensions:
        enabled:
            - Codeception\Extension\Recorder:
                delete_successful: false
            - Codeception\Extension\RunProcess:
                0: bin/chromedriver --url-base=wd/hub
                sleep: 3
    
    
    modules:
        enabled:
            # add a framework module here
            - \Helper\Functional
            - Db
            # - DataFactory:
            #     depends: Doctrine2
            # - \Helper\Factories
    
            - WebDriver:
                url: 'http://localhost'
                browser: chrome
                port: 9515
                window_size: 1024x768
                capabilities:
                  chromeOptions:
                    args: ["--headless", "--disable-gpu", "--disable-extensions"]
                    binary: "/usr/bin/google-chrome"
    
    

    기본 테스트 작성



    그럼 테스트를 써 봅시다!
    첫째, 테스트의 병아리를 생성합니다.
  • vendor/bin/codecept g:cest functional PagesCest
  • 다음과 같이 편집하십시오
  • tests/functional/PagesCest.php
    <?php
    
    
    class PagesCest
    {
        public function _before(FunctionalTester $I)
        {
        }
    
        public function _after(FunctionalTester $I)
        {
        }
    
        // tests
        public function addPage(FunctionalTester $I)
        {
            $I->amOnPage('/pages/add');
            $I->fillField('title', 'アドベントカレンダー初参加です');
            $I->fillField('content', 'お手柔らかによろしくお願いします!');
            $I->click('Submit');
            $I->see('アドベントカレンダー初参加です');
        }
    }
    

    테스트를 실행한 후 기사가 작성되었음을 알 수 있습니다.


    삭제 방법에 대한 대응



    이번에는 작성한 항목을 삭제해 봅시다.
    이전 파일에 다음 메소드를 추가합니다.
        public function deletePage(FunctionalTester $I)
        {
            $I->amOnPage('/pages');
            $I->acceptPopup($I->click('Delete'));
            $I->see('The page has been deleted.');
        }
    

    acceptPopup 함수로 팝업 시 OK 버튼을 누르고 있습니다.

    데이터베이스 내용을 직접 확인



    다음은 데이터베이스의 내용을 직접 확인합시다.
        public function seeRecord(FunctionalTester $I)
        {
            $I->seeInDatabase('pages', ['title' => 'アドベントカレンダー初参加です']);
        }
    

    타이틀이 "어드벤트 캘린더 첫 참가입니다"로 되어 있는 레코드가 존재하면 테스트가 통과합니다.

    로그인에 필요한 테스트



    그 밖에도 codeception에서는 로그인 정보를 유지하면서 테스트를 해 나갈 수 있습니다. 다음과 같이 작성하면 세션을 유지하면서 테스트를 수행할 수 있습니다.
    만든 함수를 각 테스트 파일의 _after 안에 써서 사용합니다.
    tests/_support/FunctionalTester.php
        public function login($username, $password)
        {
            $I = $this;
            // セッションがあったらログイン処理をスキップする
            if ($I->loadSessionSnapshot('login')) {
                return;
            }
            $I->amOnPage('/users/login');
            $I->fillField('username', $username);
            $I->fillField('password', $password);
            $I->click('ログイン');
            // ログイン状態を保持する
            $I->saveSessionSnapshot('login');
        }
    

    좋은 웹페이지 즐겨찾기