1. ʲôÊǵ¥Ôª²âÊÔ
ÔÚ¼ÆËã»ú±à³ÌÖУ¬µ¥Ôª²âÊÔ£¨ÓÖ³ÆÎªÄ£¿é²âÊÔ£©ÊÇÕë¶Ô³ÌÐòÄ£¿é(Èí¼þÉè¼ÆµÄ×îСµ¥Î»)À´½øÐÐÕýÈ·ÐÔ¼ìÑéµÄ²âÊÔ¹¤×÷¡£³ÌÐòµ¥ÔªÊÇÓ¦ÓõÄ×îС¿É²âÊÔ²¿¼þ¡£ÔÚ¹ý³Ì»¯±à³ÌÖУ¬Ò»¸öµ¥Ôª¾ÍÊǵ¥¸ö³ÌÐò¡¢º¯Êý¡¢¹ý³ÌµÈ£»¶ÔÓÚÃæÏò¶ÔÏó±à³Ì£¬×îСµ¥Ôª¾ÍÊÇ·½·¨£¬°üÀ¨»ùÀࣨ³¬Àࣩ¡¢³éÏóÀà¡¢»òÕßÅÉÉúÀࣨ×ÓÀࣩÖеķ½·¨¡£
ÿ¸öÀíÏëµÄ²âÊÔ°¸Àý¶ÀÁ¢ÓÚÆäËü°¸Àý£»Îª²âÊÔʱ¸ôÀëÄ£¿é£¬¾³£Ê¹ÓÃstubs¡¢mock »òfakeµÈ²âÊÔÂí¼×³ÌÐò¡£µ¥Ôª²âÊÔͨ³£ÓÉÈí¼þ¿ª·¢ÈËÔ±±àд£¬ÓÃÓÚÈ·±£ËûÃÇËùдµÄ´úÂë·ûºÏÈí¼þÐèÇóºÍ×ñÑ¿ª·¢Ä¿±ê¡£
µ¥Ôª²âÊÔµÄÄ¿±êÊǸôÀë³ÌÐòÄ£¿é²¢Ö¤Ã÷ÕâЩµ¥¸öÄ£¿éÊÇÕýÈ·µÄ¡£µ¥Ôª²âÊÔÄÜÈ·±£ÔÚ¿ª·¢¹ý³ÌµÄÔçÆÚ¾ÍÄÜ·¢ÏÖÎÊÌ⣬ÊÇΪÁËÈóÌÐò¡°ËÀµÃ¸üÔ硱¡£ÎÒÃÇÓ¦¸Ã´Ó¿ª·¢µÄÔçÆÚ¾ÍΪËùÓк¯ÊýºÍ·½·¨±àдµ¥Ôª²âÊÔ£¬¿É¶ÁÐÔÇ¿µÄµ¥Ôª²âÊÔ¿ÉÒÔʹ³ÌÐòÔ±·½±ãµØ¼ì²é´úÂëÆ¬¶ÏÊÇ·ñÒÀÈ»Õý³£¹¤×÷¡£Á¼ºÃÉè¼ÆµÄµ¥Ôª²âÊÔ°¸Àý¸²¸Ç³ÌÐòµ¥Ôª·ÖÖ§ºÍÑ»·Ìõ¼þµÄËùÓз¾¶¡£²ÉÓÃÕâÖÖ×Ôµ×ÏòÉϵIJâÊÔ·¾¶£¬ÏȲâÊÔ³ÌÐòÄ£¿éÔÙ²âÊÔÄ£¿éµÄ¼¯ºÏ£¬Ò»µ©±ä¸üµ¼Ö´íÎó·¢Éú£¬½èÖúÓÚµ¥Ôª²âÊÔ¿ÉÒÔ¿ìËÙ¶¨Î»²¢ÐÞ¸´´íÎó¡£
2. JavaScriptµ¥Ôª²âÊÔÏÖ×´
µ¥Ôª²âÊÔÔÚºǫ́¿ª·¢Öзdz£Á÷ÐÐºÍÆÕ¼°£¬±ÈÈçJAVA¿ª·¢ÕßµÄJUnitµÈ£¬¶øÔÚǰ¶Ë¿ª·¢ÖÐÔòʹÓõķdz£ÉÙ¡£¾¿ÆäÔÒò£¬Ö÷ÒªÊǵ¥Ôª²âÊÔ¸üÊÊÓÃÓÚÂß¼´úÂëµÄ²âÊÔ£¬Õâ¶ÔÓÚJAVAµÈºǫ́±à³ÌÓïÑÔÀ´Ëµ²âÊÔÆðÀ´·Ç³£·½±ã£¬µ«ÊÇǰ¶Ë¿ª·¢ºÜ¶àʱºòÒªÒªUI´ò½»µÀ£¬UIÏà¹ØµÄ´úÂë²»ÊDz»¿ÉÒÔ½øÐе¥Ôª²âÊÔ£¬µ«µÄÈ·ºÜÂé·³£¬±ÈÆðÂß¼´úÂëÀ´ËµÀ§ÄѶàÁË£¬Õâ¾Íµ¼ÖÂÁ˵¥Ôª²âÊÔÔÚǰ¶Ë¿ª·¢Ã»ÓÐÆÕ¼°ÆðÀ´¡£
µ«ÊÇËæ×ŵ¥Ôª²âÊÔµÄÆÕ¼°£¬ÓÈÆäÊÇÃô½Ý¿ª·¢µÄÍÆ¶¯£¬Ó¿ÏÖÁËÐí¶àÓÅÐãµÄJavaScriptµ¥Ôª²âÊÔ¿ò¼Ü£¬ÈçQUnit¡¢JasmineµÈ¡£ËùÓеÄÕâЩ¿ò¼Ü»ù±¾É϶¼ÄܶÔJavascript´úÂë½øÐкܺõIJâÊÔ£¬µ±È»UI²¿·ÖµÄ´úÂë²âÊÔÒ»Ñù±È½ÏÂé·³£¬µ«ÊÇÎÒÃÇ¿ÉÒÔͨ¹ý¾«ÐĹ¹ÔìÎÒÃǵIJâÊÔ´úÂëÀ´²âÊÔ²¿·ÖUI´úÂë¡£µ«ÊÇÿ¸ö¿ò¼Ü¶¼²»ÊÇÍòÄܵģ¬ËüÃǶ¼Óи÷×ÔÉó¤µÄÁìÓò£¬ÏÂÃæÑ¡È¡Á˼¸¸ö¾ßÓдú±íÐԵĿò¼Ü½øÐнéÉÜ¡£
3. µ¥Ôª²âÊÔ³£Óÿò¼Ü
QUnit¿ò¼Ü
a) ¼ò½é
QUnitÊÇjQueryÍŶӿª·¢µÄJavaScriptµ¥Ôª²âÊÔ¹¤¾ß£¬¹¦ÄÜÇ¿´óÇÒʹÓüòµ¥¡£Ä¿Ç°ËùÓеÄJQuery´úÂ붼ʹÓÃQUnit½øÐвâÊÔ£¬ÔÉúµÄJavaScriptÒ²¿ÉÒÔʹÓÃQUnit¡£
×î³õ£¬John Resig½«QUnitÉè¼ÆÎªjQueryµÄÒ»²¿·Ö¡£2008Ä꣬QUnit²ÅÓÐÁË×Ô¼ºµÄÃû×Ö¡¢Ö÷Ò³ºÍAPIÎĵµ£¬Ò²¿ªÊ¼ÔÊÐíÆäËûÈËÓÃËüÀ´×öµ¥Ôª²âÊÔ¡£µ«µ±Ê±QUnit»¹ÊÇ»ùÓÚjQueryµÄ¡£Ö±µ½2009Ä꣬QUnit²Å¿ÉÒÔÍêÈ«µÄ¶ÀÁ¢ÔËÐС£
b) Óŵã
ʹÓÃÆðÀ´·Ç³£·½±ã£¬ÓÐÆ¯ÁÁµÄÍâ¹ÛºÍÍêÕûµÄ²âÊÔ¹¦ÄÜ£¨°üÀ¨Òì²½²âÊÔ£©£»
·Ç³£¼òµ¥£¬ÈÝÒ×ÉÏÊÖ£¬Ä¿Ç°¹«¿ªµÄAPIÖ»ÓÐ19¸ö£»
²»ÐèÒªÒÀÀµÆäËüÈκÎÈí¼þ°ü»ò¿ò¼Ü£¬Ö»ÒªÄÜÔËÐÐJSµÄµØ·½¾Í¿ÉÒÔ£¬QUnit±¾ÉíÖ»ÓÐÒ»¸öJSÎļþºÍCSSÎļþ£¬µ±È»Èç¹ûÐèÒª¿ÉÒÔºÍjQueryµÈÆäËü¿ò¼Ü¼¯³É£»
²»½öÖ§³ÖÔÚä¯ÀÀÆ÷ÖвâÊÔ£¬»¹Ö§³ÖÔÚRhinoºÍnode.jsµÈºó¶Ë²âÊÔ
c) ²»×ã
¶Ô×Ô¶¯»¯Ö§³Ö²»ºÃ£¬ºÜÄѺÍAnt¡¢Maven»ò×Ô¶¯¹¹½¨µÈ¹¤¾ß¼¯³É£¬Ö÷ÒªÓÃÔÚä¯ÀÀÆ÷ÖнøÐвâÊÔ¡£
d) API
QUnitËùÓеÄAPI¿ÉÒÔ·ÖΪÈýÀࣺSetup£¬Assertions£¬Asynchronous Testing£¬ÏÂÃæ¾Í·Ö±ð¶ÔÕâЩAPI×öЩ½éÉÜ£º
Setup:
test( name, [expected], testFun ) ´ú±íQUnitÖеÄÒ»¸ö²âÊÔ
name£ºÒª²âÊÔµÄÃû³Æ£¬±ÈÈç¡°¼Ó·¨º¯Êý¡±»ò¡°add¡±µÈ
expected£º¿ÉÑ¡²ÎÊý£¬ÓÃÀ´±íʾ¸Ã²âÊÔº¯ÊýµÄ¶ÏÑÔµÄÊýÁ¿£¬ÊǸöÕýÕûÊý
testFun£ºÒ»¸öº¯Êý£¬ËùÓеIJâÊÔ´úÂë¶¼Ó¦¸Ã°üÀ¨Ôڸú¯ÊýÀͨ³£ÕâÊÇÒ»¸öÄäÃûº¯Êý¡£
Àý£º
test(¡°add function¡±, 1, function() {
equal(add(1, 2), 3);
}); |
asyncTest( name, [expected], testFun ) ´ú±íQUnitÖеÄÒ»¸öÒì²½²âÊÔ£¬²ÎÊýͬtest
expect( amount ) ÓÃÔÚ²âÊÔº¯ÊýÖУ¬ÓÃÓÚÉùÃ÷²âÊÔ¶ÏÑÔµÄÊýÁ¿£¬Õâ¸öº¯ÊýºÍtestÖеÄexpected²ÎÊýµÄ×÷ÓÃÊÇÒ»ÑùµÄ¡£Ö÷Òª×÷ÓþÍÊǼì²éÄãÉùÃ÷µÄ¸öÊýºÍÄãдµÄ¶ÏÑÔµÄʵ¼Ê¸öÊýÊÇ·ñÒ»Ö¡£
module( name, [lifecycle] ) Ö÷ÒªÓÃÓÚ²âÊÔº¯ÊýµÄ·Ö×飬һ¸ömoduleº¯ÊýΪһ¸ö·Ö×飬±ÈÈçmodule(¡°validate¡±)±íʾºóÃæµÄ²âÊÔÓÃÀý¶¼ÊÇvalidateÏà¹ØµÄ´úÂ룬»òÕßmodule(¡°common.js¡±)£¬±íÃ÷ºóÃæµÄ²âÊÔÓÃÀý¶¼ÊÇcommon.jsÀïÃæµÄ´úÂë¡£Ò»¸ö²âÊÔÎļþ¿ÉÒÔд¶à¸ömodule¡£
name£º·Ö×é»òÕßÄ£¿éµÄÃû³Æ
lifecycle£º¿ÉÑ¡²ÎÊý£¬ËüÊÇÒ»¸ö¶ÔÏ󣬿ÉÒÔÉèÖÃsetupºÍteardown»Øµ÷º¯Êý
Àý£º
module(¡°common.js¡±,
{
setup:function(){},
teardown: function() {}
}
); |
setup£ºÔÚmodule¿ªÊ¼Ö®Ç°Ö´ÐУ¬¿ÉÒÔΪ¸ÃmoduleÏÂÃæµÄ²âÊÔ´úÂë×öһЩ׼±¸¹¤×÷
teardown£º½«»áÔÚ¸ÃmoduleµÄËùÓвâÊÔ´úÂëÖ´ÐкóÖ´ÐУ¬±ÈÈç×öһЩÇåÀí»¹Ô¹¤×÷µÈ¡£
QUnit.init( ) ÓÃÓÚ³õʼ»¯QUnit²âÊÔ¿ò¼Ü£¬Í¨³£Õâ¸öº¯ÊýÊDz»ÐèÒªÎÒÃÇÊÖ¹¤µ÷Óõġ£
QUnit.reset( ) ÖØÉ躯Êý£¬Í¨³£ÊÇÔÚÿ¸ötestº¯ÊýÖ´ÐкóÓÉQUnit×Ô¼ºµ÷ÓÃÀ´ÖØÉèÕû¸öQUnit²âÊÔ»·¾³£¬µ±È»±ØÒªÊ±ÎÒÃÇ×Ô¼ºÒ²¿ÉÒÔµ÷ÓÃËüÀ´¸´Ô£¬²»³£Óá£
Assertions:
ok( state, [message] ) ¶ÏÑÔ¡£stateֵΪtrueʱ±íʾͨ¹ý£¬·ñÔòʧ°Ü¡£
equal( actual, expected, [message] ) ±È½Ï²ÎÊýactualºÍexpectedÊÇ·ñÏàµÈ£¬Ï൱ÓÚ
==
notEqual( actual, expected, [message] ) ±È½ÏÁ½¸ö²ÎÊýÊÇ·ñ²»ÏàµÈ£¬Ï൱ÓÚ
!=
deepEqual( actual, expected, [message] ) Ö÷ÒªÓÃÓÚÊý×éºÍ¶ÔÏóµÈÀàÐ͵ÄÖµÊÇ·ñÏàµÈ£¬»áµÝ¹é±éÀúËüÃÇËù°üº¬µÄÖµÊÇ·ñÏàµÈ¡£
notDeepEqual( actual, expected, [message] ) Ö÷ÒªÓÃÓÚÊý×éºÍ¶ÔÏóµÈÀàÐ͵ÄÖµÊÇ·ñ²»ÏàµÈ£¬»áµÝ¹é±éÀúËüÃÇËù°üº¬µÄÖµÊÇ·ñ²»ÏàµÈ¡£
strictEqual( actual, expected, [message] ) ±È½ÏÁ½¸ö²ÎÊýÊÇ·ñÑϸñÏàµÈ£¬Ï൱ÓÚ
===
notStrictEqual( actual, expected, [message] ) ±È½ÏÁ½¸ö²ÎÊýÊÇ·ñ²»ÑϸñÏàµÈ£¬Ï൱ÓÚ
!==
throws( block, expected, [message] ) ²âÊÔblockº¯ÊýÊÇ·ñÅ׳öÒ»¸öÒì³££¬Å׳öÔòͨ¹ý£¬²»Å×Ôòʧ°Ü¡£
block£ºÎÒÃÇÒª²âÊԵĺ¯Êý
expected£º¿ÉÑ¡²ÎÊý£¬ÊÇÒ»¸öÀàÐÍ£¬ÓÃÀ´ÑéÖ¤µÚÒ»¸öº¯ÊýÅ׳öµÄÒì³£ÊÇ·ñÊÇÎÒÃÇÔ¤ÆÚµÄÀàÐÍ¡£
Àý£º
function CustomError( message ) {
this.message = message;
}
CustomError.prototype.toString = function() {
return this.message;
};
throws(
function() {
throw new CustomError(¡°some error description¡±);
},
CustomError,
"raised error is an instance of CustomError"
);
|
Asynchronous Testing:
stop( [increment] ) Í£Ö¹²âÊÔµÄÔËÐУ¬ÓÃÓÚÒì²½²âÊÔ¡£ÔÚÒì²½²âÊÔʱһ°ãÏȰÑQUnitµÄtest
runnerÍ£ÏÂÀ´¡£
increment£ºÔö¼ÓÍ£Ö¹µÄʱ¼ä¡£
start( [decrement] ) µ±Òì²½µ÷Óóɹ¦ºó¾ÍÓ¦¸Ã°ÑÍ£Ö¹µÄtest runnerÆô¶¯ÆðÀ´ÈÃËü½Ó×ÅÍùǰÅÜ
decrement£ºÓÃÀ´¼õÉÙÍ£Ö¹µÄʱ¼ä¡£
Àý£º
test( "a test", function() {
stop();
var result = null;
$.ajax(
url,
{},
function(data){
result = data;
}
);
setTimeout(function() {
equals(result, "success" );
start();
}, 150 );
});
|
e) ʹÓÃ
test.html
µ¼Èëqunit.css£¬qunit.js
ÒÀ´Îµ¼Èë±»²âÊÔÎļþsrc.jsºÍ²âÊÔÎļþtest.js

