가이드 개발 가이드

좋은 삶은 시험에서 시작된다

자동 테스트 케이스를 작성하지 않는 프로그래머는 좋은 테스트 엔지니어가 아닙니다. 우리는 모든 프로젝트가 처음부터 완전한 자동화된 테스트 사례를 구축할 것을 권장합니다. 프로젝트의 개발과 함께 초기 투자는 수백 배의 보상을 받게 됩니다.

이전 섹션의 예제를 계속해서 fibjs를 사용하여 테스트 케이스를 작성하는 방법을 살펴보겠습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
const http = require('http'); const path = require('path'); var hello_server = { '/:name(fibjs.*)': (req, name) => { req.response.write('hello, ' + name + '. I love you.'); }, '/:name': (req, name) => { req.response.write('hello, ' + name); } }; var root_server = { '/hello': hello_server, '/bonjour': hello_server, '*': http.fileHandler(path.join(__dirname, 'web')) }; var svr = new http.Server(8080, root_server); svr.start();

빈 테스트 프레임

기본 테스트 프레임워크부터 시작하겠습니다.

1 2 3 4 5 6 7 8 9 10
var test = require('test'); test.setup(); describe('hello, test', () => { it('a empty test', () => { }); }); test.run();

test.js나중에 명령줄에 저장 fibjs test.js하면 기본 테스트 프레임워크가 작성된 다음 출력이 표시됩니다.

1 2 3 4
hello, test √ a empty test √ 1 tests completed (0ms)

테스트 서버 시작

http 서버를 테스트해야 하기 때문에 먼저 서버를 시작해야 합니다. 테스트 케이스는 서버에 요청을 보낸 다음 요청 결과를 테스트하여 서버가 요구 사항을 충족하는지 확인합니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14
var test = require('test'); test.setup(); var http = require('http'); describe('hello, test', () => { it('hello, fibjs', () => { var r = http.get('http://127.0.0.1:8080/hello/fibjs'); assert.equal(r.statusCode, 200); assert.equal(r.data.toString(), 'hello, fibjs. I love you.'); }); }); test.run();

이 코드에서는 http.get의 결과가 우리가 기대한 결과인지 확인하여 서버 로직이 정상인지 판단합니다. 이 예에 따르면 테스트 세트를 빠르게 완료할 수 있으며 동시에 코드를 최적화했습니다.

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
var test = require('test'); test.setup(); var http = require('http'); function test_get(url, rep) { var r = http.get('http://127.0.0.1:8080' + url); assert.equal(r.statusCode, 200); assert.equal(r.data.toString(), rep); } describe('hello, test', () => { it('hello, fibjs', () => { test_get('/hello/fibjs', 'hello, fibjs. I love you.'); }); it('hello, fibjs*', () => { test_get('/hello/fibjs-great', 'hello, fibjs-great. I love you.'); }); it('hello, JavaScript', () => { test_get('/hello/JavaScript', 'hello, JavaScript'); }); it('hello, v8', () => { test_get('/hello/v8', 'hello, v8'); }); }); test.run();

사용 사례의 그룹 관리

bonjour 테스트를 추가해 봅시다. bonjour와 hello는 동일한 서비스 집합이지만 경로가 변경되었으므로 서비스의 정확성도 확인해야 합니다. 이번에는 사용 사례를 보다 잘 관리하기 위해 테스트 사례를 수행했습니다. hello와 bonjour의 테스트 내용이 동일하기 때문에 그룹화와 동시에 코드를 다시 최적화하고 동일한 코드 세트로 두 서비스 세트를 테스트했습니다.

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 31 32 33 34 35 36 37
var test = require('test'); test.setup(); var http = require('http'); function test_get(url, rep) { var r = http.get('http://127.0.0.1:8080' + url); assert.equal(r.statusCode, 200); assert.equal(r.data.toString(), rep); } describe('hello, test', () => { function test_hello(hello) { describe(hello + ' test', () => { it('fibjs', () => { test_get('/' + hello + '/fibjs', 'hello, fibjs. I love you.'); }); it('fibjs*', () => { test_get('/' + hello + '/fibjs-great', 'hello, fibjs-great. I love you.'); }); it('JavaScript', () => { test_get('/' + hello + '/JavaScript', 'hello, JavaScript'); }); it('v8', () => { test_get('/' + hello + '/v8', 'hello, v8'); }); }); } test_hello('hello'); test_hello('bonjour'); }); test.run();

