Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
javascriptµ¥Ôª²âÊÔ£¨Ï£©
 
×÷ÕߣºœÔÁÜ À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ 2015-8-14
  3441  次浏览      27
 

toThrow ¼ìÑéÒ»¸öº¯ÊýÊÇ·ñ»áÅ׳öÒ»¸ö´íÎó


it("toThrow¼ìÑéÒ»¸öº¯ÊýÊÇ·ñ»áÅ׳öÒ»¸ö´íÎó", function() {

var foo = function() {

return 1 + 2;

};

var bar = function() {

return a + 1;

};

expect(foo).not.toThrow();

expect(bar).toThrow();

});

×¢£ºdescribe¿ÉǶÌ×

xdescribe ºÍ xit£ºÂ·¹ý²»Ö´ÐУ¬½á¹û²»ÏÔʾ¡£Ïñdisplay:none¡£µã¿ØÖÆÀ¸ÖÐskippedÏÔʾ

Spy ´æ´¢º¯ÊýµÄ±»µ÷ÓÃÇé¿öºÍ²ÎÊý£¨º¯Êý¼àÊÓÆ÷£¬¼Ç¼±»µ÷ÓÃÇé¿ö£¬µ«º¯Êý²¢²»ÕæÖ´ÐУ©


describe("¶Ôspyº¯ÊýµÄ²âÊÔ", function() {

var foo, bar = null;

beforeEach(function() {

foo = {

setBar: function(value) {

bar = value;

}

};

spyOn(foo, 'setBar'); //fooΪspyº¯Êý

foo.setBar(123);

foo.setBar(456, 'another param');

});

it("²âÊÔfooº¯ÊýÊÇ·ñ±»µ÷Óùý", function() {

expect(foo.setBar).toHaveBeenCalled();

});

it("²âÊÔfooº¯Êý±»µ÷ÓõĴÎÊý", function() {

expect(foo.setBar.calls.length).toEqual(2);

});

it("²âÊÔfooº¯Êý±»µ÷ÓÃʱ´«ÈëµÄ²ÎÊý", function() {

expect(foo.setBar).toHaveBeenCalledWith(123);

expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');

});

it("ÉÏÒ»´Î±»µ÷ÓõIJÎÊý", function() {

expect(foo.setBar.mostRecentCall.args[0]).toEqual(456);

});

it("ËùÓб»µ÷ÓõÄÇé¿ö´æÔÚÒ»¸öÊý×éÀï", function() {

expect(foo.setBar.calls[0].args[0]).toEqual(123);

});

it("º¯Êý²¢Î´ÕæµÄÖ´ÐÐ", function() {

expect(bar).toBeNull();

});

});

Spy addCallThrough º¯Êý¼àÊÓÆ÷£¬µ«º¯ÊýÕæµÄÖ´ÐÐ

describe("¶Ôspyº¯ÊýµÄ²âÊÔ£¬º¯ÊýÕæµÄÖ´ÐÐ", function() {

    var foo, bar, fetchedBar;

 

    beforeEach(function() {

        foo = {

            setBar: function(value) {

                bar = value;

            },

            getBar: function() {

                return bar;

            }

        };

 

        //spyOn(foo, "setBar");    //Èç¹û¼ÓÉÏÕâ¾ä£¬setBar²»ÕæµÄÖ´ÐУ¬ºóÁ½¸öspec²»Í¨¹ý

        spyOn(foo, 'getBar').andCallThrough();

 

        foo.setBar(123);

        fetchedBar = foo.getBar();

    });

 

    it("²âÊÔfooÖÐgetBarº¯ÊýÊÇ·ñ±»µ÷Óùý", function() {

        expect(foo.getBar).toHaveBeenCalled();

    });

 

    it("fooÖÐsetBarº¯ÊýÕæµÄÖ´ÐÐÁË", function() {

        expect(bar).toEqual(123);

    });

 

    it("fooÖÐgetBarº¯ÊýÕæµÄÖ´ÐÐÁË", function() {

        expect(fetchedBar).toEqual(123);

    });

});

