[테스트] Mocha
테스트를 하는 이유
- 매번 어떠한 유스 케이스 경우마다 코드를 수동으로 '재실행'하면서 확인하는 것은 비효율 적이다.
- 항상 수많은 유스 케이스를 생각하면서 코드를 수정하는 것은 거의 불가능하다.
테스팅 자동화는 테스트 코드가 실제 동작에 관여하는 코드와 별개로 작성되었을 때 가능합니다.
Behavior Driven Development(행위주도개발)
BDD는 개발을 하기 전 명세서(스펙)을 먼저 작성하고 난 후에 구현을 하는 개발 방식입니다. 명세서(스펙)은 테스트를 위해 만들어진 산출물을 의미합니다. 스펙의 용도는 다음과 같습니다.
1. 테스트 – 함수가 의도하는 동작을 제대로 수행하고 있는지 보장함
2. 문서 – 함수가 어떤 동작을 수행하고 있는지 설명해줌. describe와 it에 설명이 들어감
3. 예시 – 실제 동작하는 예시를 이용해 함수를 어떻게 사용할 수 있는지 알려줌
구현이 종료된 시점에는 스펙과 코드 둘 다를 확보할 수 있습니다. BDD에서 아래는 pow함수에 대한 스펙이다.
describe("pow", function() {
it("주어진 숫자의 n 제곱", function() {
assert.equal(pow(2, 3), 8);
});
});
describe("title", function() { ... })
테스트하고자 하는 기능에 대한 설명(ex, 함수명)과 테스트의 세부 내용들을 인자로 갖는다.
it("유스 케이스 설명", function() { ... })
특정 유스 케이스에 대한 설명과 실제 테스트 함수를 인자로 갖는다.
it 대신 it.only를 사용하면 원하는 테스트만 실행 가능
describe("TEST", function() { it("test1", function() { // code... }); // Mocha는 아래 블록만 실행합니다. it.only("test2", function() { // code... }); it("test3", function() { // code... }); });
assert.equal(value1, value2)
테스트과정에서 쓰이는 함수중 하나로 구현한 함수의 실행값과 기대값이 같은지 확인한다.
다양한 assertion
assert.isNaN(value) => NaN 확인
assert.equal(value1, value2) => value1 == value2 확인
assert.strictEqual(value1, value2) – value1 === value2 확인
assert.notEqual, assert.notStrictEqual – 비 동등성, 비 일치성 확인
assert.isTrue(value) – value === true 확인
assert.isFalse(value) – value === false 확인
개발 순서
- 명세서 초안 작성(+ 기본적인 테스트 포함)
- 코드 작성
- 테스트 프레임워크(ex, Mocha)를 통한 테스트 및 코드 수정
- 모든 테스트 통과
- 명세서에서 고려하지 못한 유스케이스 추가
- 3~5단계 반복
테스트 프레임워크
Mocha – 핵심 테스트 프레임워크로, describe, it과 같은 테스팅 함수와 테스트 실행 관련 주요 함수를 제공합니다.
Chai – 다양한 assertion을 제공해 주는 라이브러리입니다. (ex, assert.equal)
Sinon – 함수의 정보를 캐내는 데 사용되는 라이브러리로, 내장 함수 등을 모방합니다.
<!DOCTYPE html>
<html>
<head>
<!-- 결과 출력에 사용되는 mocha css를 불러옵니다. -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.css">
<!-- Mocha 프레임워크 코드 load -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.js"></script>
<script>
mocha.setup('bdd'); // 기본 셋업
</script>
<!-- chai 프레임워크 코드 load -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.js"></script>
<script>
// chai의 다양한 기능 중, assert를 전역에 선언합니다.
let assert = chai.assert;
</script>
</head>
<body>
<script>
// 실제 테스트할 코드 작성
function pow(x, n) {
// To Do ...
}
</script>
<!-- 테스트(describe, it...)가 있는 스크립트를 불러옵니다. -->
<script src="test.js"></script>
<!-- Mocha 실행 결과가 출력됨 -->
<div id="mocha"></div>
<script>
mocha.run(); // 테스트 실행
</script>
</body>
</html>
before/after와 beforeEach/afterEach
before/after는 전체 테스트(describe)에 적용되는 것이고 beforeEach/afterEach는 단일 테스트(it)에 적용된다.describe("test", function() { before(() => alert("테스트를 시작합니다 - 테스트가 시작되기 전")); after(() => alert("테스트를 종료합니다 - 테스트가 종료된 후")); beforeEach(() => alert("단일 테스트를 시작합니다 - 각 테스트 시작 전")); afterEach(() => alert("단일 테스트를 종료합니다 - 각 테스트 종료 후")); it('test 1', () => alert(1)); it('test 2', () => alert(2)); });
보통 테스트 전 값을 초기화 하거나 테스트(테스트 그룹)가 바뀔 때마다 해줘야 하는 작업이 있을때 사용한다.(ex, 카운트 변수 0으로 설정)
테스트를 작성하려면 함수가 어떤 동작을 하는지, 입력값은 무엇이고 출력값은 무엇인지 정의하고 난 후에 구현을 시작합니다. 따라서 구현을 시작하는 순간부터 이미 좋은 아키텍처가 보장되고 일반적으로 개발 속도도 빨라지고 이전보다 코드를 더 안정적으로 작성할 수 있습니다.
Author And Source
이 문제에 관하여([테스트] Mocha), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tjdgus3160/테스트-자동화와-Mocha저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)