Travis + Selenium + PHPUnit + Slackで行うフォームの監視テスト

## 概要
たまになんですが、自社サイトのフォームが動かなくなって、「フォームが送信できなくなってるよ」って連絡をもらうことがあります。知らないうちにフォームが動かなくなっている機会損失は結構でかいので、フォーム死活監視のようなことが出来ないか考えてみました。

結果、 Travis + Selenium + PHPUnitで[travis-form-test](https://github.com/horike37/travis-form-test)というテストツールを作ってみました。

## .travis.ymlの設定
```yaml:.travis.yml
language: php
php:
- 5.5
env:
  global:
    secure: "T9nks1QOei/XWIGqTeMdjTXiwFrWif07SrFY0X50Wp3QHWTp9EMvJn03T3K7j6oT2IAjIuNoQuPQtKdFTyc8JppUK4wWKdPI99TXBb2KpqTeBdi7DIdncY3epFZ+i0OI/xQ1r71tx7J/Ftuty2ZaQQl0IxCRpB0W0JxqTmpPU6PIi5rFxFIHrZbqAzUBYVZV1sxJ4Ti1LkR3/HRtdYUaWLd+Rn2l6aPl/l+aCBel3OwupDyNCcqAwDrdbYv52t61K3jd05WNysPiESrspEqwVgkOFGszyBMdJWOPBZAhl+HwpdXPvo0kAgA2hb0YS37HH/pJEeb6zo/s4kMriu2EtVUxBOGJyPdi7Zuj8g+qfPZ4P/7U0UGBOZ8tVZeWQAL0zU9EH+QLgoqiIhnGUu0wLYVUcdPWqcUNTc/sLYP9LqQ+xfB5/JwtxgUk3I6gv94+rZdeIZKpXuM/4l5s3DYra7Pn0ukXJgbTtmoUPkfR8quqQPOFXoAw6sDyWEYDzn2G5DZIIrHfU6xZsfEIq9+OSPUTjrsZ2JMsuJOeus23+JuqN6DEOD1z72tcowdSsP8X4/2npsocP7dB6V2QgPcBT+Jk2T3r3X2so+82uaL7vfDrsqIM2Lq0VDkE71FmmDhxjT/HmjTjeBpF1G4r7PyATVaYR0XHB2yDnLHhIH6BptI="
before_install:
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
- wget http://selenium-release.storage.googleapis.com/2.46/selenium-server-standalone-2.46.0.jar
- java -jar selenium-server-standalone-2.46.0.jar > /tmp/selenium.log 2> /tmp/selenium.error
  &
before_script:
- composer self-update
- composer install
script:
- "./vendor/bin/phpunit webtest"
notifications:
  slack:
    secure: lI0LOq0KBIzj5fH8isDYKQ1GSMojSkic82VwODdCQ2caxgvcU7vRJr4IH9hhIrHZNiz9F8d8uWGUI8IxV/OjMwdXrrNprzbCLaL8Lp2pPD+USwHtkL/CIKLL56taBPcH5U7+PfwfjRk89kdKL9V0ucoIT4GU8R/yfDsiFziIv4MIhRZNYwLLBqhTk0ygkaUVu8BUooj3rXwej3D/NjpO2IP8FmGJdMxooXtCwAkMN6pQzpcAKJCGwivn5o/k8bGM7UmQWOA4VjmWWjv+v+oZRn7fclP2AZWjFopVELJ0MnReY6QG8jYXcpUHuQYyASNsggK8/iLiIN8yZ9O/+4uRFsSHo+vPNOH4DwuwrooJbCoq6uaS+aHjldpfz0z/8J1lmpxeVldMXsRJX1Pg454+9MNarjiuQ7av0oX2JbyWqJK8av+jYhw1qWvNH82g2gwFqftr61NGHzIoYSEO8RHIbT1PD9mS7+BlS9ZGExWPcrfSf4cb39Q1FdXzUlW/OrRV1U9qfZA8XOcAHfAXbnWxQZvV+BlNDYqVdBVhRbhxU2MRZjXtJFQ88rFK+Dsa4gbP7dJ/fwviqORp0YtRQTkTzJ9iCB5p29NE+idEuclx2V8QWc0A4uDgvpUgp5QpMdjLa4us2CU9QZQNjJiPNl8VuOVwSJFFVn/ONK0rMAmjabk=
```
TravisではFirefoxが使えます。なので、Firefoxを使う前提で、Selenium Serverのスタンドアローン版をbefore_installでインストールし起動してあげます。

Selenium Serverを起動して、composerでPHPUnitを一式インストール、最後にテストを実行させます。結果はSlackに通知するという流れです。

なお、env.globalにsecureの値を設置してますが、これはフォームへのURLです。
これ社内のテスト環境で実施したのでURLを公開できないためこうしてます。
特に公開されたサイトのフォームで実施する場合は暗号化しなくても良いと思います。

## composerの設定
```json:composer.json
{
    "require-dev": {
        "phpunit/phpunit": "4.7.*"
        , "phpunit/phpunit-selenium": ">=1.2"
    }
}
```
こんな感じで設定してやるとPHPUnitでSeleniumを動かすためのライブラリを一式インストールしてくれます

## PHPUnit
```php:webtest.php
<?php
class WebTest extends PHPUnit_Extensions_Selenium2TestCase
{
    protected function setUp()
    {
        $this->setBrowser('firefox');
        $this->setBrowserUrl(getenv('SITE_URL'));
    }
    public function testForm()
    {
        $this->url(getenv('FORM_URL'));
        $this->byName('your-name')->value('horike');
        $this->byName('your-email')->value('horike37@gmail.com');
        $this->byName('your-subject')->value('subject');
        $this->byName('your-message')->value('message');
        $this->byclassName('wpcf7-form')->submit();
        
        $this->waitUntil(function($testCase) {
            $str = $testCase->byclassName('screen-reader-response')->text();
            if ( !empty($str) ) {
            	return true;
            }
        }, 3000);
        $this->assertEquals('あなたのメッセージは送信されました。ありがとうございました。', $this->byclassName('screen-reader-response')->text());
    }
}
```
テストの対象サイトのContact Form 7のフォームが設置されたページヘアクセス。
フォームに値を入力してsubmitする。結果、「あなたのメッセージは送信されました。ありがとうございました。」というメッセージが表示されればテスト通過という流れです。

## まとめ
![スクリーンショット 2015-07-13 23.29.52.png](https://qiita-image-store.s3.amazonaws.com/0/65478/4e3f80ca-e27c-72c3-da22-d0f3802be788.png)
このテストをTravis上で動かすと、こんな感じでSlackへフォームのテスト結果を通知してくれます。

以下、テスト実行時のTravisの結果です。
https://travis-ci.org/horike37/travis-form-test/builds/70641787

これをtravisのコマンドラインツールなどで定期的に自動実行させてやれば、気づかないうちにフォームが動かなくなっているということも防げそうです。

では良いTravisライフを！