Spy andReturn º¯Êý¼àÊÓÆ÷£¬º¯Êý²»ÕæµÄÖ´ÐС£Ö¸¶¨¼àÊӵĺ¯ÊýµÄ·µ»ØÖµ


describe("A spy, when faking a return value", function() {

var foo, bar, fetchedBar;

beforeEach(function() {

foo = {

setBar: function(value) {

bar = value;

},

getBar: function() {

return bar;

}

};

spyOn(foo, 'getBar').andReturn(745); //Ö¸¶¨getBarº¯Êý·µ»Ø745

foo.setBar(123);

fetchedBar = foo.getBar();

});

it("²âÊÔfooÖÐgetBarº¯ÊýÊÇ·ñ±»µ÷Óùý", function() {

expect(foo.getBar).toHaveBeenCalled();

});

it("²»Ó°Ïìδ±»¼àÊӵįäËüº¯Êý", function() {

expect(bar).toEqual(123);

});

it("Ö¸¶¨µÄ·µ»ØÖµ745", function() {

expect(fetchedBar).toEqual(745);

});

});

Spy addCallFake Ìæ´ú±»¼àÊӵĺ¯Êý£¬Ô­º¯Êý²»Ö´ÐÐ


describe("Ìæ´ú±»¼àÊӵĺ¯Êý£¬Ô­º¯Êý²»Ö´ÐÐ", function() {

var foo, bar, fetchedBar;

beforeEach(function() {

foo = {

setBar: function(value) {

bar = value;

},

getBar: function() {

alert("frostbelt");

return bar;

}

};

spyOn(foo, 'getBar').andCallFake(function() {

return 1001;

});

foo.setBar(123);

fetchedBar = foo.getBar();

});

it("²âÊÔfooÖÐgetBarº¯ÊýÊÇ·ñ±»µ÷Óùý", function() {

expect(foo.getBar).toHaveBeenCalled();

});

it("²»Ó°Ïìδ±»¼àÊӵįäËüº¯Êý", function() {

expect(bar).toEqual(123);

});

it("getBar±»addCallFakeÖ¸¶¨µÄÄäÃûº¯Êý´úÌæ£¬getBar²»Ö´ÐÐ", function() {

expect(fetchedBar).toEqual(1001);

});

});

Èç¹ûÄãûÓÐʲô¿É¼àÊÓµÄÓÖʵÔÚÏë¼àÊÓһϣ¬¸ÃÕ¦°ì£¿×Ô¼ºcreateÒ»¸ö±»¼àÊÓº¯Êý¡£¡£

jasmine.createSpy(functionId)


describe("×Ô¼ºÔìÒ»¸ö±»¼àÊÓº¯Êý¡£°¡£¬ÎÒÁèÂÒÁË¡£¡£", function() {

var whatAmI;

beforeEach(function() {

whatAmI = jasmine.createSpy('whatAmI');

whatAmI("I", "am", "a", "spy");

});

it("Óиöid£¬ÊÇcreateSpyµÄ´«È뺯Êý£¬ÓÃÓÚ±¨´í", function() {

expect(whatAmI.identity).toEqual('whatAmI')

});

it("ÊÇ·ñ±»µ÷ÓÃ", function() {

expect(whatAmI).toHaveBeenCalled();

});

it("±»µ÷ÓõĴÎÊý", function() {

expect(whatAmI.calls.length).toEqual(1);

});

it("±»µ÷ÓõIJÎÊý", function() {

expect(whatAmI).toHaveBeenCalledWith("I", "am", "a", "spy");

});

it("×î½üÒ»´Î±»µ÷ÓÃ", function() {

expect(whatAmI.mostRecentCall.args[0]).toEqual("I");

});

});

