ngrinder에서 protobuf 사용법 정리
2022-11-13 14:41:51

최근에 ngrinder에서 protobuf 예시 코드를 제공할 일이 있어서 정리해봄

예시 프로토 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
syntax = "proto3";
package testpackage;

option java_package = "com.example.protos";
option java_outer_classname = "PostProtos";

message SavePost {
string title = 1;
string content = 2;
string tag = 3;
}

message ReadPost {
int64 id = 1;
string nickname = 2;
string title = 3;
string content = 4;
string tag = 5;
}

해당 파일을 protoc를 통해 자바 클래스 파일로 컴파일을 한다

1
protoc -I=./ --java_out=./ ./post.proto

maven으로 jar를 만들꺼기 때문에 프로젝트 만듬

1
2
mvn archetype:generate
# 이후 아티팩트id, groupid는 대충 알아서...넣으셈

maven 프로젝트에서는 쓸데 없는거 다 지우고 src - com -> 컴파일된 클래스만 넣는다

클래스

pom.xml에 구글 프로토버퍼 라이브러리 디펜던시에 추가, 그리고 플러그인 태그에 추가해야됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.9</version>
</dependency>

...

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

maven으로 jar 파일을 패키징 한다

1
mvn assembly:assembly

nginder, agent 실행하고 스크립트에서 lib 폴더를 만들고 생성된 jar 파일

(-with-dependencies 붙은거)을 업로드 한다

lib

groovy 기본 스크립트에 request/response 슬쩍 해봄

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.script.GTest
import net.grinder.script.Grinder
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
// import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith

import org.ngrinder.http.HTTPRequest
import org.ngrinder.http.HTTPRequestControl
import org.ngrinder.http.HTTPResponse
import org.ngrinder.http.cookie.Cookie
import org.ngrinder.http.cookie.CookieManager
import org.apache.hc.core5.http.Header;
import org.apache.hc.core5.http.message.BasicHeader;
import com.example.protos.* // class import

/**
* A simple example using the HTTP plugin that shows the retrieval of a single page via HTTP.
*
* This script is automatically generated by ngrinder.
*
* @author admin
*/
@RunWith(GrinderRunner)
class TestRunner {

public static GTest test
public static HTTPRequest request
public List<Header> headers = [ new BasicHeader("Content-Type", "application/octet-stream") ]
public static Map<String, Object> params = [:]
public static List<Cookie> cookies = []

@BeforeProcess
public static void beforeProcess() {
HTTPRequestControl.setConnectionTimeout(300000)
test = new GTest(1, "Test1")
request = new HTTPRequest()
grinder.logger.info("before process.")
}

@BeforeThread
public void beforeThread() {
test.record(this, "test")
grinder.statistics.delayReports = true
grinder.logger.info("before thread.")
}

@Before
public void before() {
request.setHeaders(headers)
CookieManager.addCookies(cookies)
grinder.logger.info("before. init headers and cookies")
}

@Test
public void test() {
def message = new PostProtos.SavePost()
def data = message.newBuilder().setTitle("this is title").setContent("this is content").setTag("this is tag").build()
HTTPResponse response = request.POST("http://localhost:3000/save-post", data.toByteArray())

def readMsg = new PostProtos.ReadPost()
def readData = readMsg.parseFrom(response.getBodyBytes())
grinder.logger.info("id:" + readData.getId())
grinder.logger.info("nickname:" + readData.getNickname())

if (response.statusCode == 301 || response.statusCode == 302) {
grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode)
} else {
assertThat(response.statusCode, is(200))
}
}
}

참고