본문 바로가기

소소한 꿀팁..?

nGringder 클래스 정리

https://goto-pangyo.tistory.com/275

 

nGrinder 테스트 스크립트 ide에서 작성하기(+ intelliJ, docs)

개인 프로젝트에서 테스팅 툴로 Breaking Point test를 해야하는 일이 생겼습니다 그리고 저는 여러 테스팅툴중 한글로 되어있는 레퍼런스가 많은 nGrinder를 사용하였습니다... nGrinder는 Jython, groovy 이

goto-pangyo.tistory.com

해당 글의 부록과도 같은 느낌으로 포스팅을 작성하려고 합니다.

이 글에서는 제가 토이프로젝트를 사용하면서 사용한 클래스 위주로 어떻게 사용하는지 작성한 글입니다.

코드는 공식문서와 nGrinder를 통해 자동으로 생성되는 스크립트를 기준으로 작성하였습니다.


NVPair

이 클래스는 Name, Value의 Pair로 헤더, 폼 데이터, 속성 리스트들을 나타낼때 사용합니다.


HttpRequest(+Post method)

 

 

HTTP요청의 post method를 사용하려고 할때 HTTPRequest 요청의 POST를 사용합니다. 이때 메소드의 인터페이스는 다음과 같습니다.

private AsyncRequestProducer createRequestWithBody(String method, String uri, byte[] content, List<Header> headers)

첫번째 인자는 Post, Get, Put, Patch와 같은 method을 의미하고 두번째는 요청을 보낼 uri 세번째는 바이트 타입의 Body 마지막으로는 요청에 대한 header값을 넣어줍니다. 

이때 POST 메소드는 내부적으로 createRequestWithBody를 사용합니다.


GTest(+Test, record)

nGrinder를 사용하면서 처음으로 GTest라는 단어에 대해 들어보았습니다. 저는 먼저 공식 문서에서 GTest가 있는지 찾아보았습니다.

GTest에 대한 설명은 존재하지 않았습니다.

이후 GTest 클래스를 들어가보았고 Test라는 클래스를 상속하고 있는것을 확인하였습니다.

 

그리고 공식문서에 Test라는 클래스에 대한 설명이 존재하는 것을 확인하였습니다.

좌측 하단에 이탤릭체로 쓰여 있는 Test는 인터페이스에 대한 간단한 설명입니다.

그리고 nGrinder에서 Test가 어떤 방식으로 동작하는지를 작성해놓은 본문을 확인해볼수 있었습니다.

이를 요약하면 

  • TestJython을 감싸는 래퍼 인스턴스입니다.(인스턴스라고 표현한 이유는 저희가 작성하는 Script를 토대로 Jython 객체를 생성하고 이를 감싸는 래퍼 인스턴스라고 이해했기 때문입니다.)
    • Jython은 JVM위에서 실행되는 파이썬이라고 생각하시면 이해하시기 쉬울듯 합니다. Java + python
    • nGrinder는 3.5.9버전을 기준으로 스크립트를 Jython과 groovy를 통해 작성할 수 있습니다.
  • "Test"는 성능 통계가 기록되는 작업 단위를 나타냅니다. 각 테스트는 테스트 번호로 고유하게 식별되며, 테스트의 내용을 설명하는 'description'이 존재할 수 있습니다.
  • The Grinder는 이 결과들을 종합합니다. 동일한 번호로 두 개의 테스트가 생성되면 첫 번째 설명이 콘솔에 표시됩니다.

다음과 같습니다. 이제 Test가 무엇인지 알았으니 GTest 클래스에 대해 알아보도록 하겠습니다.

위의 Test에 대한 설명에서 나온 테스트 number와 description이 담긴 객체를 생성자를 통해 생성할 수 있습니다.

이후 아래 record메소드를 이용해 테스트에 대한 기록을 남길수 있습니다.

record에 대한 공식문서의 설명은 다음과 같습니다.

 

요약하면 다음과 같습니다.

  • record는 주어진 Target(위에서 생성한 테스트 객체를 의미합니다.)에 대해 반복되는 Test에 대한 기록을 수행합니다.
  • 만약 record의 두번째 파라미터까지 주어진다면 해당 파라미터를 통과할 경우에만 테스트 결과를 기록합니다.

이것만 보았을때는 무슨말인지 아리송할수 있으니 직접 코드를 까보면 될 일입니다.

(하지만 저희는 Test 객체가 아닌 GTest를 사용하고 있으니 GTest를 까봐야 합니다.)

파라미터가 두개이지만 자세히 보니 두번째 파라미터의 형식이 다릅니다. 그러나 메소드 내부를 보면 this.record를 호출하는 코드가 존재합니다.
두번째 파라미터인 MethodNameFilter는 공식문서에서 언급한 Test.InstrumentationFilter를 구현한 클래스입니다.

그렇다면 저희는 공식문서에서 말했듯 record를 이용해 저희가 궁금한(기록하고자 하는) 테스트 메소드의 이름을 인자로 주면 될 것입니다.

아래는 사용예제입니다.

@BeforeThread
public void beforeThread() {
	test.record(this, "test")
}

@Test
public void test(){...}

위의 코드는 nGrinder에서 주는 예제 코드 입니다.


grinder.statistics.delayReports

nGrinder에서 제공해주는 코드를 보면 다음과 같은 코드가 있습니다.

grinder.statistics.delayReports = true

그리고 공식문서에는 다음과 같이 설명되어 있습니다.

이를 요약하면 report 하는 것을 delay해서 무언가 조작할 수 있도록 도와준다 합니다. 또한 report가 되는 시점에 대해 알려주고 있습니다.

  • 다음 테스트가 시작될때
  • 포함된 테스트가 종료될 때
  • 현재 실행이 완료될때
  • 스크립트가 report()를 호출할떄
  • 스크립트가 setDelayReports(false)를 호출할때