src.jsÀïÊÇÎÒÃÇÒª²âÊÔµÄһЩº¯Êý

test.jsÀï·ÅÎÒÃǵIJâÊÔ

´ò¿ªtest.html£¬ÏÔʾ£º

Èç¹ûÆÚÍûÖµÓ뺯ÊýÖ´ÐеĽá¹û²»Ò»Ö£¬»á±¨´í£º
test.js

test.htmlÏÔʾ£º

ÆÚÍûÖµÓë½á¹û²»·û£¬²âÊÔ²»Í¨¹ý¡£
Óëä¯ÀÀÆ÷×Ô¶¯»¯²âÊÔ¹¤¾ß¼¯³ÉµÄ½Ó¿Ú£º
¶¼ÊÇQUnit×Ô¶¯µ÷ÓõÄһЩº¯Êý£¬Ò»°ã²»Óøģ¬Ò²¿ÉÒÔ×Ô¼º¶¨ÖÆ
QUnit.log(Function({ result, actual, expected, message
})) Õâ¸ö½Ó¿Ú»áÔÚÿ¸ö¶ÏÑÔÖ´Ðкó±»×Ô¶¯µ÷ÓÃ
result£º¶ÏÑÔÊÇ·ñͨ¹ý
message£º¶ÏÑÔÀïµÄmessage²ÎÊý
Àý£º
QUnit.log(function(details){
alert(¡°Log: ¡± + details.result + ¡° ¡± + details.message);
}) |
QUnit.testStart(Function({ name })) ÔÚÿ¸ö²âÊÔº¯ÊýÖ´ÐÐǰ±»×Ô¶¯µ÷ÓÃ
name£º²âÊÔº¯ÊýÖеÄname²ÎÊýÖµ
QUnit.testDone(Function({ name, failed, passed, total
})) ÔÚÿ¸ö²âÊÔº¯Êý½áÊøºóÖ´Ðб»×Ô¶¯µ÷ÓÃ
name£ºÍ¬ÉÏ
failed£ºÖ¸Ê§°Ü¶ÏÑԵĸöÊý
passed£ºÖ¸³É¹¦¶ÏÑԵĸöÊý
total£ºËùÓжÏÑԵĸöÊý
QUnit.moduleStart(Function({ name })) ÔÚÿ¸ömoduleËùÓеIJâÊÔ´úÂëÖ´ÐÐǰ±»×Ô¶¯µ÷ÓÃ
name£ºmoduleº¯ÊýÖÐname²ÎÊýµÄÖµ
QUnit.moduleDone(Function({ name, failed, passed, total
})) ÔÚÿ¸ömoduleËùÓеIJâÊÔ´úÂëÖ´ÐÐÍêÖ®ºó±»×Ô¶¯Ö´ÐÐ
failed£ºÖ¸Ê§°Ü¶ÏÑԵĸöÊý
passed£ºÖ¸³É¹¦¶ÏÑԵĸöÊý
total£ºÖ¸ËùÓжÏÑԵĸöÊý
QUnit.begin(Function()) ÔÚËùÓеIJâÊÔ´úÂëµ÷ÓÃ֮ǰÔËÐÐ
QUnit.done(Function({ failed, passed, total, runtime
})) ÔÚËùÓеIJâÊÔ´úÂëµ÷ÓÃÖ®ºóÔËÐÐ
failed£ºÖ¸Ê§°Ü¶ÏÑԵĸöÊý
passed£ºÖ¸³É¹¦¶ÏÑԵĸöÊý
total£ºÖ¸ËùÓжÏÑԵĸöÊý
runtime£ºËùÓдúÂëµÄÖ´ÐÐʱ¼ä
Jasmine¿ò¼Ü
a) ¼ò½é
JasmineÊÇÒ»¸öÓÐÃûµÄJavaScriptµ¥Ôª²âÊÔ¿ò¼Ü£¬ËüÊǶÀÁ¢µÄÐÐΪÇý¶¯¿ª·¢¿ò¼Ü£¬Óï·¨ÇåÎúÒ×¶®¡£
ÐÐΪÇý¶¯¿ª·¢(BDD)£ºÊÇÒ»ÖÖÃô½ÝÈí¼þ¿ª·¢µÄ¼¼Êõ£¬Ëü¹ÄÀøÈí¼þÏîÄ¿ÖеĿª·¢Õß¡¢QAºÍ·Ç¼¼ÊõÈËÔ±»òÉÌÒµ²ÎÓëÕßÖ®¼äµÄÐ×÷¡£BDD×î³õÊÇÓÉDan
NorthÔÚ2003ÄêÃüÃû£¬Ëü°üÀ¨ÑéÊպͿͻ§²âÊÔÇý¶¯µÈµÄ¼«ÏÞ±à³ÌµÄʵ¼ù£¬×÷Ϊ¶Ô²âÊÔÇý¶¯¿ª·¢µÄ»ØÓ¦¡£ÔÚ¹ýÈ¥µÄÊýÄêÀµÃµ½Á˼«´óµÄ·¢Õ¹¡£
BDDµÄÖØµãÊÇͨ¹ýÓëÀûÒæÏà¹ØÕßµÄÌÖÂÛÈ¡µÃ¶ÔÔ¤ÆÚµÄÈí¼þÐÐΪµÄÇåÐÑÈÏʶ¡£Ëüͨ¹ýÓÃ×ÔÈ»ÓïÑÔÊéд·Ç³ÌÐòÔ±¿É¶ÁµÄ²âÊÔÓÃÀýÀ©Õ¹Á˲âÊÔÇý¶¯¿ª·¢·½·¨¡£ÐÐΪÇý¶¯¿ª·¢ÈËԱʹÓûìºÏÁËÁìÓòÖÐͳһµÄÓïÑÔµÄĸÓïÓïÑÔÀ´ÃèÊöËûÃǵĴúÂëµÄÄ¿µÄ¡£ÕâÈÿª·¢ÕßµÃÒ԰Ѿ«Á¦¼¯ÖÐÔÚ´úÂëÓ¦¸ÃÔõôд£¬¶ø²»ÊǼ¼Êõϸ½ÚÉÏ£¬¶øÇÒÒ²×î´ó³Ì¶ÈµÄ¼õÉÙÁ˽«´úÂë±àдÕߵļ¼ÊõÓïÑÔÓëÉÌÒµ¿Í»§¡¢Óû§¡¢ÀûÒæÏà¹ØÕß¡¢ÏîÄ¿¹ÜÀíÕߵȵÄÁìÓòÓïÑÔÖ®¼äÀ´»Ø·ÒëµÄ´ú¼Û¡£
BDDµÄ×ö·¨°üÀ¨£º
È·Á¢²»Í¬ÀûÒæÏà¹ØÕßҪʵÏÖµÄÔ¶¾°Ä¿±ê
ʹÓÃÌØÐÔ×¢Èë·½·¨»æÖƳö´ïµ½ÕâЩĿ±êËùÐèÒªµÄÌØÐÔ
ͨ¹ýÓÉÍâ¼°ÄÚµÄÈí¼þ¿ª·¢·½·¨£¬°ÑÉæ¼°µ½µÄÀûÒæÏà¹ØÕßÈÚÈ뵽ʵÏֵĹý³ÌÖÐ
ʹÓÃÀý×ÓÀ´ÃèÊöÓ¦ÓóÌÐòµÄÐÐΪ»ò´úÂëµÄÿ¸öµ¥Ôª
ͨ¹ý×Ô¶¯ÔËÐÐÕâЩÀý×Ó£¬Ìṩ¿ìËÙ·´À¡£¬½øÐлعé²âÊÔ
ʹÓá°Ó¦µ±(should)¡±À´ÃèÊöÈí¼þµÄÐÐΪ£¬ÒÔ°ïÖú²ûÃ÷´úÂëµÄÖ°Ôð£¬ÒÔ¼°»Ø´ð¶Ô¸ÃÈí¼þµÄ¹¦ÄÜÐÔµÄÖÊÒÉ
ʹÓá°È·±£(ensure)¡±À´ÃèÊöÈí¼þµÄÖ°Ôð£¬ÒÔ°Ñ´úÂë±¾ÉíµÄЧÓÃÓëÆäËûµ¥Ôª(element)´úÂë´øÀ´µÄ±ß¼ÊЧÓÃÖÐÇø·Ö³öÀ´¡£
ʹÓÃmock×÷Ϊ»¹Î´±àдµÄÏà¹Ø´úÂëÄ£¿éµÄÌæÉí
BDDÌØÐÔ×¢È룺һ¸ö¹«Ë¾¿ÉÄÜÓжà¸ö»á´øÀ´ÉÌÒµÀûÒæµÄ²»Í¬Ô¸¾°£¬Í¨³£°üÀ¨Ó¯Àû¡¢Ê¡Ç®»ò±£»¤Ç®¡£Ò»µ©Ä³¸öÔ¸¾°±»¿ª·¢Ð¡×éÈ·¶¨Îªµ±Ç°Ìõ¼þϵÄ×î¼ÑÔ¸¾°£¬ËûÃǽ«ÐèÒª¸ü¶àµÄ°ïÖúÀ´³É¹¦ÊµÏÖÕâ¸öÔ¶¾°¡£
È»ºóÈ·¶¨¸ÃÔ¸¾°µÄÖ÷ÒªÀûÒæÏà¹ØÕߣ¬»á´øÈëÆäËûµÄÀûÒæÏà¹ØÕß¡£Ã¿¸öÏà¹ØÕßÒª¶¨ÒåΪÁËʵÏÖ¸ÃÔ¸¾°ËûÃÇÐèÒªÍê³ÉµÄÄ¿±ê¡£ÀýÈ磬·¨Îñ²¿ÃÅ¿ÉÄÜÒªÇóijЩ¼à¹ÜÒªµÃµ½Âú×ã¡£Êг¡ÓªÏú¸ºÔðÈË¿ÉÄÜÒª²Î¼Ó½«Ê¹ÓøÃÈí¼þµÄÓû§µÄÉçÇø¡£°²È«×¨¼ÒÐèҪȷ±£¸ÃÈí¼þ²»»áÊܵ½SQL×¢ÈëµÄ¹¥»÷¡£
ͨ¹ýÕâЩĿ±ê£¬»á¶¨Òå³öҪʵÏÖÕâЩĿ±êËùÐèÒªµÄ´ó¸ÅµÄÌâÄ¿»òÕßÌØÐÔ¼¯ºÏ¡£ÀýÈ磬¡°ÔÊÐíÓû§ÅÅÐò¹±Ï×Öµ¡±»ò¡°½»Ò×É󼯡±¡£´ÓÕâЩÖ÷Ì⣬¿ÉÒÔÈ·¶¨Óû§¹¦ÄÜÒÔ¼°Óû§½çÃæµÄµÚÒ»Åúϸ½Ú¡£
b) Óŵã
ËüÊÇ»ùÓÚÐÐΪÇý¶¯¿ª·¢ÊµÏֵIJâÊÔ¿ò¼Ü£¬ËüµÄÓï·¨·Ç³£Ìù½ü×ÔÈ»ÓïÑÔ£¬¼òµ¥Ã÷ÁË£¬ÈÝÒ×Àí½â¡£
Äܷܺ½±ãµÄºÍAnt¡¢MavenµÈ½øÐм¯³É½øÐÐ×Ô¶¯»¯²âÊÔ£¬Ò²¿ÉÒÔ·½±ãºÍJekinsµÈ³ÖÐø¼¯³É¹¤¾ß½øÐм¯³É£¬¿ÉÒÔÉú³É²âÊÔ½á¹ûµÄXMlÎĵµ¡£
ËüÓзḻµÄAPI£¬Í¬Ê±Óû§Ò²Ö§³ÖÓû§À©Õ¹ËüµÄAPI£¬ÕâÒ»µãºÜÉÙÓÐÆäËü¿ò¼ÜÄܹ»×öµ½¡£
ʹÓ÷½±ã¼òµ¥£¬Ö»ÐèÒªÒýÈëÁ½¸öjsÎļþ¼´¿É
²»½öÖ§³ÖÔÚä¯ÀÀÆ÷ÖвâÊÔ£¬»¹Ö§³ÖÔÚRhinoºÍnode.jsµÈºó¶Ë²âÊÔ¡£
¶ÔÓÚRubyÓïÑÔÓÐÌØ±ðµÄÖ§³Ö£¬Äܹ»·Ç³£·½±ãµÄ¼¯³Éµ½RubyÏîÄ¿ÖÐÈ¥
c) ²»×ã
ÔÚä¯ÀÀÆ÷ÖеIJâÊÔ½çÃæ²»ÈçQUnitÃÀ¹Û¡¢Ïêϸ¡£
d) API
it(string, function) Ò»¸ö²âÊÔSpec
string£º²âÊÔÃû³Æ
function£º²âÊÔº¯Êý
describe (string, function) Ò»¸ö²âÊÔ×鿪ʼÓÚÈ«¾Öº¯Êýdescribe£¬Ò»¸ödescribeÊÇÒ»¸öitµÄ¼¯ºÏ¡£describe°üº¬n¸öit£¬Ò»¸öit°üº¬n¸öÅж϶ÏÑÔ
Suite
string£º²âÊÔ×éÃû³Æ
function£º²âÊÔ×麯Êý
describe("²âÊÔadd()º¯Êý", function() {
it("1 + 1 = 2", function(){
expect(add(1, 1)).toBe(2);
});
}); |
beforeEach(function) ¶¨ÒåÔÚÒ»¸ödescribeµÄËùÓÐitÖ´ÐÐǰ×öµÄ²Ù×÷
afterEach(function) ¶¨ÒåÔÚÒ»¸ödescribeµÄËùÓÐitÖ´Ðкó×öµÄ²Ù×÷
expect(a).matchFunction(b)
expect(a).not.matchFunction(b) ÆÚÍûaºÍbÂú×ãÆ¥Å䷽ʽmatchFunction
matchFunctions£º
toBe Ï൱ÓÚ===£¬´¦Àí¼òµ¥×ÖÃæÖµºÍ±äÁ¿
it("toBeÏ൱ÓÚ===", function(){
var a = 12;
var b = a;
expect(a).toBe(b);
expect(a).not.toBe(null);
expect(false == 0).toBe(true);
});
it("toBe²»Äܵ±==ÓÃ", function(){
expect(false).toBe(0);
}); |

