Ruby on Railsのintegrationテストを真面目に書いていたら挫折しそうになったので、色々と寄り道しながら調べていたら*1、Ruby on Rails以外のRuby製WAFとしてSinatraを知ったので、試してみました。
簡単なRESTfulアプリケーションを作りたいという時の選択肢という点で、JavaでいうところのJerseyが近いかなと思ったので、それぞれで比べてみました。
作るのは、http://localhost:8888/helloにGETリクエストを送ったら、"Hello"というplain textを返す超簡単なHelloアプリケーションです。
Jersey(Java)の場合
昔のエントリーの使いまわしです。必要なのはjarをクラスパスに通すだけです。実行はコンパイルしてメインクラスを実行。
メインクラス(HelloServerMain.java)
package sample; import com.sun.jersey.api.container.httpserver.HttpServerFactory; import com.sun.net.httpserver.HttpServer; public class HelloServerMain { public static void main(String[] args) throws Exception { HttpServer server = HttpServerFactory.create("http://localhost:8888/"); server.start(); } }
リソースクラス(HelloResource.java)
package sample; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.MediaType; @Path("/hello") public class HelloResource { @GET @Path("/") @Consumes(MediaType.TEXT_PLAIN) public String hello() { return "Hello!"; } }
Sinatra(Ruby)の場合
必要なのはSinatraのGemのインストールのみ。
gem install sinatra
hello_server.rbとかの名前で以下のように書きます。
require 'sinatra' get '/hello' do "Hello!" end
実行は以下のような感じで。Webrickが起動します。
ruby hello_server.rb -p 8888
まとめ
サンプルほぼそのままの簡単な例ですが、あっという間に作れてしまいます。
Railsだと機能が豊富すぎるし、簡単に(DBも不要なくらいの)Webアプリケーションをちょいちょいっと作りたい、って時にはピッタリはまる印象。
あとは、HTTPリクエストをモックを使ってがんばって書くよりも、うまく使えばテストがシンプルになるかもしれないと思いました。昔、テスト用に似たようなダミーHTTPサーバをsocketライブラリを使って一から作っていたことがあるので、それからの置き換えはスムーズにできそう。
*1:結論としてcapybaraがよさそうだったので試してみようかと思います。