有这样一段代码:
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的同步,异步,阻塞,非阻塞 (阅读:14455)
- fsockopen 异步处理 (阅读:9015)
- 配合jquery实现异步加载页面元素 (阅读:5367)
- 使用django+celery+RabbitMQ实现异步执行 (阅读:5004)
- 异步编程与响应式框架 (阅读:3890)
- 多核与异步并行 (阅读:3862)
- redis源代码分析 - event library (阅读:3159)
- Google Analytics 异步代码详解 (阅读:3139)
- 异步完成后新开窗口 (阅读:2937)
- php的异步http请求类 (阅读:2906)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习