Docker上でJenkinsとSelenium Gridを用意する

Published: 2016年8月14日 by tomsato

概要

Dockerを使ってJenkinsとSelenium Gridを用意します

完成イメージ(間違ってたらすみません…)

test1

Jenkins経由でSeleniumのテストスクリプトを実行させる
Docker上で用意をするのでscaleの拡張も手軽にできそう

今回はこちらを参考に自分なりに解釈して実装を行っています
Docker ComposeでJenkinsとSelenium Gridを一気に立ち上げる

Selenium Gridについて

複数のSelenium実行環境を管理して、並列にテストを実行できるツール
異なるブラウザやOSなどで複数のテストを並列に実行することに特化したコンポーネント

Gridにクライアントノードを登録するとテスト実行時にGridが自動で空きノードを割り当てて分散実行する

環境準備

動作環境

$ cat /etc/redhat-release
CentOS release 6.8 (Final)

docker install

$ sudo bash -c 'curl -fsSL https://get.docker.com/ | sh'

docker-composer install

// CentOS6系の場合、最新のdocker-composerを使えない
// 対応表:https://gist.github.com/tamamushi/be848daa1fedfee45fdb312f980ce7c2
$ sudo bash -c 'curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose'
$ sudo chmod +x /usr/local/bin/docker-compose

起動
参考サイト先のdocker-compose.ymlを使わせてもらう

$ curl -O https://raw.githubusercontent.com/ootaken/jenkins-and-selenium-on-docker/master/docker-compose.yml
$ curl -O https://raw.github	usercontent.com/ootaken/jenkins-and-selenium-on-docker/master/jenkins-master.env
$ curl -O https://raw.githubusercontent.com/ootaken/jenkins-and-selenium-on-docker/master/jenkins-slave.env
$ sudo /usr/local/bin/docker-compose up -d

ここまでするとJenkinsのページである http://{ホスト名}:8080/ にアクセスができるようになる
しかし初回なのでパスワードの入力が求められる
jenkins01
パスワードの調べ方

// idを元にパスワードが記述されているファイルを出力させる
$ sudo docker ps -a | grep 8080
e62282b2b435        blacklabelops/jenkins      "/bin/tini -- /home/   2 minutes ago       Up 2 minutes               0.0.0.0:8080->8080/tcp, 0.0.0.0:32776->50000/tcp   jenkins
$ sudo docker exec e62282b2b435 cat /jenkins/secrets/initialAdminPassword

出力されたパスワードを画面に入力させる
その後
→ 「Install suggested plugins」をクリックしてPluginをいくつかインストール
→ Adminユーザを作成
これでJenkinsのトップページが表示されたはず

また
http://{ホスト名}:4444/grid/console
を見るとHubサーバーのコンソール画面が表示されて、ノード一覧を見ることができる
jenkins02
ChromeとFireFoxが1つづつあるが以下のコマンドで拡張することができる

$ sudo /usr/local/bin/docker-compose scale chrome=3 firefox=3

テスト実行を行うための環境も用意する

PHP5.6

// EPELリポジトリ追加
$ sudo yum install epel-release
// Remiリポジトリ追加
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
// php5.6インストール
$ sudo yum install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd php-xml
// ついでに文字化け対策
$ sudo yum install ipa-pgothic-fonts.noarch

PHPUnit

$ sudo bash -c "curl -sS https://getcomposer.org/installer | php"
$ sudo mv composer.phar /usr/local/bin/composer
$ cat composer.json
{
  "require-dev": {
    "phpunit/phpunit": "^5.4",
    "facebook/webdriver": "^1.1",
    "verkkokauppacom/parallel-phpunit": "dev-master"
  },
  "repositories": [
    {
      "type": "vcs",
      "url":  "git://github.com/verkkokauppacom/parallel-phpunit.git"
    }

  ]
}
$ composer install

テスト実行

以下のスクリプトを使う