ÓÐʱÐèÒª¼àÊÓÒ»¸ö¶ÔÏóµÄºÜ¶à·½·¨£¬ÓÃcreateSpyObjÌí¼Ó·½·¨Êý×é

jasmine.createSpyObj(obj, methodArray)


describe("ÓÐʱÐèÒª¼àÊÓÒ»¸ö¶ÔÏóµÄºÜ¶à¸ö·½·¨£¬ÓÃcreateSpyObjÌí¼ÓÊý×é", function() {

var tape;

beforeEach(function() {

tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']);

tape.play();

tape.pause();

tape.rewind(0);

});

it("tape¶ÔÏóµÄÕâËĸö·½·¨Òѱ»¶¨Òå", function() {

expect(tape.play).toBeDefined();

expect(tape.pause).toBeDefined();

expect(tape.stop).toBeDefined();

expect(tape.rewind).toBeDefined();

});

it("Ëĸö·½·¨ÊÇ·ñ±»µ÷ÓÃ", function() {

expect(tape.play).toHaveBeenCalled();

expect(tape.pause).toHaveBeenCalled();

expect(tape.rewind).toHaveBeenCalled();

expect(tape.stop).not.toHaveBeenCalled();

});

it("±»µ÷ÓÃʱ´«ÈëµÄ²ÎÊý", function() {

expect(tape.rewind).toHaveBeenCalledWith(0);

});

});

jasmine.any ÀàÐÍÅжϡ£instanceof


describe("ÀàÐÍÆ¥Åä", function() {

it("Ï൱ÓÚinstanceof", function() {

expect({}).toEqual(jasmine.any(Object));

expect(12).toEqual(jasmine.any(Number));

});

it("Ò²¿ÉÒÔÓÃÓÚspy", function() {

var foo = jasmine.createSpy('foo');

foo(12, function() {

return true

});

expect(foo).toHaveBeenCalledWith(jasmine.any(Number), jasmine.any(Function));

//foo±»µ÷ÓÃʱµÄ²ÎÊý ÀàÐÍÅжÏ

});

});

jasmine.Clock.useMock() jasmine×Ô¼º¿ØÖÆÊ±¼ä£¬ÊµÏÖÒì²½µ÷ÊÔ£¬¼õÉٵȴý

jasmine.Clock.tick(n:uint) ÏòǰnºÁÃë


describe("jasmine×Ô¼º¿ØÖÆÊ±¼ä£¬ÊµÏÖÒì²½µ÷ÊÔ£¬¼õÉٵȴý", function() {

var timerCallback;

beforeEach(function() {

timerCallback = jasmine.createSpy('timerCallback');

jasmine.Clock.useMock();

});

it("setTimeout", function() {

setTimeout(function() {

timerCallback();

}, 100);

expect(timerCallback).not.toHaveBeenCalled();

jasmine.Clock.tick(101);

expect(timerCallback).toHaveBeenCalled();

});

it("setInterval", function() {

setInterval(function() {

timerCallback();

}, 100);

expect(timerCallback).not.toHaveBeenCalled();

jasmine.Clock.tick(101);

expect(timerCallback.callCount).toEqual(1);

jasmine.Clock.tick(50);

expect(timerCallback.callCount).toEqual(1);

jasmine.Clock.tick(50);

expect(timerCallback.callCount).toEqual(2);

});

});

×¢£ºÔÚÕâÖÖ»·¾³ÏÂsetTimeoutºÍsetIntervalµÄcallbackΪͬ²½µÄ£¬ÏµÍ³Ê±¼ä²»ÔÙÓ°ÏìÖ´ÐÐ

runs(function) waitsFor(function, message, millisec) JasmineÒì²½µ÷ÊÔ °´×Ô¼ºµÄÀí½âд¸öÀý×Ó


