이 시리즈는 기본적으로 cucumber환경세팅이 되어있다는 가정하에 진행됩니다.

오늘은 로그인에 대해 시나리오를 작성해봅니다.
먼저 feature/로그인.feature 파일을 만듭니다.

기능: 부릉 로그인

올바른 부릉 아이디와 비밀번호를 입력하면 로그인에 성공한다
부릉 아이디와 비밀번호가 올바르지 않다면 로그인에 실패한다

시나리오 개요: 부릉 아이디로 로그인을 성공한다

   조건 <아이디> / <비밀번호> 계정으로 부릉에 로그인하면
   그러면 부릉 로그인이 성공한다

       예:
           |  아이디 |비밀번호|
           |meshkorea|12345678|
           |  admin  |12345678|

시나리오: 부릉 아이디로 로그인을 실패한다

   조건 meshkorea / wrong-password 계정으로 부릉에 로그인하면
   그러면 부릉 로그인이 실패한다

로그인의 성공과 실패의 시나리오를 작성했습니다. 로그인 성공은 시나리오 개요(Scenario Output)을 통해 예문의 2개 예시를 활용할 거고요, 실패는 그냥 문자열을 바로 넣어 처리하겠습니다.

그리고 cucumber를 실행해봅니다.

$ yarn cucumber.js --language ko features/로그인.feature

그러면 오류가 발생합니다.

UUUUUU

Warnings:

1) Scenario: 부릉 아이디로 로그인을 성공한다 # features/로그인.feature:11
   ? 조건meshkorea / 123456789 계정으로 부릉에 로그인하면
       Undefined. Implement with the following snippet:

         Given('meshkorea / {int} 계정으로 부릉에 로그인하면', function (int, callback) {
           // Write code here that turns the phrase above into concrete actions
           callback(null, 'pending');
         });

   ? 그러면부릉 로그인이 성공한다
       Undefined. Implement with the following snippet:

         Then('부릉 로그인이 성공한다', function (callback) {
           // Write code here that turns the phrase above into concrete actions
           callback(null, 'pending');
         });


2) Scenario: 부릉 아이디로 로그인을 성공한다 # features/로그인.feature:12
   ? 조건admin / 123456789 계정으로 부릉에 로그인하면
       Undefined. Implement with the following snippet:

         Given('admin / {int} 계정으로 부릉에 로그인하면', function (callback) {
           // Write code here that turns the phrase above into concrete actions
           callback(null, 'pending');
         });

   ? 그러면부릉 로그인이 성공한다
       Undefined. Implement with the following snippet:

         Then('부릉 로그인이 성공한다', function (callback) {
           // Write code here that turns the phrase above into concrete actions
           callback(null, 'pending');
         });


3) Scenario: 부릉 아이디로 로그인을 실패한다 # features/로그인.feature:14
   ? 조건meshkorea / wrong-password 계정으로 부릉에 로그인하면
       Undefined. Implement with the following snippet:

         Given('meshkorea / wrong-password 계정으로 부릉에 로그인하면', function (callback) {
           // Write code here that turns the phrase above into concrete actions
           callback(null, 'pending');
         });

   ? 그러면부릉 로그인이 실패한다
       Undefined. Implement with the following snippet:

         Then('부릉 로그인이 실패한다', function (callback) {
           // Write code here that turns the phrase above into concrete actions
           callback(null, 'pending');
         });

3 scenarios (3 undefined)
6 steps (6 undefined)
0m00.000s

오류를 해결하기 위해 steps/login.steps.js를 작성합니다.

const { defineSupportCode } = require("cucumber");
const { expect } = require("chai");
const api = require("../api");

defineSupportCode(function({ Given, Then, When }) {
  Given(/^(.+) \/ (.+) 계정으로 부릉에 로그인하면$/, function(
    username,
    password,
    callback
  ) {
    api
      .login({ grant_type: "password", username: username, password: password })
      .then(res => {
        this.vroongToken = res.access_token;
        callback();
      })
      .catch(error => {
        this.vroongToken = null;
        callback();
      });
  });

  Then("부릉 로그인이 성공한다", function(callback) {
    expect(this.vroongToken).to.be.not.null;
    callback();
  });

  Then("부릉 로그인이 실패한다", function(callback) {
    expect(this.vroongToken).to.be.null;
    callback();
  });
});

Api는 어디서 나왔을까요?
api.js 를 생성해서 아래와 같이 작성해줍니다.

const hostname = "https://localhost:8000";
const request = require("superagent");

module.exports = {
  login: function(account) {
    return request
      .post(`${hostname}/login`)
      .set("Authorization", "Basic STRING")
      .set("Content-Type", "application/x-www-form-urlencoded")
      .send(account)
      .then(res => res.body);
  }
};

그리고 다시 cucumber를 실행하면

...
3 scenarios (3 passed)
6 steps (6 passed)

시나리오대로 테스트가 끝났습니다.