share facebook facebook2 twitter menu hatena pocket slack

2014.08.12 TUE

連続ドラマ「祝・今日から僕は IT エンジニヤ」〜 Infrataster 私的なチュートリアル 〜

川原 洋平

WRITTEN BY川原 洋平

ドラマ仕立てで Infrataster を試してみました。尚、このドラマはフィクションであり実在の人物・団体とは何の関係もございませんし、紙面の都合上、ストーリー展開にはかなりの無理がありますのでご注意下さい…のかっぱ@inokara)です。

念願叶って僕は IT エンジニヤになりました!

僕は 8 月から都内の某 IT 企業でエンジニヤとして働くことになりました。夢にまでみた IT エンジニヤ…どんな仕事が僕を待ち受けているんだろう、胸踊らせて出社しました。


テストは突然に…

早速、リリース間近の Web システムのテストを任されました。

 先輩:「おい、かっぱ。」「この Web システムのテストを頼む。」「テスト項目はこれね。」
 僕 :了解です!

とテスト項目書を手渡されました…

mokushispec と Scsho2Excel

僕は先輩から手渡されたテスト項目に従いながら一つ、一つテストを行っていきます。

Range リクエストヘッダを付けて Web システムにアクセスした際にステタースコード 206 が返ってくることを目視で確認

telnet で Web システムにアクセスしてと…リクエストヘッダを付けてと…レスポンスはと…ぽちっと。

Web システムにアクセスした際にレスポンスヘッダの Conent-Type は text/html; charset=UTF-8 が返ってくることを目視で確認

telnet で Web システムにアクセスしてと…ヘッダはと…ぽちっと。

Web システムにアクセスした際にレスポンスボディに <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN” “http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”> が含まれていることを目視で確認

ブラウザ起動してと… Web システムにアクセスしてと…ぽちっと。


も少しプログラマブルに…

僕はこの手動と目視によるテストの繰り返しをプログラマブルに出来ないか考えて Infrataster を試すことにしました。

Infrataster と Serverspec はインフラの産業革命

Infratasterryotarai さんが作られたテストフレームワークで Serverspec がインフラの状態をテストするのに対して Infrataster はインフラの振る舞いをテストする位置付けかなと勝手に思ったりしていますが、この二つのツールの登場はまさにインフラの産業革命ではないかと思っています。

Infrataster に関する詳しいことは以下の記事が参考になるかと思います。


Infrataster

基礎

  • Rspec という Ruby のテストフレームワークの DSL が利用可能です
  • 特定のリクエストヘッダをテスト対象に送って期待どおりのレスポンスが返却されるかを確認することが可能です
  • capybara と呼ばれる Web テストフレームワークも利用可能なようです(別途試します)

導入

Infrataster の導入は簡単でした。

sudo gem install infrataster --no-ri --no-rdoc -V

導入した環境は MacOS X 10.9 Marvericks です。

初期設定

インストールが終わったら以下のようにして作業用ディレクトリを作成して rspec –init を実行します。

mkdir ~/path/to/infrataster
cd ~/path/to/infrataster
rspec --init

rspec –init を実行したら spec/spec_helper.rb を下記のように修正しました。

--- spec/spec_helper.rb.original 2014-08-09 10:03:26.000000000 +0900
+++ spec/spec_helper.rb 2014-08-09 08:50:08.000000000 +0900
@@ -4,10 +4,19 @@
 # loaded once.
 #
 # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
+
+require 'infrataster/rspec'
+
+Infrataster::Server.define(
+  :app,
+  'xxx.xxx.xxx.xxx'
+)
+
 RSpec.configure do |config|
   config.treat_symbols_as_metadata_keys_with_true_values = true
   config.run_all_when_everything_filtered = true
   config.filter_run :focus
+  config.expose_current_running_example_as :example

   # Run specs in random order to surface order dependencies. If you find an
   # order dependency and want to debug it, you can fix the order by providing

ポイントは以下の部分です。

Infrataster::Server.define(
  :app,
  'xxx.xxx.xxx.xxx'
)

xxx.xxx.xxx.xxx にはテスト対象の Web サーバーの IP アドレスを設定しました。

example の定義

初期設定が終わったら冒頭の mokushispec のテスト項目を example に落としこんでいきます。

test_spec.rb

require 'spec_helper'

describe server(:app) do
  describe http('http://xxx.xxx.xxx.xxx/index.html',
    headers: {'Range' => 'bytes=0-100'}
  ) do
    #
    # Range リクエストヘッダを付けて Web システムにアクセスした際にステタースコード 206 が返ってくることを目視で確認
    it "responds content including '206 Partial Content'" do
      expect(response.env['status']).toeq(206)
    end
    #
    # Web システムにアクセスした際にレスポンスボディに ... が含まれていることを目視で確認
    it "responds content including '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'" do
      expect(response.body).to include('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">')
    end
    #
    # Web システムにアクセスした際にレスポンスヘッダの Conent-Type は text/html; charset=UTF-8 が返ってくることを目視で確認
    it "responds as 'text/html; charset=UTF-8'" do
      expect(response.headers['Content-Type']).to eq("text/html; charset=UTF-8")
    end
  end
end

テストの実行

ひと通り example の定義が終わったらテストの実行です。

cd ~/path/to/infrataster
rspec -fd --color

以下のように出力されました!

01

全てのテストが成功です。

手動でコマンド叩いたり、ブラウザでアクセスしていた頃が嘘のようにほぼ一瞬でテストが終わりました。しかも、結果出力付きで…(残念ながらスクリーンショットではありませんが)

example を紐解く

順番は逆になってしまいましたがテストで利用した example について紐解いていきます。

describe http
describe http('http://xxx.xxx.xxx.xxx/index.html',
  headers: {'Range' => 'bytes=0-100'}
) do

対象となる URL を describe http(”) で指定します。引数に headers を付けることが出来るので任意のリクエストヘッダをハッシュで指定します。今回の例では Range ヘッダを追加しています。

expect(response.env)

ステータスコードを取得したい場合には…

it "responds content including '206 Partial Content'" do
  expect(response.env['status']).to eq(206)
end

ステータスコードは env メソッドにハッシュとして格納されているので上記のようにして status キーを指定してステータスコードを取得して評価します。

expect(response.header)

ヘッダ情報を取得したい場合には…

it "responds as 'text/html; charset=UTF-8'" do
  expect(response.headers['Content-Type']).to eq("text/html; charset=UTF-8")
end

上記のように response の headers メソッドから取り出して評価します。

expect(response.body)

レスポンスボディから情報を取得したい場合には…

it "responds content including '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'" do
  expect(response.body).to include('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">')
end

上記のように response の body メソッドから取り出して評価します。


ということで

今回は簡単な Web サーバーの振る舞いをテストしましたが、引き続き、もう少し弄ってみたいと思います。

元記事は、こちら