본문 바로가기
프로그래밍/기타

[intellij] http를 통해서 E2E(local, server) 테스트를 진행해봅시다

by 사바라다 2022. 5. 5.

안녕하세요. 많은 분들이 postman을 이용하여 local 테스트를 진행하는 것으로 알고 있습니다. 그런데 사실 intellij 내부에서도 local 테스트를 지원한다는 사실을 알고 있으셨나요? http 파일을 이용하면 intellij에서 local 테스트와 같은 E2E 테스트를 진행할 수 있는데요. 이는 개발이 정상적으로 이루어졌는지 확인하는데 큰 도움이 됩니다. intellij에서 개발하고 intellij에서 테스트 할 수 있다는 것은 좀 더 편하게 개발을 할 수 있다는 뜻인데요. 오늘은 이렇게 개발을 좀 더 생산성 있게 진행하기 위해서 intellij에서 제공하는 http 파일을 이용하여 local 테스트를 진행해보도록 하겠습니다.

http 파일 생성

가장 먼저 http 파일을 생성해 보도록 하겠습니다. 생성하는 방법에는 2가지가 있습니다. 첫번째는 만들어진 Controller에서 바로 생성하는 방법이고 그리고 하나는 원하는 디렉토리를 직접 선택하고 파일을 생성하는 방법입니다.

Controller에서 직접 생성

Controller에서 직접 생성하는 방법은 아래의 이미지와 같습니다. @GetMapping의 value 필드 옆에 보면 지구모양이 있습니다. 그걸 클릭하면 Actions for URL이 보이는데요. 여기를 클릭하면 아래 이미지 처럼 3가지의 목록이 출력됩니다. 여기서 Generate request in HTTP Client를 누르면 Scratches and Consoles 쪽에 파일이 생성되게 됩니다.

디렉토리를 만든 후 직접 생성

디렉토리에서 직접 만드는 방법도 있습니다. 위의 방법으로는 디렉토리 지정이 되지 않는데요. 그래서 별도의 폴더를 만든 후 디렉토리 구조도에서 오른쪽 마우스 클릭을 하고 New -> Scratch File을 누르시면 아래 이미지와 같이 뜨게됩니다. 여기서 HTTP Request를 클릭하시면 됩니다.

http 구조와 기본적인 예제

파일을 생성했으면 이제 실제 http request를 작성해보도록 하겠습니다. http 파일의 구조는 아래와 같습니다. 구조도를 보시면 기본적으로 http 스키마와 동일하게 작성되는 것을 확인하실 수 있습니다.

###
Method Request-URI HTTP-Version
Header-field: Header-value

Request-Body

###
...

아래 코드는 위 스키마를 토대로 작성된 예제입니다. 아래처럼 작성한 후 실행(Ctrl + Shift + R)하면 결과를 확인할 수 있습니다. 또한 한 파일에서 여러개의 http 요청을 작성할 수 있는데 그 구분자는 ### 이며 ### 뒤에 네이밍을 붙여서 ### create review 처럼 만들어 관리할 수도 있습니다.

POST http://localhost:8080/v1/tonari/626a9c6d17b9470fb913d1de/reviews
Content-Type: application/json

{
  "userIP" : "0.0.0.0",
  "reviewScore" : {
    "total" : 2.0,
    "salary" : "1.0",
    "culture" : "3.0",
    "boss" : "3.5"
  },
  "title" : "할수 있다",
  "strength" : "강점",
  "weakness" : "약점"
}

주석도 사용할 수 있어야할탠데요. 일반 코드의 주석을 주는것 처럼 //를 통해서 줄 수 있습니다.

GET {{host}}/v1/tonari/626a9c6d17b9470fb913d1de
Content-Type: application/json
Accept: application/json // 반환도 받아야하니까 Accept 추가

상단탭 살펴보기

editor의 상단에 보면 여러 아이콘들이 있습니다. 각각 intellij에서 지원해주는 요소들인데요. 왼쪽부터 하나씩 살펴보도록 하겠습니다.

  • + : request를 추가
  • 시계모양 : request 히스토리 보기
  • 문서모양 : http Request를 cURL로 변환
  • 좌하단 화살표 : cURL을 http Request로 변환
  • 실행 모양 2개 : 파일을 위에서부터 순서대로 실행
  • Run with : 환경 변수 파일 적용

알아두면 좋을 만한 것은 Bold 처리하였습니다. cURL 변환을 이용하면 쉽게 postman에서 http로 이관하는 것이 가능합니다. 그리고 test suite도 지원하고 환경 변수도 지원한다는 것을 상단 바를 통해서 알 수 있습니다.

환경 변수 사용하기

