概要
たまになんですが、自社サイトのフォームが動かなくなって、「フォームが送信できなくなってるよ」って連絡をもらうことがあります。知らないうちにフォームが動かなくなっている機会損失は結構でかいので、フォーム死活監視のようなことが出来ないか考えてみました。
結果、 Travis + Selenium + PHPUnitでtravis-form-testというテストツールを作ってみました。
.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の設定
{
"require-dev": {
"phpunit/phpunit": "4.7.*"
, "phpunit/phpunit-selenium": ">=1.2"
}
}
こんな感じで設定してやるとPHPUnitでSeleniumを動かすためのライブラリを一式インストールしてくれます
PHPUnit
<?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する。結果、「あなたのメッセージは送信されました。ありがとうございました。」というメッセージが表示されればテスト通過という流れです。
まとめ
このテストをTravis上で動かすと、こんな感じでSlackへフォームのテスト結果を通知してくれます。
以下、テスト実行時のTravisの結果です。
https://travis-ci.org/horike37/travis-form-test/builds/70641787
これをtravisのコマンドラインツールなどで定期的に自動実行させてやれば、気づかないうちにフォームが動かなくなっているということも防げそうです。
では良いTravisライフを!