describe("jasmineÒì²½µ÷ÊÔ£¬¶Ôajax½á¹ûµÄ¶ÏÑÔ", function(){

var data, flag = false;

it("ajaxÊÇ·ñ°´Ê±·µ»ØÁËÕýÈ·½á¹û", function(){

runs(function(){

$.post(

url,

{},

function(data){

flag = true;

data = data.someAttr;

}

);

});

waitsFor(function(){ //flagΪtrue»òµ½2ÃëʱִÐÐ 2ÃëÄÚ·µ»ØtrueÔòÖ´ÐÐ×îºóÒ»¸öruns£¬µ½Ê±Î´·µ»ØÔò±¾spec³ö´í£¬·µ»ØµÚ¶þ¸ö²ÎÊý´íÎóÐÅÏ¢

return flag;

}, "ajaxÔÚÖ¸¶¨Ê±¼ä2ÃëÄÚδ·µ»Ø", 2000);

runs(function(){ //Ö±µ½waitsFor·µ»ØtrueʱִÐÐ

expect(data).toEqual("someThing");

})

});

});

×¢£ºitÊÇÒ»¸öspec£¬°üº¬

runs(function)

waitsFor(function, message, millsec)

runs(function)

µÚÒ»¸örunsÀïÓÐһЩÒì²½µÄ´úÂë

waitsForÖеÄfuncitonÈç¹ûÔÚmillsecÄÚ·µ»Øtrue£¬Ö´ÐÐ×îºóÒ»¸öruns

Èç¹ûÔÚmillsecÄÚ²»ÄÜ·µ»Øtrue£¬spec²»Í¨¹ý£¬ÏÔʾ´íÎóÐÅÏ¢message

e) ʹÓÃ

ÔÚ²âÊÔµÄÒ³ÃæÀï¼ÓÈëÒÔÏ´úÂ룺


<script type="text/javascript">

(function() {

var jasmineEnv = jasmine.getEnv();

jasmineEnv.updateInterval = 1000;

var trivialReporter = new jasmine.TrivialReporter();

jasmineEnv.addReporter(trivialReporter);

jasmineEnv.specFilter = function(spec) {

return trivialReporter.specFilter(spec);

};

var currentWindowOnload = window.onload;

window.onload = function() {

if (currentWindowOnload) {

currentWindowOnload();

}

execJasmine();

};

function execJasmine() {

jasmineEnv.execute();

}

})();

</script>

µ¼Èëjasmine.css jasmine.js jasmine-html.js

src.js(Ô´´úÂë) test.js(´æ·Ådescribes)

JsTestDriver

a) ¼ò½é

JsTestDriverÊÇÒ»¸öJavaScriptµ¥Ôª²âÊÔ¹¤¾ß£¬Ò×ÓÚÓë³ÖÐø¹¹½¨ÏµÍ³Ï༯³É²¢Äܹ»ÔÚ¶à¸öä¯ÀÀÆ÷ÉÏÔËÐвâÊÔÇáËÉʵÏÖTDD·ç¸ñµÄ¿ª·¢¡£µ±ÔÚÏîÄ¿ÖÐÅäÖúÃJsTestDriverÒÔºó£¬Èçͬjunit²âÊÔjavaÎļþÒ»°ã£¬JsTestDriver¿ÉÒÔÖ±½Óͨ¹ýÔËÐÐjsÎļþÀ´½øÐе¥Ôª²âÊÔ¡£JsTestDriver¿ò¼Ü±¾Éí¾ÍÊÇJAVAµÄjar°ü£¬ÐèÒªÔÚ±¾µØÔËÐв¢¼àÌýÒ»¸ö¶Ë¿Ú¡£

b) Óŵã

¿ÉÒÔÒ»´Î²âÊÔ¶à¸öä¯ÀÀÆ÷£¬Ê¹Ó÷½·¨ÊÇÔÚÆô¶¯·þÎñʱ¿ÉÒÔ½«¶à¸öä¯ÀÀÆ÷µÄ·¾¶×÷Ϊ²ÎÊý´«½øÈ¥¡£¿ÉÒÔÔÚ¶ą̀»úÆ÷ÉϵÄä¯ÀÀÆ÷ÖÐÔËÐУ¬°üÀ¨Òƶ¯É豸¡£

