HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

jiwon jo
아래와 같은 에러가 나는데.. 해결 방법이 없을까요..

net.grinder.engine.common.EngineException: Must be called from worker thread

at net.grinder.engine.process.RegisteredPlugin.getPluginThreadListener(RegisteredPlugin.java:74)

at net.grinder.plugin.http.HTTPRequest$AbstractRequest.getHTTPResponse(HTTPRequest.java:1254)

at net.grinder.plugin.http.HTTPRequest.GET(HTTPRequest.java:499)

at net.grinder.plugin.http.HTTPRequest.GET(HTTPRequest.java:445)

at net.grinder.plugin.http.HTTPRequest$GET.call(Unknown Source)

at com.line.music.ngrinder.test.MusicMainTopTest.runTest(MusicMainTopTest.groovy:59)

at com.line.music.ngrinder.test.MusicMainTopTest$runTest.call(Unknown Source)

at com.line.music.ngrinder.test.PlayListCreateTest.beforeProcess(PlayListCreateTest.groovy:55)

at net.grinder.scriptengine.groovy.junit.RunAfterThreads.evaluate(RunAfterThreads.java:56)

at net.grinder.scriptengine.groovy.junit.GrinderRunner.run(GrinderRunner.java:170)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

소스 코드는 아래와 같습니다.

@RunWith(GrinderRunner)
class PlayListCreateTest {

        public static GTest test
        public static HTTPRequest mainTopRequest;
        public static HTTPRequest playListRequest
        static String musicIds;

        NVPair[] headers;

        @BeforeProcess
        public static void beforeProcess() {

                HTTPPluginControl.getConnectionDefaults().timeout = 6000
                test = new GTest(1, this.getClass().getName())


                playListRequest = new HTTPRequest()
                test.record(playListRequest)

                musicIds = MusicMainTopTest.mainTopTrackIds();

                grinder.logger.info("before process.")
        }

Reply | Threaded
Open this post in threaded view
|

Re: HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

jiwon jo
MusicMainTopTest


public static String mainTopTrackIds(){




def runTest = MusicMainTopTest.runTest(new HTTPRequest());




def data = new JsonSlurper().parseText(runTest);




def extractTrackIds = ExtractorFromCollection.extractTrackIds(data.result.lineRankList.items.collect());




while(true){




if(extractTrackIds.size() < PlayListTrack.MAX_TRACK_COUNT){

extractTrackIds.addAll(extractTrackIds);

}

else{

extractTrackIds= extractTrackIds.collect().subList(0, PlayListTrack.MAX_TRACK_COUNT);

break;

}

}




assertTrue(extractTrackIds.size()==PlayListTrack.MAX_TRACK_COUNT);




def json = new JsonBuilder();




json.setContent(extractTrackIds);




return json.toPrettyString();

}
Reply | Threaded
Open this post in threaded view
|

Re: HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

junoyoon
Administrator
BeforeProcess 루틴에서는 httprequest 를 사용한 어떠한 호출도 불가능합니다. BeforeThread 쪽으로 옮기세요

2014년 4월 1일 화요일, jiwon jo [via ngrinder]<[hidden email]>님이 작성한 메시지:
MusicMainTopTest


public static String mainTopTrackIds(){




def runTest = MusicMainTopTest.runTest(new HTTPRequest());




def data = new JsonSlurper().parseText(runTest);




def extractTrackIds = ExtractorFromCollection.extractTrackIds(data.result.lineRankList.items.collect());




while(true){




if(extractTrackIds.size() < PlayListTrack.MAX_TRACK_COUNT){

extractTrackIds.addAll(extractTrackIds);

}

else{

extractTrackIds= extractTrackIds.collect().subList(0, PlayListTrack.MAX_TRACK_COUNT);

break;

}

}




assertTrue(extractTrackIds.size()==PlayListTrack.MAX_TRACK_COUNT);




def json = new JsonBuilder();




json.setContent(extractTrackIds);




return json.toPrettyString();

}



If you reply to this email, your message will be added to the discussion below:
http://ngrinder.642.n7.nabble.com/HTTPRequest-beforeProcess-tp1441p1442.html
To start a new topic under ngrinder-user-kr, email <a href="javascript:_e(%7B%7D,&#39;cvml&#39;,&#39;ml-node%2Bs642n113h87@n7.nabble.com&#39;);" target="_blank">ml-node+s642n113h87@...
To unsubscribe from ngrinder-user-kr, click here.
NAML
Reply | Threaded
Open this post in threaded view
|

Re: HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

jeehong.lee
그럼 ngrinder는 beforeProcess에서 resource 셋팅을 httpResponse 데이터로 할 수 없다는 뜻인가요?
아니면 다른 httpClient를 사용해서 하면 되는지 궁금합니다.^^;;


Reply | Threaded
Open this post in threaded view
|

Re: HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

Isaiah Choe
만약 꼭 beforeProcess 단계에서 HttpRequest를 사용하셔야 하신다면 그리고 단지 테스트할 데이터를 준비하는 용도로 사용하신다면 익숙하신 Http Client 라이브러리를 사용하시거나 아니면 직접 구현하셔서 사용하시면 됩니다.

참고로 HttpRequest의 getHttpResponse()는 데이터 처리를 위한 시간은 제외하고 http request/response 시간만 계산하기 위해 threadcontext의 pauseClock(), resumeClock()을 실행하려고 합니다.

그런데 beforeProcess()에서는 아직 해당 프로세스 내에 생성된 thread가 없기 때문에 threadcontext도 초기화되지 않아서 이러한 오류 메시지가 나오게 됩니다.

grinder의 특성이므로 HttpRequest는 instrumentation이 필요한 곳에만 사용하시고 앞에서 말씀드린 것처럼 별도의 라이브러리를 이용하시는 것이 좋을 듯 합니다.
Reply | Threaded
Open this post in threaded view
|

Re: HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

jeehong.lee
예, 그런 이유가 있었군요.
명쾌한 답변 감사합니다.
Reply | Threaded
Open this post in threaded view
|

Re: HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

jeehong.lee
In reply to this post by Isaiah Choe
위 이슈로 인해, 성능 테스트 코드의 재사용성이 매우 떨어지는것 같습니다.

ATest.doMainJob(ngrinderHttpRequest, ...)  와 같이 만들어 두고
BTest의 BeforeProcess에서 ATest.doMainJob을 호출하여 재사용하려고 했는데,
호출하는 위치가 BeforeProcess임으로 동일한 코드를 재사용 할수가 없는 상황입니다.

ATest.doMainJob은 ATest수행시에는 ngrinderHttpRequest를 사용해서 성능 테스트를 해야함으로
ATest.doMainJob의 Method Signature를 변경 하기도 어렵고
ngrinderHttpRequest의 Class가 추상화를 제공하지 않아, 다른 HttpClient라이브러리를 구현 할수도 없는
상황입니다.

위 내용에 대한 해결방법이나 도움 부탁 드립니다.

* ngrinderHttpRequest= net.grinder.plugin.http.HTTPRequest



Reply | Threaded
Open this post in threaded view
|

Re: HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

jeehong.lee
beforeProcess에서도 사용 할 수 있게
on/off 설정을 추가하는 것은 어떨까요?
Reply | Threaded
Open this post in threaded view
|

Re: HTTPRequest를 beforeProcess에서 쓸려고 할때 에러 관련

junoyoon
Administrator
nGrinder 프로젝트는 모든 사람에게 오픈되어 있습니다~ ^^

http://github.com/nhnopensource/ngrinder

Contribution 환영합니다~