精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

對(duì)JavaScript進(jìn)行單元測(cè)試的工具

開發(fā) 測(cè)試
有些開發(fā)人員抱怨 JavaScript 很難測(cè)試。隨著現(xiàn)在對(duì) Web 應(yīng)用程序客戶端的關(guān)注,對(duì) JavaScript 進(jìn)行單元測(cè)試就顯得尤為必要。現(xiàn)在,您可以使用工具來保證代碼的穩(wěn)定性。在本文中,您將了解一些對(duì) JavaScript 進(jìn)行單元測(cè)試的最常用的工具:QUnit、YUI Test 和 JSTestDriver。本文將會(huì)通過代碼示例讓您了解這些樣測(cè)試用例樣例。

簡(jiǎn)介

單元測(cè)試關(guān)注的是驗(yàn)證一個(gè)模塊或一段代碼的執(zhí)行效果是否和設(shè)計(jì)或預(yù)期一樣。有些開發(fā)人員認(rèn)為,編寫測(cè)試用例浪費(fèi)時(shí)間而寧愿去編寫新的模塊。然而,在處理大型應(yīng)用程序時(shí),單元測(cè)試實(shí)際上會(huì)節(jié)省時(shí)間;它能幫助您跟蹤問題并安全地更新代碼。

常用縮略語

DOM:文檔對(duì)象模型

HTML:超文本標(biāo)記語言

JSTD:JSTestDriver

YUI:Yahoo! User Interface

在過去,只對(duì)服務(wù)器端語言進(jìn)行單元測(cè)試。但前端組件越來越復(fù)雜,使得編寫 JavaScript 代碼測(cè)試用例的需求日益提高。如果您不經(jīng)常編寫客戶端腳本的測(cè)試,學(xué)習(xí)進(jìn)度可能非常難。測(cè)試用戶界面可能需要在思路上做一些調(diào)整。(有些程序開發(fā)人員一時(shí)半會(huì)還不能相信 JavaScript 是合適的編程語言。)

在本文中,您將學(xué)習(xí)如何使用 QUnit、YUI Test 和 JSTestDriver 對(duì) JavaScript 進(jìn)行單元測(cè)試。

下載 本文的源代碼。

JavaScript 單元測(cè)試

為了演示 JavaScript 測(cè)試,這一節(jié)將分析 JavaScript 中一個(gè)基本函數(shù)測(cè)試用例。清單 1 顯示了要測(cè)試的函數(shù):將 3(作為一個(gè)數(shù))添加到傳遞的變量中。