²âÊÔÔËÐеúܿ죬ÒòΪ²»ÐèÒª½«½á¹ûÌí¼Óµ½DOMÖгÊÏÖ³öÀ´£¬ËüÃÇÄܹ»Í¬Ê±ÔÚÈÎÒâ¶àµÄä¯ÀÀÆ÷ÖÐÔËÐУ¬Î´Ð޸ĵÄÎļþä¯ÀÀÆ÷»á´Ó»º´æÌáÈ¡¡£

²»ÐèÒªHTMLÅä¼þÎļþ£¬½ö½öÖ»ÐèÌṩһ¸ö»ò¶à¸ö½Å±¾ºÍ²âÊԽű¾£¬²âÊÔÔËÐÐÆ÷ÔËÐÐʱ»á´´½¨Ò»¸ö¿ÕÎļþ¡£

Äܷܺ½±ãµÄºÍAnt¡¢MavenµÈ½øÐм¯³É½øÐÐ×Ô¶¯»¯²âÊÔ£¬Ò²¿ÉÒÔ·½±ãºÍJekinsµÈ³ÖÐø¼¯³É¹¤¾ß½øÐм¯³É£¬¿ÉÒÔÉú³É²âÊÔ½á¹ûµÄXMLÎĵµ¡£

ÓÐEclipseºÍIntelliJ²å¼þ£¬¿ÉÒԺܷ½±ãµÄÔÚÕâÁ½¸öIDEÖнøÐвâÊÔ£¬ºÍJUnitºÜÏñ¡£

Ö§³ÖÆäËü²âÊÔ¿ò¼Ü£¬¿ÉÒÔ²âÊÔÆäËü²âÊÔ¿ò¼ÜдµÄ²âÊÔ´úÂ룬±ÈÈçÓжÔÓ¦µÄ²å¼þ¿ÉÒÔ½«QUnitºÍJasmine²âÊÔ´úÂëת»»³ÉJsTestDriverµÄ²âÊÔ´úÂë¡£

c) ²»×ã

²»ÄÜÔÚä¯ÀÀÆ÷ÖвâÊÔ£¬Ö»ÄÜͨ¹ý×Ô¶¯»¯¹¤¾ß»ò¿ØÖÆÌ¨ÔËÐС£Éú³ÉµÄ½á¹û²»¹»Ö±¹Û¡£

°²×°Ê¹ÓÃÉÔ΢ÓеãÂé·³£¬ÒÀÀµÓÚJAVA»·¾³¡£

d) API

assert(msg, value) 

assertTrue(msg, value)

assertFalse(msg, value)

assertEquals(msg, expected, actual)

assertNotEquals(msg, expected, actual)

assertSame(msg, expected, actual)

assertNotSame(msg, expected, actual)

assertNull(msg, value)

assertNotNull(msg, value)

assertUndefined(msg, value)

assertNotUndefined(msg, value)

assertNaN(msg, number)

assertNotNaN(msg, number)

assertException(msg, callback, type)

assertNoException(msg, callback)

assertArray(msg, arrayLike)

assertTypeOf(msg, type, object)

assertBoolean(msg, value)

assertFunction(msg, value)

assertNumber(msg, value)

assertObject(msg, value)

assertString(msg, value)

assertMatch(msg, pattern, string)

assertNoMatch(msg, pattern, string)

assertTagName(msg, tagName, element)

assertClassName(msg, className, element)

assertElementId(msg, id, element)

assertInstanceOf(msg, constructor, object)

assertNotInstanceOf(msg, constructor, object)

API°´×ÖÃæÒâ˼Àí½â¼´¿É£¬²»Ò»Ò»±ê×¢