유스 케이스 그룹화를 통해 테스트 결과를 보다 명확하게 볼 수 있으며 유스 케이스 그룹을 개별적으로 건너뛰고 테스트하기 쉽기 때문에 개발 및 테스트 속도가 빨라집니다. 다음은 이 테스트의 결과입니다.

1 2 3 4 5 6 7 8 9 10 11 12 13
hello, test hello test √ fibjs √ fibjs* √ JavaScript √ v8 bonjour test √ fibjs √ fibjs* √ JavaScript √ v8 √ 8 tests completed (3ms)

저희 서버 디자인에 따르면 정적 파일 서비스 세트도 있는데, 위의 예시에 따르면 테스트 케이스의 이 부분을 빠르게 작성하실 수 있을 거라 생각합니다.

원 클릭 테스트

위의 소개 후에 테스트 케이스를 빠르게 설정할 수 있습니다. 그러나 이 테스트 스크립트를 사용하려면 먼저 서버를 시작해야 합니다. 이것은 매우 쉽습니다 test.js. 직접 테스트를 완료 하기 위해 실행하고 싶습니다 . 다음 코드를 사용하여 달성할 수 있습니다.

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 31 32 33 34 35 36 37 38 39 40 41 42 43
var test = require('test'); test.setup(); var http = require('http'); var coroutine = require('coroutine'); coroutine.start(() => { run('./main.js'); }); coroutine.sleep(100); function test_get(url, rep) { var r = http.get('http://127.0.0.1:8080' + url); assert.equal(r.statusCode, 200); assert.equal(r.data.toString(), rep); } describe('hello, test', () => { function test_hello(hello) { describe(hello + ' test', () => { it('fibjs', () => { test_get('/' + hello + '/fibjs', 'hello, fibjs. I love you.'); }); it('fibjs*', () => { test_get('/' + hello + '/fibjs-great', 'hello, fibjs-great. I love you.'); }); it('JavaScript', () => { test_get('/' + hello + '/JavaScript', 'hello, JavaScript'); }); it('v8', () => { test_get('/' + hello + '/v8', 'hello, v8'); }); }); } test_hello('hello'); test_hello('bonjour'); }); process.exit(test.run());

이 코드의 6~10행에 단락 시작 main.js코드를 추가 하고 조금 기다렸다가 테스트를 다시 시작합니다.

코드 커버리지 확인

좋은 테스트 케이스는 테스트 케이스가 비즈니스의 모든 지점을 커버해야 비즈니스가 올바르게 실행되는지 확인해야 하며, 이때 코드 커버리지 검사를 사용하여 테스트가 완료되었는지 확인할 수 있습니다.

이 프로세스는 매우 간단합니다. 테스트할 때 --cov 매개변수를 추가하기만 하면 됩니다.

1
fibjs --cov test

테스트가 완료되면 현재 디렉토리에 fibjs-xxxx.lcov의 로그 파일이 생성되는데, 이때 로그를 분석하고 보고서를 생성해야 합니다.

1
fibjs --cov-process fibjs-xxxx.lcov out

그런 다음 out 디렉토리에서 분석 보고서 세트를 생성할 수 있습니다. 확인할 카탈로그를 입력하면 다음 페이지 코브 를 볼 수 있습니다 main.js. 코드 커버리지가 100%에 도달 했음을 알 수 있습니다 . 이는 테스트가 비즈니스 로직을 완전히 커버한다는 것을 의미합니다. 클릭하시면 main.js더 자세한 보고서를 보실 수 있습니다.

👉 [ 퍼포먼스 킬러 찾기 ]