2013-01-16 77 views
1

我經常手動測試JavaScript函數的輸出(通過簡單地查看控制檯中每個函數的輸出),而這通常會非常繁瑣。在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; 
} 

回答

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; 
} 
+0

有一個在此行缺少括號:'回報的eval(E [0])== E [1]);' –

+0

感謝您指出了這一點 - 我原本寫它作爲一個'if',然後意識到我!在寫'如果(東西)返回true,否則返回FALSE' –

+0

這裏是的jsfiddle此功能的測試:http://jsfiddle.net/jarble/xZ5uy/ –

2

絕對。使用單元測試套件,如QUnit

我特別喜歡那個,它聲稱它被各種jQuery項目使用。這是一個非常堅實的認可。

典型的測試會是這個樣子......

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

而且,如果你不喜歡這樣的建議,看看在良好的醇」維基百科的其他單元測試框架:JavaScript Unit Testing Frameworks

+0

是否QUnit會做這樣的事情? :) –

+0

是的。與任何單元測試框架一樣,您可以創建斷言('expected == 1'等)並一次獲得結果。 –

0

調查QUnit。你基本上可以一次對你的函數進行測試。

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); 
}); 

我知道這不是一個微不足道的代碼了。這允許你爲函數參數定義不變量,並且根據這些信息我們可以生成測試,文檔等。

suite.js現在只適用於Node環境,但如果有足夠的興趣,我不會將它移植到瀏覽器中,以便您可以在那裏運行測試。