test table

This commit is contained in:
monoid 2022-06-11 18:39:50 +09:00
parent 2d393515c4
commit d2cf8bdea4
2 changed files with 297 additions and 70 deletions

View File

@ -2,77 +2,98 @@
## 6.1 유닛 테스트(Unit test)
유닛 테스트로 69.6%의 Line Coverage와 73.4%의 Function Coverage를 달성했다.
다음과 같은 로그가 있다.
유닛 테스트로 63.7%의 Line Coverage와 67.5%의 Function Coverage를 달성했다.
### permission.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|permission.test|✅|14ms|
|permission empty|✅|16ms|
### session.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|Session : set |✅|14ms|
|Session : delete |✅|16ms|
|Login Handler : login with invalid format |✅|15ms|
|Login Handler : login with invalid password |✅|16ms|
|Login Handler : login |✅|15ms|
|Login Handler : logout with no session |✅|17ms|
|Login Handler : logout |✅|16ms|
|getSession|✅|15ms|
|getSession with invalid cookie|✅|15ms|
### user.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|user.createAdminUser|✅|5ms|
### filedoc.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|readDocFile|✅|12ms|
|readDocFile: not found|✅|15ms|
|readDocFile: invalid json|✅|15ms|
|saveDocFile|✅|15ms|
### methodHandle.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|methodHandle: basic methods|✅|14ms|
|methodHandle: not found|✅|15ms|
|methodHandle: options|✅|17ms|
### route.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|route: basic route|✅|6ms|
|route: double slash route|✅|12ms|
|route: double match|✅|16ms|
|route: test context|✅|15ms|
|route: test regex|✅|15ms|
|route: test not found|✅|2ms|
|route: encode_route|✅|12ms|
|route: router in router|✅|15ms|
### chunk.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|basic chunk operation : create chunk |✅|13ms|
|basic chunk operation : delete chunk |✅|15ms|
|basic chunk operation : modify chunk |✅|16ms|
|basic chunk operation : move chunk |✅|16ms|
|basic chunk operation : invalid chunk operation |✅|16ms|
|test chunk notification operation|✅|16ms|
|test chunk conflict|✅|15ms|
|test chunk conflict resolve with history|✅|32ms|
### doc.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|handleDocumentMethod|✅|5ms|
|handleTagMethod : setTag |✅|9ms|
|handleTagMethod : getTag |✅|16ms|
|handleTagMethod : conflict |✅|16ms|
### share.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|handleShareGetInfo|✅|16ms|
|handleShareDocMethod|✅|2ms|
|handleShareMethod with no existing share token|✅|12ms|
### server.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|server rpc test|✅|4s|
### fswatcher.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|WatchFilteredReadWriter|✅|79ms|
### readWriter.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|QueueReadWriter|✅|57ms|
### util.test.ts
| name | result | duration |
| ---- | ------ | -------- |
|watcher util isHidden|✅|5ms|
```
running 2 tests from ./src/auth/permission.test.ts
permission.test ... ok (8ms)
permission empty ... ok (16ms)
running 4 tests from ./src/auth/session.test.ts
Session ...
set ... ok (9ms)
delete ... ok (16ms)
ok (42ms)
Login Handler ...
login with invalid format ... ok (15ms)
login with invalid password ... ok (16ms)
login ... ok (16ms)
logout with no session ... ok (16ms)
logout ... ok (16ms)
ok (96ms)
getSession ... ok (16ms)
getSession with invalid cookie ... ok (16ms)
running 1 test from ./src/auth/user.test.ts
user.createAdminUser ... ok (15ms)
running 4 tests from ./src/document/filedoc.test.ts
readDocFile ... ok (19ms)
readDocFile: not found ... ok (16ms)
readDocFile: invalid json ... ok (16ms)
saveDocFile ... ok (15ms)
running 3 tests from ./src/router/methodHandle.test.ts
methodHandle: basic methods ... ok (8ms)
methodHandle: not found ... ok (16ms)
methodHandle: options ... ok (16ms)
running 8 tests from ./src/router/route.test.ts
route: basic route ... ok (10ms)
route: double slash route ... ok (16ms)
route: double match ... ok (16ms)
route: test context ... ok (16ms)
route: test regex ... ok (16ms)
route: test not found ... ok (16ms)
route: encode_route ... ok (2ms)
route: router in router ... ok (13ms)
running 4 tests from ./src/rpc/chunk.test.ts
basic chunk operation ...
create chunk ... ok (19ms)
delete chunk ... ok (15ms)
modify chunk ... ok (15ms)
move chunk ... ok (15ms)
invalid chunk operation ... ok (17ms)
ok (98ms)
test chunk notification operation ... ok (15ms)
test chunk conflict ... ok (16ms)
test chunk conflict resolve with history ... ok (32ms)
running 2 tests from ./src/rpc/doc.test.ts
handleDocumentMethod ... ok (4ms)
handleTagMethod ...
setTag ... ok (13ms)
getTag ... ok (15ms)
conflict ... ok (15ms)
ok (61ms)
running 3 tests from ./src/rpc/share.test.ts
handleShareGetInfo ... ok (18ms)
handleShareDocMethod ... ok (15ms)
handleShareMethod with no existing share token ... ok (16ms)
running 1 test from ./src/server.test.ts
server rpc test ... ok (1s)
running 3 tests from ./src/setting.test.ts
setting: basic ... ok (35ms)
setting: default value ... ok (7ms)
setting: defered register ... ok (16ms)
test result: ok. 35 passed (15 steps); 0 failed; 0 ignored; 0 measured; 0 filtered out (2s)
```
### Total
| name | passed | Steps | Failed | duration |
| ---- | ------ | ----- | ------ | -------- |
| ok | 35 | 15 | 0 | 4726ms |
## 6.2 기능 테스트(Functional Test)

