m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

BehatでSeleniumを実行

受け入れテストとしてBehatを動かしつつSelenumで画面のエミュレーションは実行できるのか?
みたいなことをちょっと気になったので実装でテストを続けていくとだんだん面倒なことになりそうな場合はある程度の処理を自動化できれば楽になりそう。

準備

Behat3をいれて、Seleniumのjarをダウンロードしておく
動作する環境ではfirefoxなどのブラウザを稼働すると思われるのでvmの環境で動かすのはちょっとむずかしいかも

Behat3
$ mkdir sample1; cd $_;
$ cat << _EOT_ > composer.json
{
    "require-dev": {
        "behat/behat": "3.*",
        "behat/mink": "1.*",
        "behat/mink-extension": "*",
        "behat/mink-goutte-driver": "*",
        "behat/mink-sahi-driver": "*",
        "behat/mink-selenium2-driver": "*",
        "behat/mink-zombie-driver": "*"
    },
    "require": {
        "phpunit/phpunit": "*"
    }
}
_EOT_
$ composer update
$
selenium

http://www.seleniumhq.org/よりダウンロード

$ wget http://selenium-release.storage.googleapis.com/2.48/selenium-server-standalone-2.48.2.jar
$ 
jdk

入れていない場合はインストールしておく

Behat作成

初期化
$ vendor/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

$
behat.ymlをコピーして編集
$ cp -p vendor/behat/mink-extension/behat.yml.dist behat.yml
behat.yml編集
default:
  suites:
    default:
      path: %paths.base%/features
      contexts: [FeatureContext]

  extensions:
    Behat\MinkExtension:
      browser_name: firefox
      base_url: http://google.co.jp/
      sessions:
        default:
          selenium2:
            capabilities: {"browser":"firefox","version":"*"}
フィーチャ作成
$ vi features/browser.feature
----
# language: ja
フィーチャ: Seleniumテスト
  @javascript
  シナリオ: Google参照して検索
    前提 ホームページを表示している
      かつ 5 秒待つ
    もし "q" フィールドに "php" と入力する
      かつ "btnK" ボタンをクリックする
      かつ 5 秒待つ
    ならば検索結果を表示していること

----
FeatureContext.phpを編集
<?php

use Behat\Behat\Hook\Scope\AfterStepScope;
use Behat\Mink\Driver\Selenium2Driver;
use Behat\MinkExtension\Context\MinkContext;

use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;

/**
 * Defines application features from the specific context.
 */
class FeatureContext extends MinkContext implements SnippetAcceptingContext
{
    /**
     * Initializes context.
     */
    public function __construct()
    {
    }

    /**
     * @Given :arg1 秒待つ
     */
    public function miaoDaiTu($arg1)
    {
        $this->getSession()->wait($arg1 * 1000);
    }

    /**
     * @Then 検索結果を表示していること
     */
    public function jianSuoJieGuoWobiaoShiSiteirukoto()
    {
        // driver
        $driver = $this->getSession()->getDriver();
        if (! $driver instanceof Selenium2Driver) {
            return;
        }

        // キャプチャ取得
        $filename = sprintf(
            '%s_%s_%s.%s',
            $this->getMinkParameter('browser_name'),
            date('Ymd') . '-' . date('His'),
            uniqid('', true),
            'png'
        );

        // ファイルを保存
        $this->saveScreenshot($filename, "/tmp");
    }

}

※一部の画面キャプチャなどの処理を追加実装

実行画面

所感

seleniumと連携すれば画面での入力を省略してテストが可能。
実際に入力しているわけではないので完全とか言えないが手順書に基づいたテストを実行しているので例外としての動きを除けば問題ないのかも。

上手く活かせるなら画面キャプチャを簡単に取れるかもしれない

CakePHPで学ぶ継続的インテグレーション

CakePHPで学ぶ継続的インテグレーション