백엔드 Back-end/테스트 Test

frisby.js로 REST API 서버 테스트 하기

Tap to restart 2022. 6. 19. 18:00

frisby.js란?

"Frisby makes REST API testing easy, fast, and fun." - frisby.js 소개에서

"Frisby는 REST API 테스트를 쉽고, 빠르고 재미있게 만든다."

REST API 테스트용 라이브러리다. 

 

어떤 언어로 되어 있나?

자바스크립트 기반이고, 테스트를 실행하기 위해서 Jest를 사용한다. 테스트 코드 자체가 반복적이기 때문에 엄청 높은 수준의 자바스크립트 지식을 필요로 하지는 않는다. 자바 기반 스프링부트나 파이썬 기반 장고 등 다른 언어로 API 서버를 개발해도 쉽게 frisby.js로 테스트 코드를 짤 수 있다. 

 

언제 사용하는가?

API 서버를 테스트할 때 사용한다. Postman 같은 API 테스트 플랫폼과 같은 용도다. 

장점은 코드 기반이란 API 서버 코드 저장소에 함께 두고, 깃허브 액션을 활용해서 API 테스트를 통과해야지만 병합merge 되도록 할 수 있다. 그렇게 해서 API 서버의 최소한의 안정성을 확보할 수 있다. 

 

사용 방법은?

아래 공식 문서 예제처럼 간단하게 쓸 수 있다. 

(출처: frisby.js - A simple example)

const frisby = require('frisby');

it ('should return a status of 200', function () {
  return frisby
    .get('http://api.example.com')
    .expect('status', 200);
});

 

사이트에 나온 예제처럼 Joi를 활용해서 응답 JSON의 타입을 체크할 수도 있다. 

아래처럼 사용해볼 수 있다.

코드: Frisby.js - REST API Test

import frisby from 'frisby';

const BASE_URL = 'http://localhost:3000';

frisby.baseUrl(BASE_URL);

const { Joi } = frisby;

const userSchema = Joi.object({
  id: Joi.number(),
  email: Joi.string(),
  password: Joi.string(),
  is_active: Joi.boolean(),
});

const usersSchema = Joi.array().items(userSchema);

describe('Test /users', () => {
  const createUser = () => ({
    email: `test${new Date().getTime()}@taptorestart.com`,
    password: 'password',
  });

  beforeAll(async () => {
    frisby.globalSetup({
      request: {
        baseUrl: BASE_URL,
      },
    });
  });

  describe('POST /users', () => {
    context('with correct data', () => {
      it('responses user', async () => {
        const { json } = await frisby.post('/users', createUser())
          .expect('status', 201)
          .expect('jsonTypes', userSchema);
        console.log(json);
      });
    });
  });

  describe('GET /users', () => {
    context('with correct data', () => {
      it('responses users', async () => {
        const { json } = await frisby.get('/users')
          .expect('status', 200)
          .expect('jsonTypes', usersSchema);
        console.log(json);
      });
    });
  });
});

 

Webstorm 같은 IDE에서 실행하면 아래처럼 어떤 테스트 인지 쉽게 확인할 수 있게 나와서 좋다.

 

예를 들면 describe을 활용해서 누구나 쉽게 이해할 수 있게 쓸 수 있다.

"관리자가 아닌 사용자로 로그인을 해서"

"다른 사용자의 정보를 가져오기 위해서"

"GET /user/다른사용자id를 실행하면"

"403 Forbiddne 권한 없음 에러코드를 반환한다"

라고 테스트할 수 있다.

 

계속 써보니 Postman보다 편해서 Postman을 잘 안 쓰게 되었다. 

회사에서 공식적으로 쓰지 않더라도 본인 작업 테스트용으로 따로 구현해서 쓸만하다.

내가 작업한 API가 실제로도 잘 돌아갈 것이란 확신을 얻을 수 있으니까.