ようへいの日々精進XP

よかろうもん

Infrataster と Capybara で Web サイトの確認が個人的に捗ったのでメモ

この記事は...

qiita.com

初老丸 Advent Calendar 2017 19 日目の記事です.

何をしたかったのか

  • 複数の Web サイトの正常性を確認したい

なぜやりたかったのか

  • ポチポチとブラウザで確認する作業が辛くなった

やったこと

Infrataster

github.com

  • Infrastructure Behavior Testing Framework
  • Servrespec や awspec がインフラのあるべき状態をテストするのに対して, Infrataster はインフラの振る舞いをテストするツール
  • クライアントからサーバーに接続した際の状態(レスポンス等)をテストすることが出来ることが特徴
  • テストは RspecDSL で記述することが出来、MySQLDNS に対するテストも実装することが出来る

Capybara

github.com

Capybara とは, なんぞや!?

Capybara helps you test web applications by simulating how a real user would interact with your app. It is agnostic about the driver running your tests and comes with Rack::Test and Selenium support built in. WebKit is supported through an external gem.

上記は README の冒頭だけど, 以下のように意訳.

  • 実際のユーザーと Web アプリケーションのやりとりをシュミレートするテストフレームワーク
  • テストを実行する Driver は選択することが出来て, Rack::Test と Selenium は組み込まれている
  • WebKit は外部の Gem を利用してサポートされる

ふむふむ.

実装

何を以って正常と判断するか

状況によって色々と異なると思うが、今回は HTML の TITLE タグをチェックして指定した文字列と合致することで「正常」と判断する.

rspec --init

$ bundle exec rspec --init

以下のように出力される.

  create   .rspec
  create   spec/spec_helper.rb

spec/site_check_helper.rb

require 'infrataster/rspec'

Infrataster::Server.define(
  :example_com,
  'www.example.com',
)

Infrataster::Server.define(
  :example_jp,
  'www.example.jp',
)

Infrataster::Server.define(
  :example_jp,
  'www.example.net',
)

spec/site_check_spec.rb

require 'spec_helper'

describe server(:example_com) do
  describe capybara('http://' + server(:example_com).server.address) do
    it 'ページのタイトルが www.example.com であること' do
      visit '/'
      expect(page).to have_title 'www.example.com'
    end
  end
end

describe server(:example_jp) do
  describe capybara('http://' + server(:example_jp).server.address) do
    it 'ページのタイトルが www.example.jp であること' do
      visit '/'
      expect(page).to have_title 'www.example.jp'
    end
  end
end

describe server(:example_net) do
  describe capybara('http://' + server(:example_net).server.address) do
    it 'ページのタイトルが Welcome to www.example.net !! であること' do
      visit '/'
      expect(page).to have_title 'Welcome to www.example.net !!'
    end
  end
end

have_title のようなマッチャには, have_contenthave_link 等が利用出来る.

実行例

ローカルホストで起動した Web サーバーと kome.inokara.com に対してテストを走らせてみた例.

$ bundle exec rspec

server 'kome_inokara_com'
  capybara 'http://kome.inokara.com'
    ページのタイトルに川原米穀店が含まれていること

server 'example_com'
  capybara 'http://127.0.0.1:8001'
    ページのタイトルが www.example.com であること

server 'example_jp'
  capybara 'http://127.0.0.1:8002'
    ページのタイトルが www.example.jp であること

server 'example_net'
  capybara 'http://127.0.0.1:8003'
    ページのタイトルが Welcome to www.example.net !! であること

Finished in 3.07 seconds (files took 0.95129 seconds to load)
4 examples, 0 failures

以上

Infrataster と Capybara の組み合わせで, ブラウザと目視のサイト確認を機械的に行うことで確認漏れ等ミスを最小限に抑えることが出来ると思う.