e) ʹÓÃ

ǰÌ᣺

°²×°java»·¾³

ÏÂÔØJsTestDriver.jar

Ŀ¼£º

JsTestDriver.jar

jsTestDriver.conf //ÅäÖÃÎļþ£¬Ä¬ÈÏÃû³Æ£¬Èç¹ûÓÃÆäËüÃû³Æ£¬ÐèÒªÖ¸¶¨config²ÎÊý

src

----src.js

test

----test.js

jsTestDriver.conf£º

src.js£º

test.js£º

ÏñjavaµÄJUnitÒ»Ñù£¬²âÊÔ·½·¨ÃûÒªÒÔ¡±test¡±¿ªÍ·£¬È磺¡±testXXXX¡±

²âÊÔ²½Ö裺

1.cmd ½øÈëĿ¼

2.ÔËÐÐÃüÁjava ¨Cjar JsTestDriver.jar ¨Cport 9876¡±

3.´ò¿ªÒ³Ãæhttp://localhost:9876£¬µã»÷¡°²¶»ñä¯ÀÀÆ÷¡±¡£

4.дò¿ªÒ»¸öÖÕ¶Ë£¬ÔËÐÐÃüÁjava ¨Cjar JsTestDriver.jar ¨Ctests all¡±£¬ÔËÐÐËùÓвâÊÔÓÃÀý

5.Ò²¿ÉÒÔµ¥¶ÀÔËÐÐijһ¸öÓÃÀý£¬ÈçÔËÐÐÃüÁ java ¨Cjar JsTestDriver.jar ¨Ctests addTest.testA¡±

FireUnit

a) ¼ò½é

FireUnitÊÇÒ»¸ö»ùÓÚFirebugµÄJavascriptµÄµ¥Ôª²âÊÔ¿ò¼Ü¡£¼òµ¥ËµÀ´£¬FireUnit¸øFirebugÔö¼ÓÁËÒ»¸ö±êÇ©Ãæ°å£¬²¢ÌṩÁËһЩ¼òµ¥µÄJavaScript APIÀ´¼Ç¼ºÍ²é¿´²âÊÔ¡£

b) Óŵã

¼òµ¥Ò×ÓÃ

c) ²»×ã

¹¦Äܲ»¶à£¬²âÊÔ´úÂë³£³£Ð´ÔÚÔ´ÂëÀËäÈ»¿ÉÒÔʵʱµØ¿´µ½Ð§¹û£¬µ«ñîºÏ̫ǿ£¬²»Ò×ÇåÀí

Ö»ÔËÐÐÔÚFirefoxÏÂ

d) API

³£Óãº

fireunit.ok(condition, message) true/false

fireunit.compare(actual, expect, message) ÊÇ·ñÏàµÈ

fireunit.reCompare(regexp, string, message) ×Ö·û´®ÊÇ·ñÓëÕýÔòʽƥÅä

fireunit.testDone(); Ö´ÐÐÒÔÉϵIJâÊÔ£¬ÔÚFirebugµÄбêÇ©testÖÐÏÔʾ½á¹û

ÆäËü£º

fireunit.runTests(¡°test2.html¡±, ¡°test3.html¡±) Ò»ÆðÔËÐжà¸öÒ³ÃæµÄ²âÊÔ(ÿ¸öÎļþ¶¼º¬ÓÐһЩ¶ÀÁ¢µÄ²âÊÔ)

fireunit.log(message) ´òÓ¡log£¬µ«Ëƺõ²»¹ÜÓÃ

fireunit.id(id) Ï൱Óëdocument.getElementById

fireunit.click(element) Ä£Äâ´¥·¢elementµÄclickʼþ

fireunit.focus(element) Ä£Äâ´¥·¢elementµÄfocusʼþ

fireunit.mouseDown(element) Ä£Äâ´¥·¢elementµÄmouseDownʼþ

