Mocha 및 Chai로 Node.js 코드 테스트

개요

단위 테스트 작성은 초보자와 노련한 엔지니어 모두 일반적으로 개발 후반부로 미루는 작업이지만 안정적이고 강력한 소프트웨어 개발의 핵심입니다.

의 기본 전제 테스트 주도 개발(TDD) 코딩을 시작하기도 전에 테스트를 작성하고 있습니다. 이는 달성하기 좋은 목표이지만, 해당 원칙을 따르려면 많은 규율과 계획이 필요합니다! 이 전체 프로세스를 훨씬 쉽게 만들려면 다음과 같은 사용하기 쉽고 강력한 테스트 및 어설션 프레임워크를 사용할 수 있습니다. 모카차이 티.

이 기사에서는 이 두 라이브러리를 소개하는 것으로 시작한 다음, 두 라이브러리를 함께 사용하여 읽기 쉽고 기능적인 단위 테스트를 빠르게 만드는 방법을 보여줍니다.

차이 티

Chai는 다음과 같은 두 가지 기능을 모두 제공하는 어설션 라이브러리입니다. BDD(행동 중심 개발)TDD(테스트 중심 개발) 테스트 코드를 위한 프로그래밍 스타일이며, 테스트를 구성할 수 있는 테스트 라이브러리와 짝을 이루도록 되어 있습니다. Mocha와 매우 일반적으로 결합됩니다.

여기에는 세 가지 주요 API가 있습니다.

  • should
  • expect
  • assert

var.should.equal(var2)


expect.var.to.be.equal(var2)


assert.equal(var1, var2)

이 글 전체에서 우리는 Chai의 expect 인터페이스이지만 자신의 직관에 따라 다른 인터페이스/스타일을 사용하는 것은 완벽하게 괜찮습니다. 그만큼 assert 인터페이스는 가장 유사한 일반적인 TDD 어설션 프레임워크입니다.

expect 매우 자연스러운 언어 API를 사용하여 어설션을 작성하므로 나중에 테스트를 더 쉽게 작성하고 개선할 수 있습니다. 이는 getter를 함께 연결하여 어설션을 생성하고 실행함으로써 수행되며 요구 사항을 코드로 더 쉽게 변환할 수 있습니다.

let user = {name: 'Scott'};


expect(user).to.have.property('name');

참고 : 자연 언어로 주장을 읽고 무슨 일이 일어나고 있는지 이해할 수 있는 방법을 알아보세요. 이것이 Chai와 같은 주장 라이브러리를 사용하는 주요 장점 중 하나입니다!

이러한 게터의 몇 가지 추가 예는 다음과 같습니다.

  • to
  • be
  • is
  • and
  • has
  • have

이러한 게터 중 상당수는 함께 연결되어 다음과 같은 어설션 메서드와 함께 사용될 수 있습니다. true, ok, existempty 단 한 줄로 복잡한 어설션을 만들려면 다음을 수행하세요.

"use strict";

const expect = require('chai').expect;


expect({}).to.exist;
expect(26).to.equal(26);
expect(false).to.be.false;
expect('hello').to.be.string;


expect([1, 2, 3]).to.not.be.empty;


expect([1, 2, 3]).to.have.length.of.at.least(3);

참고 : 사용 가능한 방법의 전체 목록을 찾을 수 있습니다. 여기에서 지금 확인해 보세요..

사용 가능한 목록을 확인해 볼 수도 있습니다. 플러그인 차이에게. 이를 통해 더 복잡한 기능을 훨씬 쉽게 테스트할 수 있습니다.

받아 차이-http 예를 들어 서버 경로를 테스트하는 데 도움이 되는 플러그인은 다음과 같습니다.

"use strict";

const chai = require('chai');
const chaiHttp = require('chai-http');

chai.use(chaiHttp);

chai.request(app)
    .put('/api/auth')
    .send({username: '[email protected]', password: 'abc123'})
    .end(function(err, res) {
        expect(err).to.be.null;
        expect(res).to.have.status(200);
    });

Mocha를 사용하여 테스트 케이스 구성 – explain() 및 it()

Mocha는 비동기(또는 동기) 코드를 직렬로 실행할 수 있는 유연성을 제공하는 Node용 테스트 프레임워크입니다. 포착되지 않은 모든 예외는 발생한 테스트 사례와 함께 표시되므로 실패한 항목과 이유를 쉽게 식별할 수 있습니다.

Mocha를 전역적으로 설치하는 것이 좋습니다.

$ npm install mocha -g

이후 전역 설치가 되기를 원할 것입니다. mocha 명령은 로컬 디렉터리의 프로젝트에 대한 테스트를 실행하는 데 사용됩니다.

이 코드 조각은 무엇을 합니까?

