webpush の送信を機械的にテストするための webpush-testing-service を作成した。
関連サービス GoogleChromeLabs/web-push-testing-service
サービス設計
API で selenium の操作を行い push service からの PushSubscription を得たり、 service worker に届いたメッセージを取得できるようにする。
テストコードは PushSubscription を得てエンドポイントに対してメッセージ送信を行い、いつかメッセージが取得できるという感じにすることで、実際に firefox または chrome で動作することが機械的に確認できるようになる。
実装
Selenium
selenium を使って webpush のテストをする場合、通知の許可ボタンが出るのを抑制しなければらない。
val options = new FirefoxOptions()
options.addPreference("permissions.default.desktop-notification", 1)
new FirefoxDriver(options)
firefox では permissions.default.desktop-notification
を設定し、
val options = new ChromeOptions()
options.setExperimentalOption("prefs", Map("profile.default_content_setting_values.notifications" -> 1).asJava)
new ChromeDriver(options)
chrome では profile.default_content_setting_values.notifications
を設定することで抑制できる。
Docker + Xvfb
ローカルで動かすだけであれば chromedriver や geckodriver と各ブラウザをインストールすれば良いが docker で動くようになっていた方が利便性が高い。
docker 上で selenium を動かすには xvfb と chrome/firefox などのブラウザと chromedriver/geckodriver などのドライバーが必要となる。
#!/bin/sh
xvfb-run $@
ENTRYPOINT [ "./entrypoint.sh", "webpush-testing-service/bin/webpush-testing-service" ]
あとは Dockerfile で xvfb-run
を利用してサーバーを立ち上げれば良い。
( 直接 ENTRYPOINT に ["xvfb-run", "webpush-testing-service/bin/webpush-testing-service"] とすると動かなかった )
.circleci/config.yml
webpush-testing-service:
docker:
- image: nokamoto13/webpush-testing-service:0.0.0
steps:
- run:
command: xvfb-run /webpush-testing-service/bin/webpush-testing-service
background: yes
- run:
command: sbt test
.circleci/config.yml では background で xvfb-run
を実行することでテストができた。
jobs:
build:
docker:
- image: circleci/golang:1.11
- image: nokamoto13/webpush-testing-service:0.0.0
あるいは secondary image としてセットすることで localhost:9000 でアクセスしてテストすることができた。