가이드 개발 가이드

좋은 삶은 테스트에서 시작됩니다

자동 테스트 케이스를 작성하지 않는 프로그래머는 좋은 테스트 엔지니어가 아닙니다. 우리는 모든 프로젝트가 처음에 완전한 자동화 된 테스트 케이스를 설정하도록 권장합니다. 프로젝트 개발과 함께 초기 투자는 수백 번 보상받을 것입니다.

이전 섹션의 예제를 계속하고 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 디렉터리에 분석 보고서 세트를 생성 할 수 있습니다. 보려는 카탈로그를 입력하면 다음 페이지를 볼 수 있습니다.cov 보시다시피 main.js 의 코드 커버리지는 100 %에 도달하여 테스트가 비즈니스 로직을 완전히 포함하고 있음을 나타냅니다. 더 자세한 보고서를 보려면 main.js 더 클릭하십시오.

👉 [ 성능 킬러 찾기 ]