아래와 같은 에러가 나는데.. 해결 방법이 없을까요..
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.") } |
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(); } |
Administrator
|
BeforeProcess 루틴에서는 httprequest 를 사용한 어떠한 호출도 불가능합니다. BeforeThread 쪽으로 옮기세요
2014년 4월 1일 화요일, jiwon jo [via ngrinder]<[hidden email]>님이 작성한 메시지: MusicMainTopTest |
그럼 ngrinder는 beforeProcess에서 resource 셋팅을 httpResponse 데이터로 할 수 없다는 뜻인가요?
아니면 다른 httpClient를 사용해서 하면 되는지 궁금합니다.^^;; |
만약 꼭 beforeProcess 단계에서 HttpRequest를 사용하셔야 하신다면 그리고 단지 테스트할 데이터를 준비하는 용도로 사용하신다면 익숙하신 Http Client 라이브러리를 사용하시거나 아니면 직접 구현하셔서 사용하시면 됩니다.
참고로 HttpRequest의 getHttpResponse()는 데이터 처리를 위한 시간은 제외하고 http request/response 시간만 계산하기 위해 threadcontext의 pauseClock(), resumeClock()을 실행하려고 합니다. 그런데 beforeProcess()에서는 아직 해당 프로세스 내에 생성된 thread가 없기 때문에 threadcontext도 초기화되지 않아서 이러한 오류 메시지가 나오게 됩니다. grinder의 특성이므로 HttpRequest는 instrumentation이 필요한 곳에만 사용하시고 앞에서 말씀드린 것처럼 별도의 라이브러리를 이용하시는 것이 좋을 듯 합니다. |
예, 그런 이유가 있었군요.
명쾌한 답변 감사합니다. |
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 |
beforeProcess에서도 사용 할 수 있게
on/off 설정을 추가하는 것은 어떨까요? |
Administrator
|
Free forum by Nabble | Edit this page |