Hatena::Groupstudyroom

文::字

2013-11-17

API のテスト 01:17  API のテスト - 文::字 を含むブックマーク

RubyJava ぐらいしか見れていないけど、Web API の (単体テスト) ではなく統合テストやシナリオテストを行う環境がまだ全然整備されていないような気がしている。特にクラウドリソースを作るのに金や時間がかかり、かつモックやスタブを作ってテストしてもあまり意味がない (結局動かしてみないと分らないところがあるので単体テストよりは統合テストが重要) ので API のテストを作るのが難しい。

Ruby に関して言うと、testunit とか rspecオブジェクトの振る舞いをテストするためのフレームワークなので、統合テストを作ること自体に向いていない。ちょっと前は、そもそも API のテストもシナリオテストではなく、単体テストのように、一番細かい単位 (REST だったら URL + 動詞AWS 互換 API だったらアクション) をオブジェクトになぞらえて、rspec でテストすればいいと思っていて、それは実際、たとえばクラウドの裏側の非同期処理 (サーバー作成) とか、処理が達しないバリデーション・異常系のテストには有用と思っている。しかし、やはりクラウド API の要件はリソースの作成・情報取得・変更・削除であり、これを行うためには、非常な前提が必要となってしまい、一つの example の中がかなり長くなってしまう。たとえば、サーバーを作成するという API のテストをするには、ファイアウォール作成、SSH キー作成を行った上でサーバー作成 API をコールして、サーバー情報取得 APIサーバーのステータスが作成完了になるまで待つ、というところまで作らなければならない (関係ないけど、ステータスの遷移をテストする方法も知りたい)。明らかに単体テストには向いていなくて、いわゆる「シナリオテスト」的なアプローチが必要になる。長いテスト操作を 1 つ 1 つ上から順に実行していって、「この手順は OK」「この手順は OK」「ここで失敗」のような出力をしてほしい。1 つの example に書くとデバッグログみたいな感じはでるけど、そのテストがどこまで成功したのかが分りづらい。しかし、自分はそもそも一般的なシナリオテストみたいなものにあまりよい印象を持っていない。

「一般的なシナリオテスト」というのがあるのかよく分からないけど、個人的には、たとえばファイアウォール機能・SSH キー機能・サーバー機能をテストするために、1 つのシナリオを作成してその中ですべてを網羅しようとする方法のことを想定している。このアプローチの欠点は、シナリオ 1 つが巨大なため、実行までに非常に時間がかかる、途中で失敗したらまたやり直しになる、ということだと思う。もう少しシナリオを細かく分けて、単体テストにおけるクラス、みたいな単位に切り分けて実行すればいいのかな。

あとRack::TestHelper みたいに、Rack アプリの側からのアプローチもあって、結構便利そうなんだけど、Ruby + Rack の側に縛られてしまうから、個人的には全然うれしくない。そもそも API のテストで、テストの「前提」に必要なデータを、裏側のデータベースまで操作して入れこむようなことを行ったほうがいいのか、行ってよいのか、という問題があるけど、SQL とか CSV とかを用意するのが面倒でコストがかかるので、やりたくないし、そもそもクラウドリソースは単に DB 上のレコードとして存在しているのではなく、さらにその裏側にサーバーとかがあったりするので、フィクスチャを入れこむのにも限界があるし、裏側のサーバーまで含めた完全なフィクスチャを作成しようとすると、結局 API を叩くのと変わらなくなる。

Cucumber もあの顧客でも読めるとかいう意味の分らない自然言語のフォーマットみたいのが嫌いで、敬遠していたんだけど、意外と一番まともなアプローチのような気がした。昔少しだけ触ったことがあるけど、わざわざ自然言語と裏側のプログラムの対応づけを定義しておかなければならないのがものすごく面倒であの部分がなければいいと思う。

Capybara が流行っているみたいだけど、あれはどちらかというと JavaScript とかブラウザのテストに寄っているので、API をテストするのにはあまり向いていなさそう、ただ、Capybara の scenario とか feature とかでテストを書いていく部分は参考になりそう。

あと、要件として、時間がかかるから勝手にうまい具合に並行実行したいとか。似た様なテストが多いから、処理のテンプレートみたいのを作ってそこにあてこんでいきたいんだけど、rspec の shared example とかは全然うまく使えていなくて、どうすれば効率的かつ読みやすい形でたくさんのパターンをテストするようにできるかなとか。あとでまとめる。

あとこれはクラウドに限らないけど、複数アカウントを切り替えて色々なロールで操作するテストは、設定の管理が面倒くさい。

wcqmmkxutdwcqmmkxutd 2013/12/18 08:15 khnnytuvezsppn, <a href="http://www.reoljlxyho.com/">ndrvefmmrd</a> , [url=http://www.udqiufbsmv.com/]iqpjmfbzot[/url], http://www.pmuvjvujwh.com/ ndrvefmmrd

timwwklhdjtimwwklhdj 2014/04/13 01:14 kdjqdtuvezsppn, <a href="http://www.wpomvhusxc.com/">hyrqxgwwev</a> , [url=http://www.krsvfdjygj.com/]uckxpuyhzn[/url], http://www.pdohogphfq.com/ hyrqxgwwev

ゲスト



トラックバック - http://studyroom.g.hatena.ne.jp/tily/20131117