有这样一段代码:
var O = {
data: 1,
fn: function(callback) {
setTimeout(function() {
O.data++;
callback();
}, 100);
},
fn2: function() {
O.data--;
}
};
现在要测试 O 的两个方法是否正常工作。我们采用自主开发的测试框架 STF:
/* STF - stupid test framework v0.1 */
function test(desc, fn) {
console.log('START test ' + desc);
fn && fn();
console.log('END test ' + desc);
}
function equals(actual, expected) {
console.log(actual === expected ? ' passed' : ' failed');
}
有了以上方法,很容易写出测试用例:
test('fn', function() {
O.data = 1;
O.fn(function() {
equals(O.data, 2);
});
});
test('fn2', function() {
O.data = 1;
O.fn2();
equals(O.data, 0);
});
一运行,输出的 log 顺序很乱,有个用例还失败了:
START test fn END test fn START test fn2 passed END test fn2 failed
都是异步惹的祸
对上面的结果稍加分析可以看出,一切都是 setTimeout 惹的祸。
只要被测试的代码里有异步操作,就有可能引起上面的问题。作为一个非常有前景的 STF 测试框架,究竟怎样才能支持异步测试呢?
思路很简单,如果没有异步,都是同步运行,那就很好测试了。因此立刻推出 STF v0.2:
// STF 里增加 sleep 方法
function sleep(ms) {
var t = (new Date()).getTime();
while((new Date()).getTime() - t < ms);
}
将 O.fn 的测试用例修改为:
test('fn', function() {
O.data = 1;
O.fn(function() {
equals(O.data, 2);
});
sleep(200);
});
满怀期望一运行,杯具,log 还是乱的,依旧失败,
建议继续学习:
- 关于IO的同步,异步,阻塞,非阻塞 (阅读:15778)
- fsockopen 异步处理 (阅读:9840)
- 配合jquery实现异步加载页面元素 (阅读:5935)
- 使用django+celery+RabbitMQ实现异步执行 (阅读:5706)
- 多核与异步并行 (阅读:4629)
- 异步编程与响应式框架 (阅读:4518)
- Google Analytics 异步代码详解 (阅读:3915)
- redis源代码分析 - event library (阅读:3777)
- 异步完成后新开窗口 (阅读:3551)
- php的异步http请求类 (阅读:3439)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习

[928]