清單 1. 源代碼 (example1/script.js)

  1. function addThreeToNumber(el){  
  2.     return el + 3;  

清單 2 在自執(zhí)行的函數(shù)中包含了測(cè)試用例。

清單 2.測(cè)試用例 (example1/test.js)

  1. (function testAddThreeToNumber (){  
  2.     var a = 5,  
  3.         valueExpected= 8;  
  4.    
  5.     if (addThreeToNumber (a) === valueExpected) {  
  6.         console.log("Passed!");  
  7.     } else {  
  8.         console.log("Failed!");  
  9.     }  
  10. }()); 

將 5 傳遞給測(cè)試的函數(shù)之后,測(cè)試檢查返回值是 8。如果測(cè)試成功,就會(huì)在一個(gè)現(xiàn)有瀏覽器的控制臺(tái)中打印出 Passed!;否則就會(huì)出現(xiàn) Failed!。如果要運(yùn)行測(cè)試,需要按照以下步驟進(jìn)行操作:

1. 將兩個(gè)腳本文件導(dǎo)入作為測(cè)試運(yùn)行程序的 HTML 頁(yè)面中,如清單 3 所示。

2. 在瀏覽器中打開頁(yè)面。

清單 3. HTML 頁(yè)面 (example1/runner.html)

  1. <!DOCTYPE html> 
  2. <html> 
  3.      <head> 
  4.          <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
  5.          <title>Example 1</title> 
  6.          <script type="text/javascript" src="js/script.js"></script> 
  7.           <script type="text/javascript" src="js/test.js"></script> 
  8.      </head> 
  9.      <body></body> 
  10. </html> 

您可以不使用瀏覽器控制臺(tái),而是將結(jié)果打印在頁(yè)面或由 alert() 方法生成的彈出窗口中。

斷言是測(cè)試用例中的核心元素,用來驗(yàn)證某一條件是否滿足。例如,在 清單 2 中,addThreeToNumber (a) === valueExpected 就是一個(gè)斷言。

如果您擁有很多用例并帶有很多斷言,那么使用框架就會(huì)方便很多。下面的內(nèi)容將會(huì)重點(diǎn)介紹一些最流行的 JavaScript 單元測(cè)試框架:QUnitYUI Test 和 JSTestDriver

#p#

QUnit 入門

QUnit 是與 JUnit(Java 編程)類似的單元測(cè)試框架,jQuery 團(tuán)隊(duì)用它來對(duì) jQuery 庫(kù)進(jìn)行單元測(cè)試。要使用 QUnit,需要按照以下方法:

1. 下載 qunit.css 文件和 qunit.js 文件(參閱 參考資料)。

2. 創(chuàng)建一個(gè) HTML 頁(yè)面,其中包含導(dǎo)入剛下載的 CSS 和 JavaScript 文件的特定標(biāo)簽。

清單 4 顯示了適用于 QUnit 的標(biāo)準(zhǔn)的 HTML 運(yùn)行程序。

清單 4. HTML 運(yùn)行程序 (qunit/runner.html) 

  1. <!DOCTYPE html> 
  2. <html> 
  3.     <head> 
  4.         <meta charset="UTF-8" /> 
  5.         <title>QUnit Test Suite</title> 
  6.         <link rel="stylesheet" href="css/qunit.css" type="text/css" media="screen"> 
  7.         <script type="text/javascript" src="js/lib/qunit.js"></script> 
  8.     </head> 
  9.     <body> 
  10.         <h1 id="qunit-header">QUnit Test Suite</h1> 
  11.         <h2 id="qunit-banner"></h2> 
  12.         <div id="qunit-testrunner-toolbar"></div> 
  13.         <h2 id="qunit-userAgent"></h2> 
  14.         <ol id="qunit-tests"></ol> 
  15.         <div id="qunit-fixture">test markup</div> 
  16.     </body> 
  17. </html> 

假設(shè)您擁有兩個(gè)函數(shù)分別負(fù)責(zé)將溫度從攝氏轉(zhuǎn)換為華氏,并轉(zhuǎn)換回來。清單 5 顯示了執(zhí)行此轉(zhuǎn)換的腳本。

清單 5. 轉(zhuǎn)換 (qunit/js/script.js)

  1. function convertFromCelsiusToFahrenheit(c){  
  2.     var f = c * (9/5) + 32;  
  3.     return f;  
  4. }  
  5.    
  6. function convertFromFahrenheitToCelsius(f){  
  7.     var c = (f - 32) * (5/9);  
  8.     return c;  

清單 6 顯示了各自的測(cè)試用例。

清單 6. 測(cè)試用例 (qunit/js/test.js)

  1. module ("Temperature conversion")  
  2.    
  3. test("conversion to F"function(){  
  4.     var actual1 = convertFromCelsiusToFahrenheit(20);  
  5.     equal(actual1, 68, ?Value not correct?);  
  6.    
  7.     var actual2 = convertFromCelsiusToFahrenheit(30);  
  8.     equal(actual2, 86, ?Value not correct?);  
  9. })  
  10.    
  11. test("conversion to C"function(){  
  12.     var actual1 = convertFromFahrenheitToCelsius(68);  
  13.     equal(actual1, 20, ?Value not correct?);  
  14.    
  15.     var actual2 = convertFromFahrenheitToCelsius(86);  
  16.     equal(actual2, 30, ?Value not correct?);  
  17. }) 

QUnit 中的測(cè)試用例由 test() 方法定義。邏輯是包含在傳入函數(shù)的第二個(gè)參數(shù)中。在清單 6 中,兩個(gè)測(cè)試分別名為 conversion to F和 conversion to C。每個(gè)測(cè)試包含兩個(gè)斷言。該測(cè)試中的斷言使用了 equal() 方法。equal() 函數(shù)可以將預(yù)期值與測(cè)試函數(shù)的實(shí)際值相比較。 equal() 方法中的第三個(gè)參數(shù)是錯(cuò)誤情況下顯示的消息。

還可以通過 module() 函數(shù)將測(cè)試組織到模塊中。在清單 6 中,Temperature conversion 模塊含有這兩個(gè)測(cè)試。

如果要運(yùn)行測(cè)試:

1. 在 HTML 運(yùn)行程序中包含源代碼和測(cè)試文件,如清單 7 所示。

2. 在瀏覽器中打開頁(yè)面。

清單 7. 在運(yùn)行程序中包含 script.js 和 test.js

  1. ...<script type="text/javascript" src="js/script.js"></script>  
  2. <script type="text/javascript" src="js/test.js"></script>  
  3. ... 

圖 1 顯示了 QUnit 如何在瀏覽器 (Firefox) 中顯示結(jié)果。

圖 1. QUnit 結(jié)果

屏幕截圖顯示 4 個(gè)測(cè)試都成功了。 

清單 6 中的斷言使用了 equal() 方法,但它不是 QUnit 提供的惟一斷言。QUnit 提供的其他斷言包括 ok() 或 strictEqual()。清單 8 顯示了正在執(zhí)行的方法。

#p#

清單 8. 更多的斷言

  1. module ("Other assertion");  
  2. test("assertions"function(){  
  3.     ok(true);  
  4.     ok(3);  
  5.     strictEqual("c""c");  
  6.     equal (3, "3");  
  7. }); 

ok() 函數(shù)檢查第一個(gè)參數(shù)為 true;strictEqual() 驗(yàn)證第一個(gè)參數(shù)嚴(yán)格等于第二個(gè)參數(shù)。在這些代碼背后,strictEqual() 使用了=== 運(yùn)算符,equal() 使用了 == 運(yùn)算符。

如果測(cè)試失敗,QUnit 還提供了有用的信息。將清單 8 中的代碼改成清單 9 中的代碼,讓上一次斷言執(zhí)行失敗。

清單 9. 上一次斷言出現(xiàn)的錯(cuò)誤

  1. module ("Other assertion");  
  2. test("assertions"function(){  
  3.     ok(true);  
  4.     ok(3);  
  5.     strictEqual("c""c");  
  6.     strictEqual (3, "3");  
  7. }); 

圖 2 顯示了 QUnit 執(zhí)行清單 9 代碼所返回的結(jié)果。

圖 2. QUnit 結(jié)果:上次測(cè)試失敗

對(duì) JavaScript 進(jìn)行單元測(cè)試的工具

結(jié)果非常詳細(xì),而且很容易查到上次斷言的預(yù)期值與實(shí)際值有什么不同。

QUnit 另一項(xiàng)特性能讓您在模塊中的所有測(cè)試執(zhí)行之前或之后執(zhí)行命令。module() 函數(shù)接受 setup() 和 teardown() 回調(diào)作為第二個(gè)參數(shù)。使用 setup() 函數(shù)更新 清單 6 ,如清單 10 所示。

清單 10. setup() (qunit/js/test-setup.js)

  1. module ("Temperature conversion", {  
  2.     setup : function() {  
  3.         this.celsius1 = 20;  
  4.         this.celsius2 = 30;  
  5.    
  6.         this.fahrenheit1 = 68;  
  7.         this.fahrenheit2 = 86;  
  8.     }  
  9. });  
  10. test("conversion to F"function(){  
  11.     var actual1 = convertFromCelsiusToFahrenheit(this.celsius1);  
  12.     equal(actual1, this.fahrenheit1);  
  13.    
  14.     var actual2 = convertFromCelsiusToFahrenheit(this.celsius2);  
  15.     equal(actual2, this.fahrenheit2);  
  16. });  
  17. test("conversion to C"function(){  
  18.     var actual1 = convertFromFahrenheitToCelsius(this.fahrenheit1);  
  19.     equal(actual1, this.celsius1);  
  20.    
  21.     var actual2 = convertFromFahrenheitToCelsius(this.fahrenheit2);  
  22.     equal(actual2, this.celsius2);  
  23. }); 

該示例移動(dòng)了設(shè)置部分的斷言所使用的值,以避免在測(cè)試的邏輯中使用這些值。

QUnit 還通過 asyncTest() 函數(shù)提供對(duì)異步測(cè)試的支持,如果您使用 Asynchronous JavaScript and XML (Ajax),這是非常有用的特性。在這樣的環(huán)境中,expect() 函數(shù)可以讓你輕松地驗(yàn)證測(cè)試中運(yùn)行的斷言數(shù)量。

YUI Test:獨(dú)立的單元測(cè)試模塊

YUI Test 是 YUI 庫(kù)(Yahoo!)的一個(gè)組件,是一個(gè)可擴(kuò)展而完整的單元測(cè)試框架。如果要使用 YUI Test,需要:

1. 將 YUI 導(dǎo)入 HTML 運(yùn)行程序,如下所示。

  1. <script src="http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js"></script> 

如以上代碼所示,此樣例使用了 YUI Test 第 3 版本。

2. 在測(cè)試腳本文件中,實(shí)例化 YUI 函數(shù)。加載所需的模塊,test 和 console,如清單 11 所示。

#p#

清單 11.下載 test 和 console YUI 模塊

  1. YUI().use("test""console"function (Y) {  
  2.      // Test cases go here  
  3. }); 

test 模塊顯然是用于測(cè)試的。console 模塊并不是強(qiáng)制性的,但本示例將用它來打印結(jié)果。測(cè)試用例將會(huì)進(jìn)入回調(diào)中,并以全局的 Y實(shí)例作為參數(shù)。

YUI Test 使用 Y.Test.Case() 構(gòu)造函數(shù)實(shí)例化新測(cè)試用例,使用 Y.Test.Suite() 構(gòu)造函數(shù)來實(shí)例化測(cè)試套件。測(cè)試套件與 JUnit 類似,包含若干個(gè)測(cè)試用例。可以使用 add() 方法將測(cè)試用例添加到測(cè)試套件中。

我們使用 YUI test 重新測(cè)試 清單 5 中的源代碼。清單 12 顯示了如何創(chuàng)建測(cè)試用的套件和測(cè)試用例。

清單 12. 測(cè)試套件和用例

  1. YUI().use("test""console"function (Y) {  
  2.    
  3.      var suite = new Y.Test.Suite("Temperature conversion suite");  
  4.    
  5.      //add a test case  
  6.      suite.add(new Y.Test.Case({  
  7.          name:"Temperature conversion?  
  8.      ));  
  9. }); 

清單 12 生成了一個(gè)名為 Temperature conversion suite 的套件和一個(gè)名為 Temperature conversion 的測(cè)試用例。現(xiàn)在,可以將測(cè)試方法寫入對(duì)象文本中,作為參數(shù)傳遞給 Y.Test.Case 構(gòu)造函數(shù),如清單 13 所示。

清單 13. 測(cè)試用例與測(cè)試方法

  1. suite.add(new Y.Test.Case({  
  2.     name:"Temperature conversion",  
  3.    
  4.     setUp : function () {  
  5.         this.celsius1 = 20;  
  6.         this.celsius2 = 30;  
  7.    
  8.         this.fahrenheit1 = 68;  
  9.         this.fahrenheit2 = 86;  
  10.     },  
  11.    
  12.     testConversionCtoF: function () {  
  13.         Y.Assert.areEqual(this.fahrenheit1,          
  14. convertFromCelsiusToFahrenheit(this.celsius1));  
  15.    
  16.         Y.Assert.areEqual(this.fahrenheit2,  
  17. convertFromCelsiusToFahrenheit(this.celsius2));  
  18.     },  
  19.    
  20.     testConversionFtoC: function () {  
  21.         Y.Assert.areEqual(this.celsius1,  
  22. convertFromFahrenheitToCelsius(this.fahrenheit1));  
  23.    
  24.         Y.Assert.areEqual(this.celsius2,  
  25. convertFromFahrenheitToCelsius(this.fahrenheit2));  
  26.     }  
  27. })); 

您可能注意到,在清單 13 中:

1. 可使用 setUp() 方法。YUI Test 在測(cè)試用例和測(cè)試套件層提供了 setUp() 和 tearDown() 方法。

2. 測(cè)試方法名以 test 單詞開頭,它們包含斷言。

3. 本示例使用 Y.Assert.areEqual() 斷言類型,它與 QUnit 中的 equal() 函數(shù)類似。YUI Test 為斷言提供了多種方法,如:

1). Y.Assert.areSame(),它類似于 QUnit 中的 strictEqual()。

2). 數(shù)據(jù)類型斷言(Y.Assert.isArray()、Y.Assert.isBoolean()、Y.Assert.isNumber() 等等)。

3). 特殊值斷言(Y.Assert.isFalse()、Y.Assert.isNaN()、Y.Assert.isNull() 等等)。

