TestIt มีปัญหาอย่างนึงที่ยังแก้ไม่ได้คือ เมื่อเอาหลายๆ test มารันด้วยกันพร้อมกันบางครั้งทำให้ test ที่เคยทำงานผ่านกลับไม่ผ่าน เวลาเรียกรวมเลยต้องแยก test เหล่านั้นออกแต่ด้วยความขี้เกียจยังคงอยากเรียกที่เดียวแล้วเห็นผลลัพธ์ทั้งหมด เลยเขียน script เล็กๆเพื่อมาเรียกพวกนั้นรวมทีนึง เวลาใช้ก็เพียงแค่
node suite.js summary
แต่ยังมี config อีกเล็กน้อย ต้องสร้าง suite.js (หรือจะชื่ออะไรก็แล้วแต่) เป็นไฟล์ที่บอกว่าจะเรียก test ไหนให้ทำงานร่วมกันบ้าง หน้าตาก็อย่างด้านล่าง
var suite = {
description: 'Suite description',
runner: function() {
require('./testunit1');
require('./testunit2');
}
}
exports.suite = suite;
สุดท้ายแล้ว เอา suite ไปเพิ่มในไฟล์ด้านล่าง (ไว้แยกออกมาและทำงานได้บน Browser ทีหลังละกัน)
var spawn = require('child_process').spawn;
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }
var HELP_OPTION = 'help';
var reserve = {
all: true,
help: true,
summary: true
}
var beginPattern = /^begin test: .+$/;
var testPattern = /^.+: .+: (pass|fail).* \(\d+ assertion(s){0,1} run\)$/i;
var endPattern = /(Fail.|Pass.|Error!) \(\d+ tests: (\d+ passed){0,1}(, ){0,1}(\d+ failed){0,1}(, ){0,1}(\d+ errored){0,1}\)/i;
var modules = {
// Show help
help: {
description: 'Show this help',
runner: function() {
var count = 1;
console.error('Please specify module from this list.');
for (var key in modules) {
console.error(' ' + count + '. ' + key + ': ' +
modules[key].description);
count++;
}
}
},
// Run all tests
all: {
description: 'Run all test (can use "node runtest.js all ' +
'summary" or "node runtest.js summary to see summary only)',
runner: function(summary) {
var onlySummary = false;
if (process.argv.length == 4) {
onlySummary = process.argv[3] == 'summary';
} else if (summary) {
onlySummary = summary;
}
var outputs = {};
for (var name in modules) {
if (!reserve[name]) {
outputs[name] = { running: true, output: '' };
var module = spawn(process.argv[0], [process.argv[1], name]);
module.name = name;
module.stdout.setEncoding('utf8');
module.stdout.on('data', function(data) {
var lines = data.split('\n');
for (var key in lines) {
var line = lines[key].trim();
if (beginPattern.test(line)) {
var child = line.substring('begin test: '.length).trim();
this.name = child;
}
if (testPattern.test(line) && !onlySummary) {
outputs[this.name].output += line + '\n';
}
if (endPattern.test(line)) {
outputs[this.name].output += '(' + this.name + ')' + line;
}
}
});
module.on('exit', function(code) {
outputs[this.name].running = false;
});
}
}
var interval = setInterval(function() {
var allFalse = false;
for (var module in outputs) {
allFalse = allFalse || outputs[module].running;
if (!outputs[module].running && !outputs[module].print) {
console.log(outputs[module].output);
outputs[module].print = true;
}
}
if (!allFalse) {
clearInterval(interval);
console.log('done');
}
}, 100);
}
},
// Summary run
summary: {
description: 'Run all test to see summary only',
runner: function() {
modules.all.runner(true)
}
},
// Add more suite here
suite1: require('module1').suite,
suite2: require('module2').suite
}
var main = function(argv) {
if (argv.length < 3) {
modules.all.runner();
} else {
var module = argv[2];
if (!modules[module]) {
modules.help.runner();
} else {
if (module == HELP_OPTION) {
modules.help.runner();
} else {
console.log('begin test: ' + module);
modules[module].runner();
}
}
}
}
main(process.argv);
save file ด้านบนเอาไปเรียกใช้ตามสะดวก วิธีเรียกก็มี
- node suite.js all ที่จะเห็นผลลัพธ์แบบละเอียด (แสดงแต่ละ test ว่าอะไรผ่านไม่ผ่านบ้าง)
- node suite.js summary เพื่อดูแค่ว่ามี suite ไหนผ่านไม่ผ่านบ้าง
- node suite.js suite เพื่อเรียกเฉพาะ suite ที่ต้องการ
สิ่งที่ยังไม่ได้ทำ ถ้าไม่ขี้เกียจจะทำเพิ่ม
- แยก suite config ออกมาเป็นอีกไฟล์
- ทำให้ทำงานผ่าน Browser ได้