2010-12-31 4 views
1

Python에서 WebTest, Django에서 테스트 클라이언트, Ruby on Rails에서 기능 테스트 또는 통합 테스트를 할 수있는 것처럼 mochiweb 앱에 대한 높은 수준의 테스트를하고 싶습니다. 나는 그것을하는 방법에 관하여 너무 까다 롭지 않다. 기본적으로 나는 단지 HTTP 요청을 보내거나 시뮬레이션하고 결과에 대한 단언을하고 싶습니다.mochiweb 응용 프로그램을 테스트하는 방법은 무엇입니까?

내 요청 처리기가 Req:respond()을 호출하지 않지만 {Code, Headers, Body} 튜플을 반환하도록 코드를 리팩터링했습니다. 이 날 EUNIT을 사용하여 결과에 대한 주장을, mochiweb_request:new()와 더미 요청을 만들 내 요청 디스패처에게 전달하고 만들 수 있습니다 :

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에 쓰여진 서드 파티 웹 테스트 라이브러리를 사용하는 것입니다. 아마도 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()를 직접 호출하지 않고, 구문 분석 된 POST 데이터를 Erlang 데이터 구조로 제공하는 것을 의미합니다. 호출 스택 "HTTP 배관"을 다루는 함수는 테스트되지 않습니다. 요청 핸들러 만 POST 데이터가 들어있는 Erlang 데이터 구조를 전달하여 테스트합니다. 그것은 당신이하는 일입니까? –

+0

src/mochiweb_multipart.erl eunit 코드를 살펴 봤는데 대략 이해하고 있다고 생각합니다. 이 코드에서는 mochiweb의 기능을 테스트하기 위해 ServerFun을 직접 정의합니다. 제 경우에는 기존 서버 기능을 테스트하고 싶습니다. 그래서 제 앱의 함수 중 하나를 루프 옵션으로 제공해야한다고 가정합니다. mochiweb_socket_server : start()가 필요합니까? mochiweb skeleton app에 정의 된 루프 함수 일 수 있습니까? (시도했지만 작동하지 않았지만 다른 곳에서 문제가 발생했을 가능성이 큽니다.) –

+0

네, 더 구체적이지 않은 것에 대해 죄송합니다. HTTP 배관에서 테스트를 분리하면 기능 자체가 HTTP 배관과 분리됩니다. –

0

http 클라이언트를 사용하여 전화를 걸면 어떨까요? 필자는 필요한 경우 POSTing 데이터를 포함하여 ibrowse를 사용하여 시스템 웹 서버를 테스트합니다.

관련 문제