1

我经常手动测试 JavaScript 函数的输出(通过简单地查看控制台中每个函数的输出),这通常很乏味。在 JavaScript 中,有没有办法自动测试一系列函数调用的输出,并返回所有没有产生预期结果的测试?

checkOutput([["add(1, 2)", 3], ["add(2, 2)", 4]]); //if the input does not match the output in one of these arrays, then return the function call(s) that didn't produce the correct output

function checkOutput(functionArray){
    //this function is not yet implemented, and should return a list of function calls that did not produce correct output (if there are any).
}

function add(num1, num2){
    return num1 + num2;
}
4

5 回答 5

2

绝对地。使用单元测试套件,例如QUnit

我特别喜欢那个,它吹嘘它被各种 jQuery 项目所使用。这是一个非常可靠的认可。

一个典型的测试看起来像这样......

test( "add test", function(num1, num2) {
  ok( num1 + num2 == 42, "Passed!" );
});

而且,如果您不喜欢这个建议,请查看其他单元测试框架,网址为 good ol' Wikipedia: JavaScript Unit Testing Frameworks

于 2013-01-16T06:41:27.987 回答
2

看起来就像循环一样简单,eval每个数组的第一个元素并将其与第二个元素进行比较。

function checkOutput(functionArray) {
    var check = function(e) {
        return eval(e[0]) !== e[1];
    };
    if( Array.prototype.filter)
        return functionArray.filter(check);
    // shim in older browsers
    var l = functionArray.length, i, out = [];
    for( i=0; i<l; i++)
        if( check(functionArray[i]))
            out.push(functionArray[i]);
    return out;
}
于 2013-01-16T06:42:59.460 回答
1

也许你想切换到jasmine来测试 javascript。

于 2013-01-16T06:41:44.887 回答
1

我的测试库suite.js做了这样的事情。基本上语法如下所示:

suite(add, [
    [[1, 2]], 3
]);

通常我使用部分应用程序绑定参数,所以我的测试如下所示:

suite(partial(add, 1), [
    -5, 4,
    2, 3
]);

最终,我完全跳过了这些测试,并定义了一个基于它生成测试的合同。为此,我使用annotate.js。在这种情况下,我最终会得到以下内容:

// implementation
function adder(a, b) {
    return a + b;
}

var add = annotate('add', 'adds things').on(is.number, is.number, adder);

// test some invariants now
suite(add, function(op, a, b) {
    return op(a, b) == op(b, a);
});

I know it's not a trivial amount of code anymore. This allows you to define invariants for function parameters, though, and based on that information we can generate tests, documentation etc.

suite.js works only in Node environment for now but if there is enough interest, I don't mind porting it to browser so you can run your tests there.

于 2013-01-16T06:52:47.837 回答
0

查看QUnit。您基本上可以一次对您的函数运行测试。

于 2013-01-16T06:42:50.947 回答