206
tools/unittestToDoc.ts Normal file
View File

@ -0,0 +1,206 @@
const test_stdout: string = `running 2 tests from ./src/auth/permission.test.ts
permission.test ... ok (14ms)
permission empty ... ok (16ms)
running 4 tests from ./src/auth/session.test.ts
Session ...
set ... ok (14ms)
delete ... ok (16ms)
ok (49ms)
Login Handler ...
login with invalid format ... ok (15ms)
login with invalid password ... ok (16ms)
login ... ok (15ms)
logout with no session ... ok (17ms)
logout ... ok (16ms)
ok (94ms)
getSession ... ok (15ms)
getSession with invalid cookie ... ok (15ms)
running 1 test from ./src/auth/user.test.ts
user.createAdminUser ... ok (5ms)
running 4 tests from ./src/document/filedoc.test.ts
readDocFile ... ok (12ms)
readDocFile: not found ... ok (15ms)
readDocFile: invalid json ... ok (15ms)
saveDocFile ... ok (15ms)
running 3 tests from ./src/router/methodHandle.test.ts
methodHandle: basic methods ... ok (14ms)
methodHandle: not found ... ok (15ms)
methodHandle: options ... ok (17ms)
running 8 tests from ./src/router/route.test.ts
route: basic route ... ok (6ms)
route: double slash route ... ok (12ms)
route: double match ... ok (16ms)
route: test context ... ok (15ms)
route: test regex ... ok (15ms)
route: test not found ... ok (2ms)
route: encode_route ... ok (12ms)
route: router in router ... ok (15ms)
running 4 tests from ./src/rpc/chunk.test.ts
basic chunk operation ...
create chunk ... ok (13ms)
delete chunk ... ok (15ms)
modify chunk ... ok (16ms)
move chunk ... ok (16ms)
invalid chunk operation ... ok (16ms)
ok (96ms)
test chunk notification operation ... ok (16ms)
test chunk conflict ... ok (15ms)
test chunk conflict resolve with history ... ok (32ms)
running 2 tests from ./src/rpc/doc.test.ts
handleDocumentMethod ... ok (5ms)
handleTagMethod ...
setTag ... ok (9ms)
getTag ... ok (16ms)
conflict ... ok (16ms)
ok (58ms)
running 3 tests from ./src/rpc/share.test.ts
handleShareGetInfo ... ok (16ms)
handleShareDocMethod ... ok (2ms)
handleShareMethod with no existing share token ... ok (12ms)
running 1 test from ./src/server.test.ts
server rpc test ... ok (4s)
running 1 test from ./src/watcher/fswatcher.test.ts
WatchFilteredReadWriter ... ok (79ms)
running 1 test from ./src/watcher/readWriter.test.ts
QueueReadWriter ... ok (57ms)
running 1 test from ./src/watcher/util.test.ts
watcher util isHidden ... ok (5ms)
test result: ok. 35 passed (15 steps); 0 failed; 0 ignored; 0 measured; 0 filtered out (6s)
`;
interface TestStep{
name: string;
result: boolean;
time: number;
}
interface TestResult{
name: string;
result: boolean;
time: number;
steps: TestStep[];
}
interface TestFiles{
path: string;
tests: TestResult[];
}
const lines = test_stdout.split("\n");
let cur = 0;
function getMs(time: string){
if (time.endsWith("ms")){
return parseInt(time.replace("ms", ""));
}
return parseInt(time.replace("s", "")) * 1000;
}
let testFiles: TestFiles[] = [];
function parseTest(): TestResult {
const m = /^(.*) \.\.\.(.*)/.exec(lines[cur]);
let steps: TestStep[] = []
if(m){
const name = m[1];
const status = m[2];
let result = status.includes("ok");
let time = 0;
if(status === ""){
cur++;
while(!lines[cur].startsWith("ok")){
const s = /^ (.*) \.\.\. (.*) \((\d+m?s)\)/.exec(lines[cur]);
if(!s){
console.log("unexpected line: " + lines[cur]);
Deno.exit(1);
}
const stepname = s[1];
const stepstatus = s[2];
const steptime = s[3];
//console.log(`${name} ${stepname} ${stepstatus} ${steptime}`);
steps.push({name: stepname, result: stepstatus.includes("ok"), time: getMs(steptime)});
cur++;
}
result = lines[cur].startsWith("ok");
time = getMs(lines[cur].match(/\d+m?s/)![0]);
}
else{
time = getMs(status.match(/\d+m?s/)![0]);
}
//console.log(name, result, time);
cur++;
return {name, result, time, steps};
}
console.log("unexpected line: " + lines[cur]);
Deno.exit(1);
}
while(cur < lines.length){
const line = lines[cur];
if(line === ""){
cur++;
break;
}
const m = /^running (\d+) tests? from (.+)/.exec(lines[cur]);
if(m){
const num = parseInt(m[1]);
const file = m[2];
//console.log(`${num} tests from ${file}`);
cur++;
let tests = [];
for(let i = 0; i < num; i++){
const test = parseTest();
tests.push(test);
}
testFiles.push({path: file, tests});
}
else {
console.log("%c unexpected : "+line,"color: red");
break;
}
//console.log("endwith " + cur);
}
const lastResultRegex = /test result: (.*)\. (\d+) passed \((\d+) steps\); (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out \((\d+m?s)\)/;
const mm = lastResultRegex.exec(lines[cur]);
if(!mm){
console.log("unexpected line: " + lines[cur]);
Deno.exit(1);
}
const mok = mm[1];
const numPassed = parseInt(mm[2]);
const numSteps = parseInt(mm[3]);
const numFailed = parseInt(mm[4]);
const numIgnored = parseInt(mm[5]);
const numMeasured = parseInt(mm[6]);
const numFiltered = parseInt(mm[7]);
const time = getMs(mm[8]);
import * as path from "https://deno.land/std@0.142.0/path/mod.ts";
let duration = 0;
//console.log(testFiles);
testFiles.forEach(file => {
console.log(`### ${path.basename(file.path)}`);
console.log(`| name | result | duration |`);
console.log(`| ---- | ------ | -------- |`);
file.tests.forEach(test => {
if(test.steps.length > 0){
test.steps.forEach(step => {
console.log(`|${test.name + " : " + step.name} |${step.result ? "✅" : "❌"}|${step.time}ms|`);
duration += step.time;
});
}
else{
console.log(`|${test.name}|${test.result ? "✅" : "❌"}|${test.time}ms|`);
duration += test.time;
}
});
});
console.log(`### Total`);
console.log(`| name | passed | Steps | Failed | duration |`);
console.log(`| ---- | ------ | ----- | ------ | -------- |`);
console.log(`| ${mok} | ${numPassed} | ${numSteps} | ${numFailed} | ${duration}ms |`);