要啟動(dòng) YUI 中的測(cè)試,需要使用 Y.Test.Runner 對(duì)象。還需要將套件或測(cè)試用例添加到對(duì)象中,然后調(diào)用 run() 方法來運(yùn)行測(cè)試。清單 14 顯示了如何運(yùn)行 清單 13 中創(chuàng)建的測(cè)試。

清單 14. 運(yùn)行 YUI test

  1. Y.Test.Runner.add(suite);  
  2. Y.Test.Runner.run(); 

在默認(rèn)情況下,結(jié)果會(huì)打印在瀏覽器的控制臺(tái)中(如果瀏覽器支持控制臺(tái)的話)。更好的方法是使用 Yahoo! Console 組件來打印結(jié)果。如果要使用 Yahoo! Console 組件,需要采用 Y.Console 構(gòu)造函數(shù)將控制臺(tái)綁定到 HTML 運(yùn)行程序的 DOM 元素中,如清單 15 所示。

#p#

清單 15. Yahoo! Console

  1. var console = new Y.Console({  
  2.     verbose: true,  
  3.     newestOnTop: false,  
  4.     width:"600px" 
  5. });  
  6.    
  7. console.render('#testLogger'); 

清單 15 顯示了如何使用幾個(gè)參數(shù)配置控制臺(tái)。該控制臺(tái)會(huì)在 DOM 元素內(nèi)部呈現(xiàn),其 id 為 testLogger。

