티스토리 뷰

해당 글은 github goldbergyoni 님의 javascript-testing-best-practices 를 번역하여 작성한 글 입니다. 번역 과정중 오류가 있을 수 있으니 댓글을 통해 피드백 주시면 감사하겠습니다.

Error를 catch 하지 말고 검증하라


일부 입력이 에러를 발생시키는 것을 검증할 때 try-catch-finally 문을 사용하여 catch 스코프에 들어왔을 때 assertion 을 수행하는 방법을 사용할 것입니다. 하지만 이는 테스트의 의도와 기대 결과를 쉽게 파악할 수 없게 만듭니다.

 

좀 더 우아한 대안은 테스트 프레임워크에서 제공하는 expect(method).to.thorw or expect(method).toThrow() 과 같은 one-line throw assertion 을 사용하는 것 입니다.

 

또한 필수적으로 예외에 오류 유형을 알려주는 속성이 포함되어 있는지 검증해야 합니다. 그렇지 않으면 오류가 발생했을 때 응용 프로그램은 사용자에게 에러 메세지를 출력하는 것 외에 추가로 할 수 있는 작업이 제한적이게 됩니다.

 

권장하지 않는 예제

try-catch 로 에러 발생을 테스트하는 긴 테스트 코드

it("When no product name, it throws error 400", async() => {
  let errorWeExceptFor = null;
  try {
    const result = await addNewProduct({name:'nest'});}
  catch (error) {
    expect(error.code).to.equal('InvalidInput');
    errorWeExceptFor = error;
  }
  expect(errorWeExceptFor).not.to.be.null;
  //if this assertion fails, the tests results/reports will only show
  //that some value is null, there won't be a word about a missing Exception
});

권장하는 예제

QA, PM 조차도 쉽게 요구사항을 이해할 수 있는 테스트 코드

it.only("When no product name, it throws error 400", async() => {
  expect(addNewProduct)).to.eventually.throw(AppError).with.property('code', "InvalidInput");
});

테스트에 태그를 달아라


각각의 테스트는 서로 다른 시나리오에 따라 수행되어야 합니다. quick smoke, IO 가 필요 없는 테스트, 개발자가 커밋을 하거나 파일을 저장했을 때 수행되는 테스트, PR 이 생성되었을 때 수행되는 end-to-end 테스트 등.

 

이러한 테스트들을 다음과 같은 #cold #api #sanity 키워드로 태깅하면 언제든지 필요한 카테고리의 테스트들만 선택하여 수행할 수 있습니다. 그렇지 않으면 개발자가 작은 부분을 수정함에도 수십개의 모든 테스트를 수행하게 되어 개발 생산성이 매우 떨어질 수 있습니다.

 

권장하는 예제

//this test is fast (no DB) and we're tagging it correspondigly
//now the user/CI can run it frequently
describe('Order service', function() {
  describe('Add new order #cold-test #sanity', function() {
    test('Scenario - no currency was supplied. Expectation - Use the default currency #sanity', function() {
      //code logic here
    });
  });
});

다른 일반적인 좋은 테스팅 팁


TDD 원칙을 배우고 연습하는 것을 권장합니다. red-green-refactor style 에서는 코드를 작성하기 전에 테스트를 작성하는 것이 중요한 원칙입니다. 각 테스트마다 발견할 수 있는 버그를 한 가지만 검사하도록 하고 이 버그가 발견되었을 때 테스트가 실패하도록 구성합니다.

 

그리고 먼저 우선적으로 테스트를 만족시키는 간단한 코드를 작성하여 모듈 개발을 시작한 뒤 점진적으로 리팩터링 하고 프로덕션 수준으로 발전시키며 개발합니다.

원문 자료


 

goldbergyoni/javascript-testing-best-practices

📗🌐 🚢 Comprehensive and exhaustive JavaScript & Node.js testing best practices (August 2019) - goldbergyoni/javascript-testing-best-practices

github.com

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함