2010-12-31 5 views
1

PythonでWebTest、Djangoでテストクライアント、Ruby on Railsで機能テストや統合テストを行うなど、私のmochiwebアプリケーションを高レベルでテストしたいと考えています。私はそれをやる方法についてあまり気にしていません。基本的には、HTTPリクエストを送信またはシミュレートして結果にアサーションを付けるだけです。mochiwebアプリケーションをテストするには?

リクエストハンドラがReq:respond()を呼び出すのではなく、タプル{Code, Headers, Body}を返すようにコードをリファクタリングしました。これは私は、 mochiweb_request:new()ダミーリクエストを構築し、私のリクエストディスパッチャに渡すとEUNITを使用して結果にアサーションを行うことができます:

make_request(Method, Path) -> 
    Request = mochiweb_request:new(nil, Method, Path, {1, 1}, 
     mochiweb_headers:make([{"Accept", "text/html"}])), 
    Response = myapp:dispatch(Request), 
    Response. 


signin_test() -> 
    {Code, _, _} = make_request('GET', "/signin"), 
    ?assertEqual(Code, 200), 
    ok. 

今私の問題は、POSTリクエストをテストする方法です。私はそれを行うことができるようになりました。 mochiwebコードを読むと、Req:parse_post()が呼び出されると、ソケット上の読み取りがトリガーされるように見えます。私はsrc/mochiweb.erlに興味深いテストコードを見つけました。明らかに、これはHTTPメッセージを構築し、ソケットに書き込んで返答を読み返すことを含んでいます。私は自分のテストコードでこれをやろうとしましたが、数時間後にどこにでも行けませんでした。私は正しい方向に進んでいるのだろうかと思っています。たぶん私はHTTPの配管から、さらに多くの機能を切り離す必要があります。リクエストハンドラ内からReq:parse_post()を呼び出してはいけません。私が考えているもう一つの解決策は、Erlangに書かれている必要はないサードパーティのWebテストライブラリを使うことです。おそらくRubyやPython、あるいはおそらくSeleniumの何か。

mochiwebアプリの機能テストや統合テストを行うにはどのような解決策をお勧めしますか?

答えて

0

私は共通のテストサーバーを使用し、テストにはiibrowseを使用します。ここに例があります:

post_cap_query_no_caps(_Config) -> 
A="<?xml version=\"1.0\" encoding=\"utf-8\"?><query><capabilities/></query>", 
{ok, "200", _C, Body}=ibrowse:send_req("http://localhost:8000/devices", XML_CONTENT_TYPE, post, A), 
"<devices/>" == Body. 
+0

ibrowseを指摘していただきありがとうございます。あなたはそれをeunitとうまく連携させることができましたか? eunit fixtures facilityを使用してサーバーを起動/停止し、テスト環境をセットアップしますか? –

1

私たちのテストは、ほとんどがHTTPの配管から切り離されています。とにかく機能的な環境では、通常は適切なことです。

src/mochiweb_multipart.erlにeunitコードがありますが、これはおそらく特定のユースケースに関連しています。

+0

"私たちのテストをHTTP配管から切り離す"という意味は理解できません。私は "HTTPパイプラインからの私の機能をさらに切り離す"と言いましたが、コントローラーはReq:parse_post()自体を呼び出さずに、Erlangデータ構造として解析されたPOSTデータを上位の関数呼び出しスタック"HTTP plumbing"を扱う関数はテストされません。リクエストハンドラのみが、POSTデータを含むErlangデータ構造体を渡すことによってテストされます。それはあなたも同様ですか? –

+0

私はsrc/mochiweb_multipart.erl eunitコードを見ました。私はそれが何をしているのかを大雑把に理解していると思います。このコードでは、mochiwebの機能をテストするためにServerFunを自分で定義します。私の場合、既存のサーバー機能をテストしたいので、アプリケーションオプションの1つをループオプション(mochiweb_socket_server:start()が必要)として提供する必要があると思いますか? mochiwebスケルトンアプリケーションで定義されたループ関数ですか? (私は試してみましたが、うまくいかなかったのですが、私のコードのどこかに問題があった可能性があります)。 –

+0

はい、より具体的ではないと申し訳ありません。 HTTP配管からテストを分離すると、機能自体がHTTP配管から切り離されていることを意味します。 –

0

httpクライアントを使用して電話をかけてみませんか?私はibrowseを使用して、必要に応じてPOSTingデータを含む私のWebマシンサーバーをシステムテストします。

関連する問題