본문 바로가기

개발자의 logs

11주차 WIL - 안된다면 또 다시 / TDD 본문

개발자 학습노트/* 학습일기*

11주차 WIL - 안된다면 또 다시 / TDD

주인장v 2022. 7. 24. 11:15
 
 

 

 

 
 
좋은아침! 

 

 

 
이제 11주차 WIL이다 . 생각보다 항해99에서 WIL을 작성할 수 있는 시간이 얼마 남지 않았음을 느끼게 된다
 
실전프로젝트 상황에 대해 얘기하자면, 이번주 금요일이 프로덕트 출시날인데 아직 출시한 조는 없는 걸로 알고있다.
역시 완제품을 만들기란  생각보다 어려운게 아닐까 생각이 든다 ㅎㅎ
 
일당백 1조는 여전히 스스로를 불태워 속도를 내고있다. 잡담시간도 우리에게는 사치! 
 
백엔드 2명(나포함) 프론트가 요청하는 추가적인 기능개발을 하면서 리팩토링, 주석달기를 진행했었다. 현재는 TDD 파트에 들어와있다. 

 

 
일당백 1조..참고로 모두 남자다.
 

 

 
TDD는 통합테스트만 완료한 상태였었다. 그리고

 

사실 전 기수들것들을 보니 TDD에 생각보다 집중하지 않은 것처럼 보여서  넣지 않아도 되지 않을까 생각했지만 ,
 
담당 매니저 *구름*님의 조언대로 끝까지 작성해보기로 했다. 
 
 
 
현재 내가 직면하고 있는 문제가 뭐냐고 누가 묻는다면 TDD(Test Driven Development) 다. 
 
 

 

TDD란?

 

 

 

TDD란 Test Driven Development의 약자로 ‘테스트 주도 개발’이라고 한다.

 

반복 테스트를 이용한 소프트웨어 방법론으로 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다.

 

짧은 개발 주기의 반복에 의존하는 개발 프로세스이며, 애자일 방법론 중 하나인 eXtream Programming(XP)의 ‘Test-First’ 개념에 기반을 둔 단순한 설계를 중요시한다.

 

이 기법을 개발했거나 ‘재발견’한 것으로 인정되는 Kent Beck은 2003년 TDD가 단순한 설계를 장려하고 자신감을 불어넣어 준다고 말하였다.

 


 

Supertest와 Jest를 활용해서 유닛테스트, 통합테스트를 하고 있는데, 생각보다 그럴듯하거나 모든 경우의 수를 테스트하는 것이 어렵다.

 

로그인 한 상태에서 unit 테스트를 하는 부분이 특히 어려운데, token 을 발급받아 전역변수로 설정해놓고 테스트하고 있지만, 그 token이 만료되면 토큰을 다시 발급받아 전역변수로 넣는 방법을 쓰고있었다. (ㅋㅋ..웃지마세요 고수님들...)

 

 

이 부분은 아직 수련이 부족한 거라 생각하고, mocking 등을 공부하면서 좀 더 다양한 자료를 접하며 공부하고 있다. 

 

 

현재 내가 짠 코드는 이렇다

 

 

const userController = require('../../server/controller/users');
const {
  validatePassword,
} = require('../../server/controller/util/password-validation');
const request = require('supertest');
const app = require('../../app');

const TOKEN =
  'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyRW1haWwiOiJ0ZXN0QHRlc3QuY29tIiwiaWF0IjoxNjU4NDE0MjMwLCJleHAiOjE2NTg0MTc4MzB9.LsZQD_J7yhZ-CDcWBMrBDJprqQoE15mCZyudDeZu67o';

test(`비밀번호를 입력했을때
          password와 passwordConfirm가 일치할 때,
          true를 반환한다.`, () => {
  expect(validatePassword('aaAA11!@', 'aaAA11!@')).toEqual(true);
  expect(validatePassword('aaaaaAAAAA!@#$%^', 'aaaaaAAAAA!@#$%^')).toEqual(
    true
  );
});

test('비밀번호를 입력했을때 password와 passwordcheck가 일치하지 않으면 false를 반환한다.', () => {
  expect(validatePassword('aaAA11!@', 'aaAA11!@aaAA11!@')).toEqual(false);
  expect(validatePassword('aaAA11!@', 'aaAA11!@#')).toEqual(false);
  expect(validatePassword('aaAA11!@', 'aaaaabbb')).toEqual(false);
});

describe('user Controller 함수 테스트', () => {
  it('should have a user signup function', () => {
    expect(typeof userController.signup).toBe('function');
  });
  it('should have a user emailFirst function', () => {
    expect(typeof userController.emailFirst).toBe('function');
  });
  it('should have a user passwordSecond function', () => {
    expect(typeof userController.passwordSecond).toBe('function');
  });
  it('should have a user deleteUser function', () => {
    expect(typeof userController.deleteUser).toBe('function');
  });
  it('should have a user searchUser function', () => {
    expect(typeof userController.searchUser).toBe('function');
  });
  it('should have a user mailing function', () => {
    expect(typeof userController.mailing).toBe('function');
  });
});

//===============회원가입======================
describe('POST /api/signup 회원가입', function () {
  test('조건에 맞다면 회원가입 성공', function (done) {
    request(app)
      .post('/api/users/signup')
      .send({
        userEmail: 'email@email.com',
        userName: 'user',
        password: '123456',
        confirmPassword: '123456',
      })
      .expect(201, done);
  });

  test('비밀번호 조건이 틀리다면 에러 발생', async () => {
    const passInvalid = await request(app).post('/api/users/signup').send({
      userEmail: 'email@email.com',
      userName: 'user',
      password: '1234',
      confirmPassword: '1234',
    });
    expect(passInvalid.body.errorMessage).toBe(
      '비밀번호는 6글자 이상으로 입력해주세요.'
    );
  });

  test('닉네임 조건이 틀리다면 에러 발생', async () => {
    const passInvalid = await request(app).post('/api/users/signup').send({
      userEmail: 'email@email.com',
      userName: '여섯글자초과',
      password: '123456',
      confirmPassword: '123456',
    });
    expect(passInvalid.body.errorMessage).toBe(
      '닉네임은 5글자 이내로 입력해주세요.'
    );
  });
});
//===============이메일======================

// expect(res.body).toEqual('Post not found');
describe('POST /api/email', function () {
  test('이메일 조건이 맞다면 통과', async () => {
    const emailInvalid = await request(app).post('/api/users/email').send({
      userEmail: 'email@email.com',
    });
    expect(passInvalid.body.message).toBe('존재하는 유저입니다.');
  });
  test('이메일이 없다면 에러 발생', async () => {
    const emailInvalid = await request(app).post('/api/users/email').send({
      userEmail: 'email119@email.com',
    });
    expect(emailnvalid.body.message).toBe('존재하지 않는 유저입니다.');
  });
});

//===============최종 로그인======================

describe('POST /api/password', function () {
  test('이메일 비밀번호 맞다면 통과', async () => {
    const loginInvalid = await request(app).post('/api/users/password').send({
      userEmail: 'email@email.com',
      password: '123456',
    });
    expect(loginInvalid.body.message).toBe('존재하는 유저입니다.');
  });
  test('이메일이나 비밀번호가 없다면 에러 발생', async () => {
    const loginInvalid = await request(app).post('/api/users/password').send({
      userEmail: 'email@email.com',
    });
    expect(loginInvalid.body.errorMessage).toBe(
      'data and hash arguments required'
    );
  });
});

 

 

갑작스럽지만 끝...!

Comments