toEqual ´¦Àí¼òµ¥×ÖÃæÖµºÍ±äÁ¿£¬¶øÇÒ¿ÉÒÔ´¦Àí¶ÔÏó£¬Êý×é
it("toEqual¿ÉÒÔ´¦Àí×ÖÃæÖµ£¬±äÁ¿ºÍ¶ÔÏó", function(){
var a = 12;
expect(a).toEqual(12);
var foo = {key : "key"};
var bar = {key : "key"};
expect(foo).toEqual(bar);
var arr1 = [];
arr1["p1"] = "string1";
var arr2 = [];
arr2["p1"] = "string1";
var obj = {};
obj["p1"] = "string1";
expect(arr1).toEqual(arr2);
expect(arr1).toEqual(obj);
}) |
toMatch °´ÕýÔòʽ¼ìË÷¡£
it("toMatchÆ¥ÅäÕýÔòʽ", function(){
var message = "foo bar baz";
expect(message).toMatch(/bar/);
expect(message).toMatch("bar");
expect(message).not.toMatch(/quux/);
expect(message).toMatch(/^f/);
expect(message).not.toMatch(/f$/);
}); |
toBeDefined ÊÇ·ñÒÑÉùÃ÷ÇÒ¸³Öµ
it("toBeDefined¼ì²â±äÁ¿·Çundefined", function(){
var a = { key : "key"};
expect(a.key).toBeDefined();
expect(a.foo).not.toBeDefined();
//expect(c).not.toBeDefined(); //δÉùÃ÷³ö´í
var b;
expect(b).not.toBeDefined();
}); |
¶ÔÏó.δÉùÃ÷ÊôÐÔ.not.toBeDefined(); ͨ¹ý
δÉùÃ÷±äÁ¿.not.toBeDefined(); ±¨´í
toBeUndefined ÊÇ·ñundefined
toBeNull ÊÇ·ñnull
toBeTruthy Èç¹ûת»»Îª²¼¶ûÖµ£¬ÊÇ·ñΪtrue
toBeFalsy Èç¹ûת»»Îª²¼¶ûÖµ£¬ÊÇ·ñΪfalse
toContain Êý×éÖÐÊÇ·ñ°üº¬ÔªËØ£¨Öµ£©¡£Ö»ÄÜÓÃÓÚÊý×飬²»ÄÜÓÃÓÚ¶ÔÏó
it("toContain¼ìÑéÊý×éÖÐÊÇ·ñ°üº¬ÔªËØ(Öµ)", function(){
var a = ["foo", "bar", "baz"];
expect(a).toContain("bar");
}); |
toBeLessThan ÊýÖµ±È½Ï£¬Ð¡ÓÚ
toBeGreaterThan ÊýÖµ±È½Ï£¬´óÓÚ
toBeCloseTo ÊýÖµ±È½Ïʱ¶¨Ò徫¶È£¬ÏÈËÄÉáÎåÈëºóÔٱȽÏ
it("toBeCloseToÊýÖµ±È½Ï£¬Ö¸¶¨¾«¶È£¬ÏÈËÄÉáÎåÈëÔٱȽÏ", function() {
var pi = 3.1415926, e = 2.78;
expect(pi).toBeCloseTo(e, 0);
expect(pi).not.toBeCloseTo(e, 0.1);
}); |
|