it() X를 반환해야 합니다. it() 테스트 케이스를 정의하고 Mocha는 각각을 실행합니다. it() 단위 테스트로. 여러 단위 테스트를 구성하기 위해 다음을 수행할 수 있습니다. describe() 공통 기능이므로 Mocha 테스트를 구성합니다.

이는 아마도 구체적인 예를 통해 가장 잘 설명될 수 있습니다.

"use strict";
const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });
    });
});

. describe() 메서드를 정의했습니다. 테스트 이름라는 #abs(). 이름으로 개별적으로 테스트를 실행할 수도 있습니다. 이에 대해서는 나중에 다루겠습니다.

참고 : Mocha 테스트를 사용하면 그럴 필요가 없습니다. require() Mocha 방법 중 하나. 이러한 메소드는 다음과 함께 실행될 때 전역적으로 제공됩니다. mocha 명령.

이러한 테스트를 실행하려면 파일을 저장하고 mocha 명령:

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given number 


  1 passing (9ms)

출력은 실행된 테스트와 그 결과에 대한 분석입니다. 중첩된 방법에 주목하세요. describe() 호출은 결과 출력으로 이어집니다. 특정 메서드나 기능에 대한 모든 테스트를 함께 중첩하는 것이 유용합니다.

이러한 방법은 Mocha 테스트 프레임워크의 기초입니다. 이를 사용하여 원하는 대로 테스트를 구성하고 구성할 수 있습니다. 다음 섹션에서 이에 대한 한 가지 예를 살펴보겠습니다.

Mocha와 Chai로 테스트 작성하기

