티스토리 뷰

반응형

Test 코드 공부시리즈 마지막 글입니다.

이번에 공부해볼 것은 postman 을 이용해 시나리오테스트를 해보는 것입니다.

 

테스트 코드 공부 시리즈

1. AssertJ를 이용한 테스트 코드 작성

2. JUnit의 Parameterized 어노테이션 사용하기

3. Spring AutoConfigure Annotation Test

4. Mockito 톺아보기

5. kotlin에 특화된 mockito-kotlin 사용하기

6. postman을 이용한 시나리오 테스트 하기

 

 

내가 로그인 서비스를 하나 운영하고 있다고 가정해보겠습니다.

로그인 서비스에서 수정사항이 있거나 신규로 추가되는 기능이 있다면 작업을 진행하고 신규 버전을 새로 배포를 진행하게 됩니다.

배포를 진행하기 전에 테스트 코드도 작성하고 여러가지 검증을 진행하지만 배포가 완료된 후에 최종적으로 전체 기능이 잘 동작하는지 테스트가 필요합니다.

만약 시나리오 테스트가 따로 없다면 기존에 있던 로그인 기능 뿐만아니라 신규로 추가된 기능들을 일일이 테스트를 진행해야 합니다.

서비스에 기능이 100개가 있다면 총 100개의 기능에 대해 테스트 해야함을 의미합니다.

이러한 번거로운 과정을 시나리오 테스트를 이용한다면 한번의 클릭으로 서비스 전체를 검증할 수 있게 됩니다.

 

그러면 바로 postman으로 간단한 시나리오 테스트를 만들어 보겠습니다.

 

시나리오 테스트를 위한 간단한 로그인 서비스


먼저 간단한 로그인 서비스를 지원하는 API를 만들어 보겠습니다.

 

@RestController
class LoginController {

    @GetMapping("/token")
    fun createToken(): String {
        return "token"
    }

    @PostMapping("/login")
    fun login(
        @RequestHeader(value = "Authorization") accessToken: String,
        @RequestBody loginRequest: LoginRequest,
    ): ResponseEntity<String> {
        if (accessToken != "token") {
            return ResponseEntity.status(401).body("잘못된 token값입니다")
        }
        return ResponseEntity.ok().body("로그인 성공")
    }
}

data class LoginRequest (
    val id: String,
    val password: String,
)

 

로그인 진행 순서는 아래와 같습니다

  1.  /token (로그인용 토큰 발급 요청)
    • 서버에 요청해 토큰값을 발급받습니다.
  2.  /login (로그인 요청)
    • 발급받은 토큰 값과 아이디 비밀번호를 전달해 로그인을 진행합니다.

 

 

PostMan으로 시나리오 테스트 하기 위한 준비


시나리오 테스트를 통해 로그인 서비스를 검증하기 위해서는 두가지 조건이 필요합니다.

  1. 발급받은 ACCESS TOKEN을 바로 다음 요청에 전달해서 사용할 수 있어야 한다
  2. 각 요청이 올바른 응답을 했는지 검증할 수 있어야 한다.

 

두가지 조건을 충족시키기 위해 필요한 postman의 기능들을 먼저 살펴보겠습니다.

1. Dynamic Variable 적용

 

Collection variables 설정

  1.  Collection 탭 클릭
  2.  설정할 collection을 지정
  3.  Variables 변수 설정 탭 클릭
  4.  사용할 변수 지정
    • host_url 변수에 localhost:8080 값을 설정

 

이렇게 설정한 변수를 이용해 /token 요청을 만들어 보겠습니다.

설정한 collection variable을 실제 사용시에는 {{$variable}} 형태로 사용 가능합니다.  

ex) {{host_url}}/token

 

postman에서는 collection 단위 말고도 다양한 Scope의 변수를 지원하고 있으니 좀 더 자세한 내용은  여기를 참고하시면 됩니다.

 

 

2. 응답에 있는 데이터를 저장했다가 다음 API 호출시 request에서 사용

이제 첫번째 조건인 발급받은 토큰을 /login API 요청시에 사용할 수 있는 방법을 알아보겠습니다.

 

이전 API응답으로 받은 데이터를 다른 API 호출시에 사용하기 위해서는 Dynamic Variable을 활용하는 것입니다.

응답으로 온 데이터를 변수(variable)에 저장한뒤 다음 API 호출시 사용하는 것입니다.

 

먼저 응답으로 온 데이터를 변수(variable)에 저장합니다.

 

1. Collection variable에 access_token 변수 선언

access_token 변수의 경우 응답으로 온 데이터를 값(value)로 사용할거기 때문에 Initial value 값을 설정하지 않아도 됩니다.

 

 

2. 응답으로 온 토큰 값을 access_token 변수에 저장

응답으로온 토큰값을 변수에 저장하기 위해서는 Tests 탭에 Script를 작성해서 변수값을 설정해야 합니다.

 

Script 코드

pm.test("로그인용 토큰값을 컬렉션 변수에 저장", function() {
    // 응답을 text로 변환
    var responseData = pm.response.text();

    // 사전에 정의해둔 컬렉션 변수 'access_token'에 세팅
    pm.collectionVariables.set('access_token', responseData);
})

 

