Web APIのテスト。ブラックボックステストをしようとすると、HTTPでアクセスしてレスポンスを処理して…となりますが、HTTP GETで済むのであればRubyのopen-uriを使いたくなります。そのため、テストコードもRubyで書くことになります。
Rubyのテストフレームワークはいくつかありますが、minitestを使ってみました。
お題はifconfig.me
ifconfig.me という自分のIPアドレスを表示するサイトで、JSON形式でレスポンスを返してくれるインターフェースがありました。それを対象として、minitest を書いてみました。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'open-uri' | |
require 'json' | |
require 'minitest/autorun' | |
describe "ifconfig.me" do | |
before do | |
res = URI.parse('http://ifconfig.me/all.json').read | |
@json_res = JSON.parse(res) | |
end | |
it "method is GET" do | |
expect(@json_res["method"]).must_equal "GET" | |
end | |
end |
test_ifconfig.rb という名前で保存したら、
$ docker run -it --mount \ type=bind,source=$(pwd)/test_ifconfig.rb,target=/test_ifconfig.rb \
ruby:3.1-slim ruby /test_ifconfig.rb
のようにして動かしてみます。
testはレスポンスのうちmethodがGETであるかどうかしか見ていませんが、他のパラメータも同じように it ~ do でtestすればよいかと。expect()を並べるのでもいいですよね。
パラメータを変えて呼び出してテストする必要があるのであれば、before にAPI呼び出しを書くのではなく、it ~ do の最初のほうでAPI呼び出しをして、レスポンスはexpect()を並べて検証する感じでしょうか。
RSpecよりはお手軽
RSpecは設定ファイルでいろいろ設定する必要があったという印象ですが、minitestはテストを書いたrbファイルを実行するだけでOKです。E2Eテストのような大掛かりなものでなく、サクッとテストしたいときには便利かと。
minitestでE2Eテストができるのか?というところは、どうなんでしょう?RSpecでE2Eテストを書いていたことがあるので、minitestで書こうとは思わないのですが…。
コメント