프로젝트 내에서 테스트를 구성하는 데 권장되는 방법은 모든 테스트를 자체적으로 배치하는 것입니다. /test 예배 규칙서. 기본적으로 Mocha는 glob을 사용하여 단위 테스트를 확인합니다. ./test/*.js./test/*.coffee. 거기에서 다음을 호출하는 모든 파일을 로드하고 실행합니다. describe() 방법.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

테스트 파일 뒤에 다음을 붙이는 것이 일반적입니다. .test.js Mocha 테스트가 포함된 소스 파일의 경우:

├── package.json
├── lib
│   ├── db.js
│   ├── models.js
│   └── util.js
└── test
    ├── db.test.js
    ├── models.test.js
    ├── util.test.js
    └── util.js

util.js FBI 증오 범죄 보고서 test 디렉토리에는 단위 테스트가 포함되지 않으며 테스트에 도움이 되는 유틸리티 기능만 포함됩니다.

주의 사항: 당신에게 적합한 구조는 무엇이든 사용할 수 있으며, 단위 테스트는 자동으로 선택됩니다.

실제로 테스트를 작성할 때 다음을 사용하여 구성하는 것이 도움이 됩니다. describe() 행동 양식. 기능, 기능, 파일 또는 기타 임의 수준별로 구성할 수 있습니다. 예를 들어, 기능 수준의 작동을 설명하기 위해 구성된 테스트 파일은 다음과 같습니다.

"use strict";

const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });

        it('should return positive value of given positive number', function() {
            expect(Math.abs(3)).to.be.equal(3);
        });

        it('should return 0 given 0', function() {
            expect(Math.abs(0)).to.be.equal(0);
        });
    });
});

테스트를 실행하면 다음과 같은 출력이 제공됩니다.

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 


  3 passing (11ms)

더욱 확장하면 단일 파일에서 여러 메서드에 대한 테스트를 수행할 수도 있습니다. 이 경우 메소드는 다음과 같이 그룹화됩니다. Math 목적:

"use strict";

const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });

        it('should return positive value of given positive number', function() {
            expect(Math.abs(3)).to.be.equal(3);
        });

        it('should return 0 given 0', function() {
            expect(Math.abs(0)).to.be.equal(0);
        });
    });

    describe('#sqrt()', function() {
        it('should return the square root of a given positive number', function() {
            expect(Math.sqrt(25)).to.be.equal(5);
        });

        it('should return NaN for a given negative number', function() {
            expect(Math.sqrt(-9)).to.be.NaN;
        });

        it('should return 0 given 0', function() {
            expect(Math.sqrt(0)).to.be.equal(0);
        });
    });
});

결과 :

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  6 passing (10ms)

모카 후크 - before(), after(), beforeEach() 및 afterEach()

물론 대부분의 단위 테스트는 이렇게 간단하지 않습니다. 테스트를 수행하려면 데이터베이스나 기타 외부 리소스(또는 이들의 모의/스텁)와 같은 다른 리소스가 필요한 경우가 많습니다. 이를 설정하기 위해 다음 중 하나 이상을 사용할 수 있습니다. 모카훅 방법 :

  • before(): 주어진 블록의 모든 테스트 전에 실행됩니다.
  • beforeEach(): 주어진 블록의 각 테스트 전에 실행됩니다.
  • after(): 주어진 블록의 모든 테스트 후에 실행됩니다.
  • afterEach(): 주어진 블록의 각 테스트 후에 실행됩니다.

이러한 후크는 테스트에 필요한 설정 및 분해 작업을 수행하기 위한 완벽한 장소입니다. 일반적인 사용 사례 중 하나는 테스트를 실행하기 전에 데이터베이스에 대한 연결을 설정하는 것입니다.

"use strict";

const expect = require('chai').expect;
let User = require('../models').User;

describe('Users', function() {

    let database = null;

    before(function(done) {
        
    });

    afterEach(function(done) {
        
    });

    describe('#save()', function() {
        it('should save User data to database', function(done) {
            
        });
    });

    describe('#load()', function() {
        it('should load User data from database', function(done) {
            
        });
    });
});

어떤 테스트가 실행되면 함수가 우리에게 전송됩니다. before() 메서드가 실행되고(테스트 전체에서 한 번만 실행됨) 데이터베이스에 대한 연결이 설정됩니다. 이 작업이 완료되면 테스트 스위트가 실행됩니다.

한 테스트 스위트의 데이터가 다른 테스트에 영향을 미치는 것을 원하지 않기 때문에 각 스위트가 실행된 후에 데이터베이스에서 데이터를 지워야 합니다. 이것이 바로 afterEach() 입니다. 우리는 이 후크를 사용하여 이후 모든 데이터베이스 데이터를 지웁니다. 마다 테스트 케이스가 실행되었으므로 다음 테스트를 위해 깨끗한 상태에서 시작할 수 있습니다.

모카 테스트 실행

대부분의 경우 이 부분은 매우 간단합니다. 이미 Mocha를 설치하고 프로젝트 디렉토리로 이동했다고 가정하면 대부분의 프로젝트에서는 mocha 테스트를 실행하기 위한 인수가 없는 명령:

$ mocha


  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  6 passing (10ms)

이는 Mocha에게 테스트 위치를 알릴 필요가 없었기 때문에 이전 예제와 약간 다릅니다. 이 예에서 테스트 코드는 예상 위치에 있습니다. /test.

그러나 테스트를 실행할 때 사용할 수 있는 몇 가지 유용한 옵션이 있습니다. 예를 들어, 테스트 중 일부가 실패하는 경우 변경할 때마다 전체 제품군을 실행하고 싶지 않을 것입니다. 일부 프로젝트의 경우 전체 테스트 모음을 완료하는 데 몇 분이 걸릴 수 있습니다. 실제로 테스트를 하나만 실행하면 되므로 시간이 많이 낭비됩니다.

이와 같은 경우에는 다음을 수행해야 합니다. 실행할 테스트를 Mocha에게 알려주기. 이 작업은 다음을 사용하여 수행할 수 있습니다. -g or -f 옵션을 제공합니다.

개별 테스트를 실행하려면 -g 플래그를 지정하고 실행하려는 테스트 사이에 공통 패턴을 추가합니다. 예를 들어, 다음을 실행하려는 경우 #sqrt() 테스트:

$ mocha -g sqrt

  Math
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  3 passing (10ms)

있음을 주목하라 #abs() 이번 실행에는 테스트가 포함되지 않았습니다. 테스트 이름에 따라 계획을 세울 경우 이 옵션을 사용하여 테스트의 특정 섹션만 실행할 수 있습니다.

그러나 이것이 유일한 유용한 옵션은 아닙니다. 다음은 확인하고 싶은 Mocha의 몇 가지 추가 옵션입니다.

  • --invert: 반전 -g-f 성냥
  • --recursive: 하위 디렉터리 포함
  • --harmony: Node의 모든 하모니 기능을 활성화합니다.

주의 사항: 전체 옵션 목록은 mocha -h 명령 또는 이 페이지.

자세한 내용은 어디서 알아볼 수 있나요? 이 주제에 대해서는 짧은 기사에서 다룰 수 있는 것보다 훨씬 더 많은 내용이 있으므로 더 자세히 알아보고 싶다면 공식 문서를 확인하는 것이 좋습니다. 모카차이 티 선적 서류 비치.

결론

Mocha와 Chai는 라이브러리, 명령줄 도구, 웹사이트 등 거의 모든 유형의 Node 프로젝트를 테스트하는 데 사용할 수 있습니다. 사용 가능한 다양한 옵션과 플러그인을 활용하면 테스트 요구 사항을 매우 쉽게 충족할 수 있습니다. 이러한 각 라이브러리는 코드 유효성을 검사하는 데 매우 유용하며 거의 모든 Node 프로젝트에서 사용해야 합니다.

이것이 Mocha와 Chai에 대한 유용한 소개가 되었기를 바랍니다. 여기에 제시한 것보다 배울 것이 더 많으므로 자세한 내용은 문서를 확인하세요.

타임 스탬프 :

더보기 스택카부스