http에서 환경 변수를 사용하는 가장 간단한 방법은 상단의 Run with에서 Add Environment to Public FileAdd Environment to Private File을 이용하는 것입니다. 이 두개의 차이점은 Public File은 Git에 기본적으로 Add 된다는 것이고 Private File은 Add 되지 않는다는 것입니다. 따라서 Private에는 비밀번호와 같은 Git에 올리면 안될 변수들을 넣어주시면 됩니다.

Add Environment to Public File를 클릭하면 http-client.env.json 이라는 아래와 같은 json 파일이 만들어집니다.

host는 제가 추가한 것입니다. dev 및 prod는 환경을 나타내고 그 안에 실제 사용할 환경변수를 입력할 수 있습니다.

{
  "dev": {
    "name": "value",
    "host": "http://localhost:8080"
  },
  "prod": {
    "name": "value",
    "host": "http://localhost:8080"
  }
}

그리고 아래와 같이 이용할 수 있습니다. 아래에서 위에 선언했던 host 라는 변수를 사용하는 것을 확인하실 수 있습니다. 변수는 {{변수명}}의 형식으로써 사용할 수 있습니다.

### test1
POST {{host}}/v1/tonari
Content-Type: application/json

{
  "name" : "여기는 어디인가 ? ",
  "address" : "여기는 거기다"
}

다이나믹 변수(Dynamic variables)

위에서 우리가 선언하는 변수 말고도 intellij에서 기본적으로 사용할 수 있도록 제공해주는 변수가 있습니다. 이를 intellij에서는 다이나믹 변수라고 부릅니다. 다이나믹 변수의 리스트는 아래의 3가지가 있습니다.

  • $uuid - 글로벌 unique idenifier를 생성
  • $timestamp - 현재 UNIX timestamp를 생성
  • $randomInt - 0 ~ 1000 사이의 숫자중 하나를 랜덤으로 생성

이러한 변수 또안 위에서 사용한 커스텀 변수와 마찬가지의 방법으로 아래처럼 사용할 수 있습니다.

GET http://localhost/api/get?id={{$uuid}}

Handle the response

이전에 상단탭을 살펴 보았을 때 파일을 위에서부터 순서대로 실행할 수 있다고 확인을 했었습니다. 실전에서 이를 더 잘 활용하기 위해서는 인증, 그리고 가져온 데이터를 활용하는 방법이 있는데요. 이를 위해서는 이전의 응답을 다음의 요청 파라미터중 일부로 전달해야하는 경우가 있습니다. 이 또한 http에서는 지원합니다. 응답 값을 다루는 방법에 대해서 알아보도록 하겠습니다.

http reponse의 아래에 > {% %} 문법을 이용하여 작성하면 됩니다. 내장되어있는 많은 함수들이 있는데 여기서는 response Body의 내용을 넣는 것을 확인해보도록 하겠습니다. 먼저 문법은 아래와 같습니다.

> {%
   // 여기에 코드를 통해서 설정한다.
 %}

실제 사용은 아래와 같이 할 수 있습니다. 아래는 List를 가져오고 그 중 json body의 일부를 환경변수에 동적으로 넣고 다음 요청에서 사용하는것을 나타내고 있습니다.

### List Read API
GET {{host}}/v1/tonari
Content-Type: application/json
Accept: application/json

> {%
   client.global.set("tonariId", response.body.infos[0].id)
 %}

/*
 * GET 응답에서 돌아오는 응답
 * response  { 
 *   "infos": [
 *     {
 *       "id": "625edb3ce1b2825482bd6853", // 해당값이 세팅됨
 *       "name": "test",
 *       "totalScore": 0.0
 *     }
 *   ]
 * }
 */

### Single Read API
GET {{host}}/v1/tonari/{{tonariId}}
Content-Type: application/json
Accept: application/json // 반환도 받아야하니까 Accept 추가

더 많은 예제

위의 마지막 예제는 http는 기본적으로 client라는 instance를 제공하고 이를 이용하고 있습니다. client instance와 response instance를 이용하여 다양한 스크립트를 작성할 수 있습니다. 이러한 스크립트를 이용하면 좀 더 다양한 테스트를 만들어 낼 수 있습니다. 아래는 이에 참고할 수 있는 페이지 입니다.

https://www.jetbrains.com/help/idea/http-response-handling-examples.html

마무리

감사합니다. 오늘은 이렇게해서 intellij의 제공하는 기능인 http 파일에 대해서 알아보는 시간을 가져보았습니다.

이를 이용하면 하나의 repository에서 E2E 테스트까지 겸할 수 있으므로 관리가 수월해 질것으로 보입니다.

감사합니다.

참조

[1] https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html

댓글