有这样一段代码:

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 还是乱的,依旧失败,

建议继续学习:

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