TOP

Behat+Selenium Webdriverで受け入れテストの自動化をやってみた

2015-10-28 16:38:56

環境とか前提とか

Behatのインストール

Composerでインストールします

$ cd ~/
$ mkdir behat
$ cd behat
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar init -n
$ php composer.phar config bin-dir "bin/"
$ vim composer.json

{
    "require-dev": {
        "behat/behat": "3.*@stable",
        "behat/mink": "1.*@stable",
        "behat/mink-extension": "*",
        "behat/mink-goutte-driver": "*",
        "behat/mink-sahi-driver": "*",
        "behat/mink-selenium2-driver": "*",
        "behat/mink-zombie-driver": "*"
    },
    "config": {
        "bin-dir": "bin/"
    }
}

$ php composer.phar install

Selenium Webdriverをダウンロード

ここから、最新版を落としてきます

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

chromedriverをダウンロード

Chromeのバージョンによって、ダウンロードするchromedriverのバージョンが違います(これでそこそこハマった)

このへんからダウンロード出来るかも。

各ディレクトリのnotes.txtに、Supports Chrome v40-43みたいに書かれてるので、これを見て自身の環境のChromeバージョンに合わせてダウンロードします

$ cd /usr/local/lib/
$ sudo wget http://chromedriver.storage.googleapis.com/2.15/chromedriver_linux64.zip
$ sudo unzip ./chromedriver_linux64.zip

// Seleniumから権限エラーになるので実行権限をつけておく
$ sudo chmod +x ./chromedriver

Seleniumの起動方法

java -jarで起動(javaコマンドが無い場合は、sudo apt-cache search openjdkで最新版を)

$ cd ~/bin/
$ java -jar selenium-server-standalone-2.48.2.jar -Dwebdriver.chrome.driver=/usr/local/lib/chromedriver

Behat 初期化

$ cd ~/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

behat.yml編集

設定ファイルのサンプルからbehat.ymlを編集

$ cp ./vendor/behat/mink-extension/behat.yml.dist ./behat.yml
$ vim behat.yml

# Firefox設定(デフォルト)
default:
  suites:
    default:
      path: %paths.base%/features
      contexts: [FeatureContext,Behat\MinkExtension\Context\MinkContext]  # FeatureContext,を追加
  extensions:
    Behat\MinkExtension:
      browser_name: firefox
      base_url: http://google.co.jp/  # ここはとりあえずGoogle
      sessions:
        default:
          selenium2:
            capabilities: {"browser":"firefox","version":"*"}

# Chrome設定
chrome-via-webdriver:
  extensions:
    Behat\MinkExtension:
      browser_name: chrome
      base_url: http://google.co.jp/  # ここはとりあえずGoogle
      sessions:
        default:
          selenium2:
            capabilities: {"browser":"chrome","version":"*"}

contextsに、FeatureContext,を追加した事により、feature/bootstrap/FeatureContext.phpがBehat実行時に有効になります

「待つ」追加

Behatでおあずけが出来ます

$ vim feature/bootstrap/FeatureContext.php

class FeatureContext implements Context, SnippetAcceptingContext
{
    (中略)

    // ↓追加

    /**
     * @When :time 秒待つ
     *
     * @param   string $time
     */
    public function wait($time)
    {
        sleep($time);
    }
}

テストを書いてみる

テストは、featureディレクトリの中に、.feature拡張子を付けて配置します

$ vim feature/test.feature

# language: ja
#
フィーチャ: グーグルで検索

    @javascript
    シナリオ: 7meを検索
        前提 ホームページを表示している
            かつ 3 秒待つ
        もし "q" フィールドに "7me" と入力する
            かつ "btnG" ボタンをクリックする
            かつ 2 秒待つ
        ならば "7me.oji.0j0.jp" と表示されていること

テスト実行

--profileオプションで、behat.ymlのどの設定を適用するか指定出来るようです

$ ./bin/behat --profile=chrome-via-webdriver
フィーチャ: グーグルで検索

@javascript
  シナリオ: 7meを検索                      # features/test.feature:6
    前提 ホームページを表示している                # Behat\MinkExtension\Context\MinkContext::iAmOnHomepage()
    かつ 3 秒待つ                        # FeatureContext::wait()
    もし "q" フィールドに "7me" と入力する       # Behat\MinkExtension\Context\MinkContext::fillField()
    かつ "btnG" ボタンをクリックする            # Behat\MinkExtension\Context\MinkContext::pressButton()
    かつ 2 秒待つ                        # FeatureContext::wait()
    ならば "7me.oji.0j0.jp" と表示されていること # Behat\MinkExtension\Context\MinkContext::assertPageContainsText()

1 scenario (1 passed)
6 steps (6 passed)
0m8.88s (11.96Mb)

なお、Firefoxの場合はbtnGではなくbtnKになる模様(2015-10-28 現在)

IE driverを入れる(2015-12-18 18:25:07追記)

Selenium公式でリンクされてるIEDriverServer.exeをDLして、起動オプションで指定。

-Dwebdriver.ie.driver=/path/to/IEDriverServer.exe

あと、[WebDriver\Exception\NoSuchWindow]が出てUnable to get browserが表示される場合は、インターネットオプションの[セキュリティ]タブで、全てのゾーンの保護設定を同じにする

behat.yml(IE)
ie-via-webdriver:
  extensions:
    Behat\MinkExtension:
      browser_name: internet explorer
      base_url: http://google.co.jp/
      sessions:
        default:
          selenium2:
            capabilities: {"browser":"internet explorer","version":"*"}

Edge driverを入れたかった(2015-12-18 18:25:07追記)

Microsoft Webdriverを入れて、起動時に、

-Dwebdriver.edge.driver=/path/to/MicrosoftWebDriver.exe

を指定してあげるだけらしいけど、僕の環境だと動かなかった(以下エラーのコピペ)

  @javascript
  シナリオ: てすと     # features\test.feature:6
    前提 ブラウザを 960 x 800 にリサイズ   # FeatureContext::browserResize()
      Could not open connection: null (WARNING: The server did not provide any stacktrace information)
      Command duration or timeout: 1.62 seconds
      Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 03:03:16'
      System info: host: 'hogePC', ip: '192.168.24.6', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_20'
      Driver info: org.openqa.selenium.edge.EdgeDriver (Behat\Mink\Exception\DriverException)
    │
    ╳  Could not open connection: null (WARNING: The server did not provide any stacktrace information)
    ╳  Command duration or timeout: 6.72 seconds
    ╳  Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 03:03:16'
    ╳  System info: host: 'hogePC', ip: '192.168.24.6', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_20'
    ╳  Driver info: org.openqa.selenium.edge.EdgeDriver (Behat\Mink\Exception\DriverException)
    │
    └─ @AfterStep # Sanpi\Behatch\Context\DebugContext::failScreenshots

どうも調べていると、Microsoft Webdriverがまだ不完全みたいな雰囲気があったので、今は温めておくことにした

behat.yml(Edge)
edge-via-webdriver:
  extensions:
    Behat\MinkExtension:
      browser_name: MicrosoftEdge
      base_url: http://google.co.jp/
      sessions:
        default:
          selenium2:
            capabilities: {"browser":"MicrosoftEdge","version":"*"}
参考サイト