µ«¿´´úÂëÃ÷Ã÷ÊÇclickʼþ

ÔÚFFÏ£¬Ö»ÊÇÖ´ÐÐÁËnode.click();²»»á´¥·¢onmousedown£¬Ö»»á´¥·¢onclick¡£ÒÑÑéÖ¤

fireunit.value(element) ÐÞ¸ÄelementµÄvalue

fireunit.key(element, key) Ä£Äâ´¥·¢elementµÄkeyʼþ

Àý£º

var input = document.getElementsByTagName(¡°input¡±)[0];

fireunit.key(input, ¡°a¡±);

ûÓùý£º

fireunit.browser

fireunit.test

fireunit.forceHTTP

fireunit.registerPathHandler

fireunit.panel

fireunit.privilege

e) ʹÓÃ

ÔÚFFÏÂ×°FirebugºÍFireUnit

Ö±½ÓÔÚ´úÂëÀïд²âÊÔ£¬¾ÍÏñconsole.log();

4. С½á

QUnit¿ò¼Ü¼òµ¥·½±ã£¬²âÊÔ½çÃæÖ±¹ÛÏêϸ£¬Jasmine¹¦ÄÜÇ¿´ó£¬·ç¸ñÒ²¼òµ¥Ã÷ÁË£¬·ûºÏǰ¶Ë¿ª·¢Õߵıà³Ìϰ¹ß£¬ÍƼöJsTestDriver¿ÉÒÔºÍQUnitµÈ¿ò¼Ü½áºÏ£¬¿ÉÒÔͬʱ²â¶à¸öä¯ÀÀÆ÷¡£µ«°²×°¸´ÔÓ£¬Ö»ÄÜÔÚ¿ØÖÆÌ¨ÏÔʾ£¬²»ÓѺ㬲»¹»ÇåÎú¡£FireUnitСÇÉÁé»î£¬¼ÓÉÏFirebugµÄÈËÆøÓ¦¸ÃºÜÊÜ»¶Ó­¡£Èç¹ûÐèÒª½øÐÐ×Ô¶¯»¯²âÊÔ£¬ ¶àÁ˽âÒ»ÏÂJasmineºÍJsTestDriver£¬±¾ÎÄδÉîÈë¡£

   
3441 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

LoadRunnerÐÔÄܲâÊÔ»ù´¡
Èí¼þ²âÊÔ½á¹û·ÖÎöºÍÖÊÁ¿±¨¸æ
ÃæÏò¶ÔÏóÈí¼þ²âÊÔ¼¼ÊõÑо¿
Éè¼Æ²âÊÔÓÃÀýµÄËÄÌõÔ­Ôò
¹¦ÄܲâÊÔÖйÊÕÏÄ£Ð͵Ľ¨Á¢
ÐÔÄܲâÊÔ×ÛÊö

ÐÔÄܲâÊÔ·½·¨Óë¼¼Êõ
²âÊÔ¹ý³ÌÓëÍŶӹÜÀí
LoadRunner½øÐÐÐÔÄܲâÊÔ
WEBÓ¦ÓõÄÈí¼þ²âÊÔ
ÊÖ»úÈí¼þ²âÊÔ
°×ºÐ²âÊÔ·½·¨Óë¼¼Êõ

ij²©²ÊÐÐÒµ Êý¾Ý¿â×Ô¶¯»¯²âÊÔ
IT·þÎñÉÌ Web°²È«²âÊÔ
IT·þÎñÉÌ ×Ô¶¯»¯²âÊÔ¿ò¼Ü
º£º½¹É·Ý µ¥Ôª²âÊÔ¡¢Öع¹
²âÊÔÐèÇó·ÖÎöÓë²âÊÔÓÃÀý·ÖÎö
»¥ÁªÍøweb²âÊÔ·½·¨Óëʵ¼ù
»ùÓÚSeleniumµÄWeb×Ô¶¯»¯²âÊÔ