需要更新 HTML 運(yùn)行程序。添加該控制臺(tái)所引用的 DOM 元素,如清單 16 所示。

  1. <body> 
  2.      <div id="testLogger"></div> 
  3. </body> 

本例為 <body> 設(shè)置了一個(gè)類,名為 yui3-skin-sam。該類負(fù)責(zé)定義控制臺(tái)的皮膚。

圖 3 顯示了運(yùn)行測(cè)試之后的控制臺(tái)。

圖 3. YUI Test 結(jié)果

對(duì) JavaScript 進(jìn)行單元測(cè)試的工具

使用 JSTestDriver 輕松測(cè)試

通過使用功能強(qiáng)大的 JSTestDriver (JSTD) 工具,您能夠在多個(gè)瀏覽器中從命令行運(yùn)行 JavaScript。JSTD 帶有一個(gè) JAR 文件,它可以讓您啟動(dòng)服務(wù)器、捕獲一或多個(gè)瀏覽器并在這些瀏覽器中運(yùn)行測(cè)試。因?yàn)閾碛猩鲜龅膬蓚€(gè)框架,您不需要 HTML 運(yùn)行程序,但您需要一個(gè)配置文件。圖 17 顯示了配置文件。

清單 17. 配置文件 (jsTestDriver.conf)

  1. server: http://localhost:4224  
  2. load:  
  3.   - js/src/*.js  
  4. test:  
  5.   - js/test/*.js 

該配置文件是用 YAML 編寫的,這是一種很好的配置文件格式。它包含了要啟動(dòng)的服務(wù)器以及源代碼和測(cè)試文件的位置信息。

要使用 JSTD 來執(zhí)行測(cè)試:

1. 啟動(dòng)測(cè)試服務(wù)器。從命令行中,進(jìn)入到保存 jsTestDriver.jar 的文件夾,并執(zhí)行以下命令:

  1. java -jar JsTestDriver-1.3.3d.jar -port 4224 

清單 17 中指定的端口應(yīng)該與配置文件中指定的一樣。在默認(rèn)情況下,JSTD 會(huì)在 JAR 文件所在的同一個(gè)目錄下查找 jsTestDriver.conf 文件。

2. 在測(cè)試中,通過將 URL http://localhost:4224/capture 復(fù)制粘貼到測(cè)試中的瀏覽器,在服務(wù)器上注冊(cè)一個(gè)或多個(gè)瀏覽器。

測(cè)試之前示例中所使用的相同代碼(清單 5),但這次使用 JSTD 語法。清單 18 顯示了如何轉(zhuǎn)換 清單 10 的 QUnit 和 清單14 的 YUI Test 中的代碼。

清單 18. JSTD 測(cè)試

  1. TestCase("Temperature conversion", {  
  2.     setUp : function () {  
  3.         this.celsius1 = 20;  
  4.         this.celsius2 = 30;  
  5.    
  6.         this.fahrenheit1 = 68;  
  7.         this.fahrenheit2 = 86;  
  8.     },  
  9.    
  10.     testConversionCtoF: function () {  
  11.         assertSame(this.fahrenheit1, convertFromCelsiusToFahrenheit(this.celsius1));  
  12.         assertSame(this.fahrenheit2, convertFromCelsiusToFahrenheit(this.celsius2));  
  13.     },  
  14.    
  15.     testConversionFtoC: function () {  
  16.         assertSame(this.celsius1, convertFromFahrenheitToCelsius(this.fahrenheit1));  
  17.         assertSame(this.celsius2, convertFromFahrenheitToCelsius(this.fahrenheit2));  
  18.     }  
  19. }); 

清單 18 中的代碼與 YUI 版本差別不大。JSTD 使用 TestCase() 函數(shù)來定義測(cè)試用例。您可以使用內(nèi)聯(lián)聲明來定義測(cè)試方法,如清單 18 所示,或者可以擴(kuò)展 TestCase 實(shí)例的原型。每個(gè)測(cè)試用例還可以使用 SetUp() 和 tearDown() 方法。

如果要運(yùn)行測(cè)試,運(yùn)行以下命令:

  1. java -jar JsTestDriver-1.3.3d.jar --tests all 

圖 4 顯示了終端上的輸出結(jié)果。

圖 4. JSTD 測(cè)試的結(jié)果

[[101769]]

測(cè)試會(huì)傳入之前捕獲到的所有瀏覽器(Chrome 15、Safari 5 和 Firefox 7)。

JSTD 還能與您偏好的連續(xù)集成系統(tǒng)很好地集成,成為連續(xù)版本的一部分。它還能與 IDE 集成,如 Eclipse(插件)或 TextMate(包)。

結(jié)束語

隨著現(xiàn)在對(duì) Web 應(yīng)用程序客戶端的關(guān)注,對(duì) JavaScript 進(jìn)行單元測(cè)試就顯得尤為必要。有很多框架可以幫助您完成此任務(wù),本文介紹了三個(gè)最流行的框架:QUnit、YUI Test 和 JSTestDriver。

QUnit 非常簡(jiǎn)單,很適合初學(xué)者的框架。

YUI Test 是個(gè)全面的工具,適合熟悉 YUI 庫(kù)的用戶。

JSTestDriver 可在多個(gè)瀏覽器中運(yùn)行測(cè)試。

來源:IBM DeveloperWorks

責(zé)任編輯:林師授 來源: IBMDW
相關(guān)推薦

2012-11-01 11:32:23

IBMdw

2017-12-12 13:17:36

機(jī)器學(xué)習(xí)代碼單元測(cè)試

2017-01-16 12:12:29

單元測(cè)試JUnit

2017-01-14 23:26:17

單元測(cè)試JUnit測(cè)試

2013-06-04 09:49:04

Spring單元測(cè)試軟件測(cè)試

2017-03-23 16:02:10

Mock技術(shù)單元測(cè)試

2017-01-14 23:42:49

單元測(cè)試框架軟件測(cè)試

2021-03-28 23:03:50

Python程序員編碼

2011-11-30 22:03:49

ibmdwJava

2011-10-20 10:09:14

JavaScript

2009-08-19 09:00:48

單元測(cè)試框架自動(dòng)化測(cè)試

2013-12-18 09:56:20

AngularJS測(cè)試

2011-06-20 16:41:59

單元測(cè)試

2021-03-24 09:30:02

Jupyter not單元測(cè)試代碼

2009-06-26 17:48:38

JSF項(xiàng)目單元測(cè)試JSFUnit

2023-08-02 13:59:00

GoogleTestCTest單元測(cè)試

2019-12-18 10:25:12

機(jī)器學(xué)習(xí)單元測(cè)試神經(jīng)網(wǎng)絡(luò)

2023-07-26 08:58:45

Golang單元測(cè)試

2011-05-16 16:52:09

單元測(cè)試徹底測(cè)試

2023-12-11 08:25:15

Java框架Android
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

色哟哟国产精品| 美日韩一区二区| 精品国精品国产尤物美女| 午夜免费福利小电影| 噜噜噜噜噜在线视频| 日日夜夜精品免费视频| 久久久91精品| 玖玖爱在线精品视频| 亚洲电影有码| 亚洲综合区在线| 日韩高清国产精品| 亚洲国产精品久久久久久6q| 免费视频一区| 欧美成人免费在线观看| 九色porny自拍视频| 9999在线精品视频| 日韩人体视频一二区| 特级西西人体www高清大胆| 日韩精品一二| 国产精品一级二级三级| 日本午夜在线亚洲.国产| 国产女人被狂躁到高潮小说| 国产成人精品999在线观看| 欧美一区二区三区四区在线观看| 97成人在线观看视频| 先锋影音在线资源站91| 国产欧美一区在线| 久久精品日韩精品| 精品人妻一区二区三区三区四区 | 成年人视频免费| 亚洲图片在线| 久久国产精品电影| 网站永久看片免费| 视频精品在线观看| 日韩h在线观看| 国产清纯白嫩初高中在线观看性色| 成人av集中营| 欧洲一区二区三区免费视频| 久激情内射婷内射蜜桃| 爱情岛论坛亚洲品质自拍视频网站| 国产精品嫩草99a| 日韩偷拍一区二区| 美女欧美视频在线观看免费| 成人性生交大片免费看中文 | av免费在线不卡| 麻豆精品新av中文字幕| 国产成人拍精品视频午夜网站| 91精品国产高潮对白| 欧美三级不卡| 久久久久久久一| 九九在线观看视频| 伊人精品成人久久综合软件| 欧美肥老妇视频| 欧美日韩国产精品综合 | 美日韩丰满少妇在线观看| 在线观看日本黄色| 久久神马影院| 日韩在线观看免费高清完整版| 中文天堂资源在线| 四虎成人av| 久久综合免费视频| 老女人性淫交视频| 激情视频一区二区三区| 久久免费视频网站| 91美女免费看| 天堂在线亚洲视频| 国产精品无码专区在线观看| 91精品国产乱码久久久| 国产乱子伦一区二区三区国色天香 | 清纯唯美一区二区三区| 国产日本在线观看| 国产精品乱码久久久久久| 在线天堂一区av电影| 国产剧情在线| 亚洲超丰满肉感bbw| 成年人视频观看| 成人免费黄色| 日韩一二在线观看| 亚州av综合色区无码一区| 亚洲桃色综合影院| 日韩在线免费av| 老熟妇高潮一区二区三区| 国产一区欧美| 青草成人免费视频| 国产精品久久久久久久成人午夜 | 精品中文字幕在线播放| 一区二区三区四区在线看| 在线观看日韩欧美| 欧美日韩精品在线观看视频| 亚洲欧美视频一区二区三区| 国产精品久久久久久久久久免费 | 日韩精品第二页| 精品久久久久久久久久久久久久久| 亚洲 欧美 日韩在线| 精品一区电影| 久久97精品久久久久久久不卡| 91精品国产乱码久久久张津瑜| 三级久久三级久久久| 亚洲一区二区三区四区视频| 天堂a√中文在线| 18成人在线观看| 欧美三级一级片| 欧美大片网站| 亚洲跨种族黑人xxx| 亚洲国产123| 媚黑女一区二区| 99久久99久久精品国产片| 裸体xxxx视频在线| 亚洲国产日日夜夜| 不卡的在线视频| 在线日本制服中文欧美| 色综合久久精品亚洲国产| 在线观看亚洲黄色| av中文字幕在线不卡| 国产高清免费在线| 日本欧美一区| 日韩大陆欧美高清视频区| 欧美成人精品欧美一级私黄| 免费观看日韩av| 欧美久久久久久| 国产极品人妖在线观看| 欧美精品123区| 中文字幕免费高清| 国产欧美精品久久| julia一区二区中文久久94| 免费网站免费进入在线| 91久久精品国产91性色tv| a级一a一级在线观看| 你懂的国产精品永久在线| 国产美女91呻吟求| 高清性色生活片在线观看| 欧美性xxxx极品hd满灌| 国产精九九网站漫画| 牛夜精品久久久久久久99黑人| 国产日韩在线观看av| 国产精品麻豆一区二区三区| 岛国视频午夜一区免费在线观看| 成年女人免费视频| 综合av在线| 91夜夜未满十八勿入爽爽影院| www日韩tube| 在线观看国产91| 精品人伦一区二区三电影| 国产视频一区欧美| 久久香蕉综合色| 色戒汤唯在线| 亚洲精品在线视频| 国产情侣自拍av| 97精品电影院| 69堂免费视频| 亚洲精品aaaaa| 欧洲中文字幕国产精品 | 色香阁99久久精品久久久| 免费观看日批视频| 国产女主播一区| 亚洲这里只有精品| 欧美黄色大片在线观看| 91免费观看网站| 性xxxxfjsxxxxx欧美| 精品国产91乱码一区二区三区| 久久丫精品久久丫| www.欧美日韩| 国产精彩免费视频| 成人午夜国产| 91九色蝌蚪国产| 欧美1—12sexvideos| 亚洲国产高潮在线观看| 久久国产精品免费看| 国产免费成人在线视频| 毛片毛片毛片毛| 午夜性色一区二区三区免费视频| 成人欧美一区二区三区视频 | 成年人视频在线看| 777亚洲妇女| 久久亚洲AV无码| 久久久91精品国产一区二区三区| 在线观看的毛片| 五月久久久综合一区二区小说| 91久久极品少妇xxxxⅹ软件| 爱草tv视频在线观看992| 亚洲色无码播放| 92久久精品一区二区| 亚洲午夜激情网页| 国产激情在线免费观看| 久久99精品国产| 国产老熟妇精品观看| 狠狠色狠狠色综合婷婷tag| 成人国产在线视频| 黄色在线网站噜噜噜| 国产亚洲精品综合一区91| av观看在线免费| 色久优优欧美色久优优| 看片网站在线观看| 久久综合国产精品| 亚洲五月激情网| 免费看的黄色欧美网站 | 中文一区二区| 亚洲不卡中文字幕| 成人精品毛片| 国产这里只有精品| 色一区二区三区| 久久亚洲欧美日韩精品专区| 日韩精品视频无播放器在线看 | 蜜臀久久99精品久久久| 欧洲一区二区三区免费视频| 精品无码人妻一区二区三| 欧美激情在线一区二区三区| 亚洲麻豆一区二区三区| 麻豆91在线观看| 久久精品免费一区二区| 欧美激情视频一区二区三区在线播放 | 一级特黄色大片| 一本色道久久综合亚洲aⅴ蜜桃 | 97人人模人人爽人人喊38tv| 国产精品高清乱码在线观看| 久久久久久久久久久国产| 色网站在线看| 亚洲人成电影网站色| 欧美 日韩 国产 成人 在线| 3atv一区二区三区| 中文字幕视频二区| 色偷偷成人一区二区三区91| 日本少妇bbwbbw精品| 一区二区在线观看免费视频播放| 黄色片网站免费| 久久久蜜臀国产一区二区| 日本不卡视频一区| 国产成人一级电影| 亚洲黄色av片| 老司机精品视频一区二区三区| 日韩少妇内射免费播放18禁裸乳| 伊人久久大香线蕉综合热线| 亚洲国产一二三精品无码| 国产高清一区二区| 一本久道久久综合狠狠爱亚洲精品| 国产一区二区电影在线观看| 久久久久资源| 亚洲视频分类| 欧美一区二区视频17c| 蜜臀av免费一区二区三区| 国产欧美综合精品一区二区| 97视频一区| 翡翠波斯猫1977年美国| 亚洲三级av| 国产精品一区二区免费| 澳门久久精品| 国产精品视频在线免费观看| 波多野结衣欧美| 国产精品免费一区二区| 国内自拍欧美| 国产一区二区无遮挡| 神马久久av| 日本一区二区三区www| 日韩1区2区| 国产日韩视频在线播放| 一本到12不卡视频在线dvd| 男女爱爱视频网站| 狠狠爱www人成狠狠爱综合网| 999久久欧美人妻一区二区| 欧美日一区二区三区在线观看国产免| 男人天堂新网址| 99精品视频免费全部在线| 免费无码国产v片在线观看| 久久久久久久欧美精品| www.xxx亚洲| 久久99蜜桃精品| 4438x全国最大成人| www.亚洲色图.com| 四虎国产精品成人免费入口| 日本一区二区三区国色天香 | 欧美亚洲综合一区| 97超碰资源站| 亚洲第一区中文99精品| 欧美大片aaa| 中文字幕日韩欧美在线视频| 成人黄色在线电影| 97热精品视频官网| 电影亚洲一区| 91成人免费视频| 思热99re视热频这里只精品| 手机成人在线| 欧美另类女人| www.99在线| 国产成人aaa| 人妻一区二区视频| 一区二区三区在线免费观看| www.国产成人| 欧美精选午夜久久久乱码6080| 亚洲福利在线观看视频| 亚洲午夜未删减在线观看| 中文字幕在线观看网站| 欧美重口另类videos人妖| 91麻豆精品| 久久久com| 66国产精品| av免费中文字幕| 国产精品一级在线| 久久精品三级视频| 亚洲一区在线视频| 中文字幕在线播出| 亚洲精品福利在线| 国产在线高清视频| 国产成人在线一区| 国产精品17p| 亚洲一区二区三区精品动漫| 亚洲清纯自拍| 宇都宫紫苑在线播放| 国产欧美日韩另类一区| 中文在线观看免费网站| 欧美电影影音先锋| 国模吧精品人体gogo| 韩国三级电影久久久久久| 一区二区三区日本视频| 欧美激情视频一区二区三区| 欧美日韩一区自拍| 色婷婷一区二区三区在线观看| 国产欧美日韩另类视频免费观看| 日本网站免费观看| 日韩精品一区二区在线观看| 日韩在线观看www| 国产精品69精品一区二区三区| 精品国产午夜肉伦伦影院| 干日本少妇视频| 蜜桃av一区二区| www.99热| 在线精品视频免费播放| 天堂中文在线8| 午夜精品一区二区三区视频免费看| 精品国产亚洲一区二区三区大结局 | 欧美一级电影久久| 大桥未久女教师av一区二区| 伊人再见免费在线观看高清版 | 日韩二区在线观看| 亚洲一区二区观看| 午夜成人在线视频| 后入内射欧美99二区视频| 欧美成人在线免费| 久久久久亚洲精品中文字幕| 中文字幕av导航| 激情偷乱视频一区二区三区| 网站永久看片免费| 欧美精品 国产精品| 秋霞a级毛片在线看| 成人精品福利视频| 99久久www免费| 性欧美在线视频| 亚洲视频在线观看一区| 国产又粗又黄又爽| 日韩最新在线视频| 久久久91麻豆精品国产一区| 中文字幕精品在线播放| 国产精品18久久久久久久网站| 青青草偷拍视频| 亚洲精品在线免费观看视频| 成入视频在线观看| 欧美不卡在线一区二区三区| 日韩高清不卡一区二区| 貂蝉被到爽流白浆在线观看| 欧美裸体bbwbbwbbw| av免费看在线| 国产一区二区中文字幕免费看| 在线亚洲欧美| 欧美激情亚洲色图| 欧美日本韩国一区二区三区视频| 国产在线二区| 国产一区二区在线网站| 日韩精品一二三| 久久99久久99精品免费看小说| 91精品国产91热久久久做人人| 牛牛精品视频在线| 欧美xxxx黑人又粗又长密月| 久久精品国产秦先生| 欧美精品入口蜜桃| 亚洲男人天堂网| 99久久久国产| 无码中文字幕色专区| 国产日韩精品一区二区三区在线| 一区二区三区黄| 久久久人成影片一区二区三区| 亚洲素人在线| 一个人看的视频www| 精品久久久久久久久久国产| 77导航福利在线| 国产成人亚洲欧美| 日韩va亚洲va欧美va久久| 亚洲综合网在线| 亚洲免费中文字幕| 久久久久亚洲精品中文字幕| 国产极品美女高潮无套久久久| 自拍偷拍亚洲欧美日韩| 午夜在线视频观看| 亚洲精品欧美极品| 久久精品一本| 免费在线黄色片| 中文精品99久久国产香蕉| 国产精品任我爽爆在线播放| 蜜臀一区二区三区精品免费视频 | 久久成人精品一区二区三区| 亚洲欧洲av| 无码国产精品一区二区高潮|