[스터디] 리팩터링_chapter 4_테스트 구축하기

김하은·2024년 5월 16일
0

스터디

목록 보기
21/23

4장에서는 테스트를 작성하는 방법 보다는 테스트를 작성했을 때 효율이 좋아지는 이유에 대해 이야기 하고 있다.

자가 테스트 코드의 가치

모든 테스트를 완전히 자동화하고 그 결과까지 스스로 검사하게 만들자.

  • 자가 테스트: 프로그램이 제대로 된 값을 출력했는지 사람이 직접 확인하는 것이 아닌 컴퓨터가 확인하는 것
  • 버그를 찾는 강력한 도구
    1. 자가 테스트 코드
    2. 테스트를 자주 수행하는 습관(예를 들면 컴파일할 때 테스트도 함께하기)
  • 테스트 주도 개발(Test-Driven Development, TDD)
    • 테스트-코딩-리팩터링 과정으로
    • 테스트 작성, 테스트를 통과하게끔 코드를 작성, 결과 코드를 최대한 깔끔하게 리팩터링하는 과정을 짧은 주기로 반복함

테스트할 샘플 코드

  • 책에서 제시된 코드 중 저자는 set production()이 계산 결과를 지역 데이터(_province)에 갱신하는 코드가 지저분 해서 리팩터링을 하려고 한다.
  • 이때 리팩터링하기 전에 먼저 테스트를 작성해야 한다.
class Producer {
  constructor(aProvince, data) {
    this._province = aProvince;
    this._name = data.name;
    this._cost = data.cost;
    this._production = data.production || 0;
  }
  get name() {
    return this._name;
  }
  get cost() {
    return this._cost;
  }
  set cost(arg) {
    this._cost = parseInt(arg);
  }
  get production() {
    return this._production;
  }
  set production(amountStr) { // 이부분 이다.
    const amount = parseInt(amountStr);
    const newProduction = Number.isNaN(amount) ? 0 : amount;

    this._province.totalProduction += newProduction - this.production;
    this._production = newProduction;
  }
}

첫 번째 테스트

  • 모카(Mocha): Node.js에서 사용하는 대표적인 테스트 프레임워크
  • 모카를 이용해서 테스트 예시를 보여주고 있다.
  • 픽스처(fixture)
    • 픽스처는 테스트를 실행하기 위해 필요한 데이터와 객체의 고정된 상태를 의미함
    • 테스트를 수행하기 위해서는 테스트 대상 코드에 대한 입력 데이터와 초기 상태가 필요한데 이러한 입력 데이터와 초기 상태를 픽스처라고 함
    • 픽스처는 테스트 코드가 실행될 때마다 동일한 초기 상태에서 시작할 수 있도록 함
    • 이를 통해 테스트 결과의 일관성과 재현성을 보장할 수 있음
  • 먼저, 생산 부족분을 제대로 계산하는지 확인 하는 테스트는 다음과 같다.
import { Province, sampleProvinceData } from './index.js';
import assert from 'assert';

// Mocha에서는 'describe' 함수를 사용하여 테스트 그룹을 정의함
// 첫 번째 인자: 테스트 그룹의 이름, 두 번째 인자: 테스트 그룹을 정의하는 콜백 함수
describe('province', function () {
  // Mocha에서는 'it' 함수를 사용하여 개별 테스트 케이스를 정의함
  // 첫 번째 인자는: 테스트 케이스의 이름, 두 번째 인자: 테스트 케이스를 정의하는 콜백 함수
  it('shortfall', function () {
    // 1. 픽스처 설정
    // 여기서는 'Province' 클래스의 인스턴스 'asia'를 생성함
    const asia = new Province(sampleProvinceData());

    // 2. 검증
    // Mocha에서는 'assert' 모듈을 사용하여 검증 로직을 작성함
    // 여기서는 'assert.equal' 함수를 사용하여 'asia.shortfall' 값이 5인지 검증함
    assert.equal(asia.shortfall, 5);
  });
});
  • 실행하면 다음과 같이 아주 간결한 피드백을 보여준다.
  • 일부러 코드에 오류를 주입해서 테스트가 실패하는 모습도 직접 확인해 보아야 한다.
  get shortfall() {
    return this.demand - this.totalProduction * 2; // 오류 주입
  }

자주 테스트하라. 작성 중인 코드는 최소한 몇 분 간격으로 테스트하고, 적어도 하루에 한 번은 전체 테스트를 돌려보자.

테스트 추가하기

테스트는 위험 요인을 중심으로 작성해야 한다!
완벽하게 만드느라 테스트를 수행하지 못하느니, 불완전한 테스트라도 작성해 실행하는 게 낫다.

기대값을 구하는 방법

  • 초기 픽스터로부터 총수익이 제대로 계산되는지 검사하는 코드를 작성하면 다음과 같다.
import { Province, sampleProvinceData } from './index.js';
import assert from 'assert';

describe('province', function () {
  it('shortfall', function () {
    const asia = new Province(sampleProvinceData());
    assert.equal(asia.shortfall, 5);
  });
  it('profit', function() {
    const asia = new Province(sampleProvinceData());
    expect(asia.profit).equal(230)
});
  • 이 때 기대값 230을 구하는 방식은 다음과 같다.
    • 임의의 값인 임시 값을 설정 -> 코드를 실행시켜 나온 실제 값(230)으로 대체 -> 오류를 심기 -> 실제 값으로 되돌리기

beforeEach 구문을 이용해서 픽스처 만들기

  • 똑같은 픽스처를 설정하면 중복
  • beforeEach구문을 이용하면 '테스트끼리 상호작용하게 하는 공유 픽스처'를 생성하지 않을 수 있다.
profile
아이디어와 구현을 좋아합니다!

0개의 댓글