$ cat tests/firefoxTest.php
<?php
use Facebook\WebDriver;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\Remote;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;

class firefoxTest extends PHPUnit_Framework_TestCase
{
    public function testWebUI()
    {

        // ドライバーの起動
        $host = 'http://localhost:4444/wd/hub';
        $driver = RemoteWebDriver::create(
            $host,
            DesiredCapabilities::firefox(),
            180 * 1000, // Connection timeout in miliseconds
            180 * 1000  // Request timeout in miliseconds
        );

        // テストページへ遷移
        $driver->get('https://www.google.co.jp/');

        // 「Google」というタイトルを取得できることを確認する
        $title = $driver->getTitle();
        $this->assertEquals("Google", $title);

        // スクリーンショットを取得
        $driver->takeScreenshot('tmp.png');

        //ブラウザを閉じる
        $driver->close();
    }
}

手動で実行して問題がないことを確認する

$ ./vendor/bin/phpunit tests/firefoxTest.php
PHPUnit 5.5.0 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 21.5 seconds, Memory: 3.50MB

OK (1 test, 1 assertion)

後はこれをJenkinsからも実行できるようにさせる

並列実行

chromeで実行するスクリプトも用意

$ ls -l tests/
合計 76
-rw-rw-r--. 1 vagrant vagrant  1088  8月 14 13:44 2016 chromeTest.php
-rw-rw-r--. 1 vagrant vagrant  1090  8月 14 13:44 2016 firefoxTest.php
$ diff tests/chromeTest.php tests/firefoxTest.php
9c9
< class chromeTest extends PHPUnit_Framework_TestCase
---
> class firefoxTest extends PHPUnit_Framework_TestCase
17c17
<             DesiredCapabilities::chrome(),
---
>             DesiredCapabilities::firefox(),
30c30
<         $driver->takeScreenshot('tmp1.png');
---
>         $driver->takeScreenshot('tmp2.png');

実行する

$ which phpunit
~/selenium-test/vendor/bin/phpunit
$ ./vendor/bin/parallel-phpunit --pu-verbose --pu-threads 2 tests/
Running parallel-phpunit 1.3.0
Starting command: /home/vagrant/selenium-test/vendor/bin/phpunit -d parallel-phpunit-thread=0 tests/chromeTest.php
Starting command: /home/vagrant/selenium-test/vendor/bin/phpunit -d parallel-phpunit-thread=1 tests/firefoxTest.php

Success: 0 Fail: 0 Error: 0 Skip: 0 Incomplete: 0
Success: 0 Fail: 0 Error: 0 Skip: 0 Incomplete: 0
...
Command ended: /home/vagrant/selenium-test/vendor/bin/phpunit -d parallel-phpunit-thread=0 tests/chromeTest.php
PHPUnit 5.5.0 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 38.47 seconds, Memory: 3.50MB

OK (1 test, 1 assertion)
Success: 1 Fail: 0 Error: 0 Skip: 0 Incomplete: 0
Success: 1 Fail: 0 Error: 0 Skip: 0 Incomplete: 0
Command ended: /home/vagrant/selenium-test/vendor/bin/phpunit -d parallel-phpunit-thread=1 tests/firefoxTest.php
PHPUnit 5.5.0 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 41.44 seconds, Memory: 3.50MB

OK (1 test, 1 assertion)
Success: 2 Fail: 0 Error: 0 Skip: 0 Incomplete: 0

同時に実行されているのがわかる

コメントを書く

※ 個別に返信が必要な時のみご記入ください

※ Emailは公開されません

※ 承認されると名前・コメントが下記に表示されます

コメント一覧

最近の投稿

ビジュアルリグレッションテストについてまとめ、ネットで調べると数多くのライブラリがありどれがどんな立ち位置なのか全体像がわかりずらかったのでどんな種類があるのか入門の入門としてまとめます、またPlaywrightを使って実際に触ってみました

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