Script를 설정한 후 요청을 다시 해보면 선언한 변수의 current value 탭에 “token” 값이 저장되는걸 확인 할 수 있습니다.

 

이제 응답으로 전달받은 token값을 /login 요청시 전달할 준비를 마쳤습니다.

저장한 access_token 변수를 /login 요청에 추가하여 로그인 요청을 진행하면 됩니다.

 

만약 응답데이터가 JSON 형식으로 온다면 아래와 같이 설정할 수 있습니다.

응답 데이터

{"access_token": "token"}

 

Script 코드

pm.test("로그인용 토큰값을 컬렉션 변수에 저장", function() {
    // 응답을 json으로 변환
    var jsonData = pm.response.json();

		// 응답에서 특정 필드 추출
		var accessToken = jsonData.access_token;

    // 사전에 정의해둔 컬렉션 변수 'access_token'에 세팅
    pm.collectionVariables.set('access_token', accessToken);
})

 

추가로 Test Script 작성시 간단한 문법은 옆에 Snippets 탭을 클릭해보면 간단한 코드 가이드를 받을 수 있습니다.

자세한 script 작성 방법은 공식문서를 참고하시면 됩니다.

script에서 변수 활용: https://learning.postman.com/docs/sending-requests/variables/#using-variables-in-scripts

 

 

3. 응답 데이터 검증

발급 받은 토큰을 통해 로그인 요청을 진행했으나 로그인이 정상적으로 잘 됐는지(200 OK 응답이 오는지)를 확인하기 위해서는 일일이 API의 응답값을 보고 직접 확인을 해야 합니다.

처음 구상한대로 한번의 클릭만으로 시나리오 테스트를 자동화시킬려면 검증 또한 자동화가 되어야 하는데요.

 

postman의 응답값 검증(Assertion)을 활용하면 됩니다.

검증은 바로 위의 변수값을 저장할때 사용했던 Tests 탭에 Script를 이용해 진행하게 됩니다.

 

검증 Script는 간단하기 때문에 바로 코드를 살펴보겠습니다.

 

로그인 요청이 정상적으로 이루어 지고 200 상태값을 반환 하는지 검증

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
})

 

응답 내부의 값 검증 (로그인 성공시 “로그인 성공” 메시지를 반환하는지 검증)

pm.test("로그인 응답 값 검증", function () {
    var responseData = pm.response.text();

    // 응답 값 검증
    pm.expect(responseData).to.eq("로그인 성공");
})

위의 상태값, 응답 값 뿐만 아니라 응답헤더, 응답 속도 등 여러가지 검증을 지원하고 있습니다.

자신의 서비스에 맞춰 검증 Script를 추가로 작성하시면 됩니다.

 

다양한 검증 방법은 해당 문서를 참고하시면 됩니다

https://learning.postman.com/docs/writing-scripts/script-references/test-examples/#using-multiple-assertions

 

 

시나리오 테스트 실행


이제 시나리오 테스트를 위한 준비가 완료되었습니다.

만들어 놓았던 API를 하나씩 순서대로 실행할 수도 있지만 postman은 collection에 있는 API를 한번에 순차적으로 실행할 수 있는 기능을 제공해주고 있습니다.

 

Collection API 한번에 실행하기

실행할 collection을 선택한뒤 Run 버튼을 클릭합니다.

 

  1. Run버튼을 클릭하면 RUN ORDER탭에 내가 선언해놓은 API가 순서대로 목록이 들어가 있게 됩니다.
    • 순서 변경이 필요하면 해당 탭에서 변경하시면 됩니다.
  2. Run configuration 탭에서 반복 횟수(Iterations), API 요청간 딜레이(Delay) 값을 설정 가능합니다.
    • Delay는 각 API 요청간의 딜레이 입니다. 여기서는 로그인용 토큰 발급 API 요청을 한 후 다음 로그인 요청 API를 요청할 때까지의 딜레이 값을 뜻합니다.
    • Delay값을 0으로 설정하고 실행했을시에 만약 로그인용 토큰 발급 요청이 응답이 오는데까지 일정시간이 걸린다면 다음 요청인 로그인 요청시에 토큰값이 없이 요청이 전달 될 가능성이 생기게 됩니다.
    • 따라서 API들의 응답시간을 고려하여 딜레이값을 여유있게 설정하시면 됩니다.
  3. 시나리오 테스트 실행

 

테스트를 실행후 시나리오 테스트가 마무리되면 postman은 테스트 결과를 요약하여 출력해줍니다.

내가 Tests탭에 작성해놓은 Script의 검증이 통과했으면 PASS, 실패했으면 Fail로 결과로 출력되어

시나리오 테스트 결과를 한눈에 확인이 가능합니다.

 

 

마무리

내가 운영하는 서비스에 시나리오 테스트가 없다면 매번 배포를 진행 한뒤에 일일이 검증을 진행해야해서 개발자의 리소스가 많이 소모되게 됩니다.

운영하는 서비스의 규모가 커질수록 소모되는 리소스가 더 커지게 될텐데요.
시나리오 테스트를 통해 휴먼에러도 줄이고 검증을 위한 피로도를 줄여 즐거운 개발 할 수 있으면 좋겠습니다. 감사합니다!

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함