亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

加速Java應(yīng)用開(kāi)發(fā)速度3——單元/集成測(cè)試+CI

系統(tǒng) 1751 0

《加速Java應(yīng)用開(kāi)發(fā)速度》系列目錄:

加速Java應(yīng)用開(kāi)發(fā)速度1——加速spring/hibernate應(yīng)用調(diào)試時(shí)啟動(dòng)速度

加速Java應(yīng)用開(kāi)發(fā)速度2——加速項(xiàng)目調(diào)試啟動(dòng)速度

加速Java應(yīng)用開(kāi)發(fā)速度3——單元/集成測(cè)試+CI

加速Java應(yīng)用開(kāi)發(fā)速度4——使用模板技術(shù)加速項(xiàng)目開(kāi)發(fā)速度

加速Java應(yīng)用開(kāi)發(fā)速度5——使用腳本自動(dòng)化日常操作?

?

?

大家可能對(duì)如下情景比較熟悉:

  • 如果開(kāi)發(fā)過(guò)SSH的web項(xiàng)目,啟動(dòng)服務(wù)器可能會(huì)比較慢,有的項(xiàng)目甚至需要1分多鐘,甚至更多,這個(gè)啟動(dòng)時(shí)間的等待一般就浪費(fèi)了;
  • 在開(kāi)發(fā)項(xiàng)目時(shí),有些功能比較復(fù)雜,當(dāng)時(shí)覺(jué)得思路特清晰,但是過(guò)了一段時(shí)間后,自己也忘了,完善功能時(shí)頻繁出現(xiàn)bug,降低開(kāi)發(fā)速度;
  • 在維護(hù)項(xiàng)目時(shí),不知道自己修改的對(duì)還是不對(duì),是否存在隱患;維護(hù)速度降下來(lái)了;
  • 如果開(kāi)發(fā)一個(gè)很多人都使用的接口,典型的如用戶系統(tǒng),要保證比如升級(jí)時(shí)向下兼容;
  • 在團(tuán)隊(duì)間協(xié)作時(shí),有時(shí)候只定義好接口,對(duì)方還沒(méi)有給實(shí)現(xiàn),如何進(jìn)行同步開(kāi)發(fā)?

如上問(wèn)題,估計(jì)只要是個(gè)開(kāi)發(fā)人員,都可能遇到過(guò);如果此時(shí)有了單元/集成測(cè)試,那我們能很好的解決這些問(wèn)題。(注:加下來(lái)如果沒(méi)有特殊情況,不刻意強(qiáng)調(diào) 單元測(cè)試/集成測(cè)試,即提到測(cè)試是指的是單元/集成測(cè)試)

?

我從以下幾個(gè)方面介紹測(cè)試:

1、為什么需要測(cè)試?

2、如何進(jìn)行測(cè)試?

3、測(cè)試有哪些好處?

4、一切都需要測(cè)試嗎?

?

1、為什么需要測(cè)試?

測(cè)試的目的是什么?我的理解是:

  • 縮短發(fā)現(xiàn)問(wèn)題到解決問(wèn)題的速度;
  • 給程序一個(gè)修改后能驗(yàn)證是否正確的保證;(回歸測(cè)試)
  • 如果是開(kāi)源軟件,我們可以通過(guò)單元測(cè)試了解其是怎么使用的;比如我之前通過(guò)cglib的單元測(cè)試學(xué)習(xí)過(guò)cglib的使用;

所以如果你遇到如上問(wèn)題,就需要寫測(cè)試。寫測(cè)試可能是為了自己(1、2);也可能是為了幫助別人(3)。

?

2、如何進(jìn)行測(cè)試?

很多朋友不知道如何進(jìn)行測(cè)試,其實(shí)測(cè)試很簡(jiǎn)單,別把它想復(fù)雜了,按照自己的想法測(cè)試每個(gè)功能點(diǎn)是否正確即可。

2.1、測(cè)試流程

單元測(cè)試流程

加速Java應(yīng)用開(kāi)發(fā)速度3——單元/集成測(cè)試+CI

?

集成測(cè)試流程
加速Java應(yīng)用開(kāi)發(fā)速度3——單元/集成測(cè)試+CI
?

集成測(cè)試流程?
加速Java應(yīng)用開(kāi)發(fā)速度3——單元/集成測(cè)試+CI
?

?

可以看出,單元測(cè)試與集成測(cè)試唯一不同點(diǎn)是一個(gè)調(diào)用依賴系統(tǒng)而一個(gè)不調(diào)用;因?yàn)閱卧獪y(cè)試是最小粒度的測(cè)試,如在Java中是測(cè)試一個(gè)類,不會(huì)測(cè)試依賴系統(tǒng);而集成測(cè)試是會(huì)測(cè)試依賴系統(tǒng)的。

?

測(cè)試的步驟:

  1. 準(zhǔn)備環(huán)境
  2. 調(diào)用被測(cè)系統(tǒng)
  3. 驗(yàn)證
  4. 清理環(huán)境

環(huán)境 :也叫做夾具(fixture)或者固件,表示調(diào)用被測(cè)系統(tǒng)時(shí)需要準(zhǔn)備/清理的數(shù)據(jù)等等;

被測(cè)系統(tǒng) :在Java中就是要測(cè)試的類,如UserService;

依賴系統(tǒng) :測(cè)試被測(cè)系統(tǒng)時(shí),其依賴的部分,如UserDao;

測(cè)試用例 :包含測(cè)試方法的類,里邊有很多測(cè)試方法來(lái)測(cè)試被測(cè)系統(tǒng)。

?

接下來(lái)仔細(xì)看看各部分都做了哪些工作。

?

2.2、環(huán)境

?環(huán)境,也叫做夾具(fixture),表示調(diào)用被測(cè)系統(tǒng)時(shí)需要準(zhǔn)備/清理的數(shù)據(jù)等等;保證測(cè)試時(shí)環(huán)境是干凈的,如不被之前的數(shù)據(jù)庫(kù)數(shù)據(jù)影響;保證每次測(cè)試都是在干凈/新鮮的環(huán)境中執(zhí)行的。所謂干凈的環(huán)境表示如當(dāng)前測(cè)試不被之前測(cè)試插入/刪除/修改的數(shù)據(jù)造成影響。在junit中可以使用:

  • @Before(setUp) 安裝夾具或準(zhǔn)備環(huán)境:在測(cè)試用例的每個(gè)測(cè)試方法之前執(zhí)行;比如創(chuàng)建新鮮的被測(cè)系統(tǒng),單元測(cè)試時(shí)安裝Mock的依賴系統(tǒng);
  • @After(tearDown)卸載夾具或清理環(huán)境:在測(cè)試用例的每個(gè)測(cè)試方法之后執(zhí)行;比如數(shù)據(jù)庫(kù)測(cè)試時(shí)回滾事務(wù),刪除數(shù)據(jù);關(guān)閉文件;
  • @BeforeClass:在整個(gè)測(cè)試用例之前執(zhí)行;
  • @AfterClass:在整個(gè)測(cè)試用例之后執(zhí)行;

使用如上方法,而不是直接在測(cè)試方法中安裝/卸載;是因?yàn)椴还苡袥](méi)有異常,@After/@AfterClass都會(huì)執(zhí)行,這樣防止出現(xiàn)異常可能造成環(huán)境是不新鮮的問(wèn)題。

?

如果大家使用spring test來(lái)測(cè)試數(shù)據(jù)庫(kù)相關(guān)的系統(tǒng),可以考慮使用@TransactionConfiguration來(lái)支持默認(rèn)事務(wù)回滾,這樣不會(huì)對(duì)現(xiàn)有系統(tǒng)造成影響。具體可參考《 【第十三章】 測(cè)試 之 13.1 概述 13.2 單元測(cè)試 ——跟我學(xué)spring3 》和《 【第十三章】 測(cè)試 之 13.3 集成測(cè)試 ——跟我學(xué)spring3

?

測(cè)試時(shí)一定要保證環(huán)境是干凈/新鮮 的,才能保證每次測(cè)試的結(jié)果是一樣的。

?

2.3、被測(cè)系統(tǒng)與依賴系統(tǒng)

被測(cè)系統(tǒng):在Java中就是被測(cè)試的Java類。

依賴系統(tǒng):就是被測(cè)試Java類依賴的其他類。

?

如果是單元測(cè)試,一般情況下,會(huì)對(duì)依賴系統(tǒng)進(jìn)行模擬(Mock),即給它一個(gè)假的實(shí)現(xiàn);典型的如測(cè)試服務(wù)層時(shí)注入一個(gè)Mock的DAO層,這樣的好處:

  • 加快測(cè)試速度;因?yàn)椴粫?huì)調(diào)用真實(shí)的被測(cè)系統(tǒng),所以速度特別快;
  • 測(cè)試還沒(méi)有完成的功能;尤其在多團(tuán)隊(duì)協(xié)作時(shí),可以只在定義好接口的情況下開(kāi)發(fā)系統(tǒng);

?

如果是集成測(cè)試時(shí),直接注入真實(shí)的依賴系統(tǒng)即可,好處:

  • 完成聯(lián)調(diào);
  • 發(fā)現(xiàn)自己的問(wèn)題;
  • 還可能發(fā)現(xiàn)自己使用上問(wèn)題及使用的API的問(wèn)題;

單元測(cè)試雖然好,但是是隔離測(cè)試,即不會(huì)調(diào)用被測(cè)系統(tǒng)來(lái)完成測(cè)試,因?yàn)椴皇钦鎸?shí)的聯(lián)調(diào),所以很可能會(huì)潛在有一些問(wèn)題,因此還是需要集成測(cè)試。(所以不是很刻意分單元或集成測(cè)試,且有些系統(tǒng)可能只有集成測(cè)試)

?

但是集成測(cè)試速度是比較慢的,一般提交給CI執(zhí)行,不影響當(dāng)前開(kāi)發(fā)進(jìn)度。

?

2.4、驗(yàn)證

驗(yàn)證的目的:是保證實(shí)際結(jié)果和我們預(yù)期的結(jié)果是否一致,說(shuō)白了就是是否是我們想的那樣。

?

一般使用斷言來(lái)驗(yàn)證,如:

Assert.assertEquals(expectedResult, actualResult); //驗(yàn)證預(yù)期結(jié)果和實(shí)際結(jié)果是否相等

?

驗(yàn)證主要有兩種:

  • 結(jié)果驗(yàn)證
  • 行為驗(yàn)證

結(jié)果驗(yàn)證:即驗(yàn)證被測(cè)系統(tǒng)返回的結(jié)果是否正確,如:

          @Test
    public void testCount() {
        String ql = "select count(o) from User o";
        long expectedCount = repositoryHelper.count(ql) + 1;

        User user = createUser();
        repositoryHelper.getEntityManager().persist(user);

        long acutalCount = repositoryHelper.count(ql);
        Assert.assertEquals(expectedCount, acutalCount);

    }
    

驗(yàn)證返回的數(shù)據(jù)總數(shù) = 插入之前的總數(shù) + 1; 即結(jié)果驗(yàn)證。此處我們使用了一種叫做相對(duì)(delta)測(cè)試;即不關(guān)心數(shù)據(jù)庫(kù)里到底多少條,只關(guān)心實(shí)際的和預(yù)期的差。

?

行為驗(yàn)證:即驗(yàn)證被測(cè)系統(tǒng)是否調(diào)用了依賴系統(tǒng)的某個(gè)API ,這個(gè)只有當(dāng)我們使用Mock時(shí)測(cè)試時(shí)比較簡(jiǎn)單,如當(dāng)用戶注冊(cè)時(shí):

1、加積分

2、發(fā)系統(tǒng)消息

3、……

此時(shí)我們并不能通過(guò)結(jié)果驗(yàn)證是否調(diào)用了這些方法;那么我們可以使用Mock技術(shù)來(lái)完成驗(yàn)證是否調(diào)用了這些API,比如使用jmock測(cè)試框架就支持行為驗(yàn)證。集成測(cè)試是很難進(jìn)行行為驗(yàn)證的,如果測(cè)試需要預(yù)留間諜接口。

?

3、測(cè)試有哪些好處?

我們寫代碼的目的是正確的完成某個(gè)功能,如何保證正確呢?測(cè)試!所以在不使用如單元測(cè)試技術(shù)時(shí),我們也是需要測(cè)試,但是這個(gè)測(cè)試是我們?nèi)斯を?yàn)證的。缺點(diǎn)很明顯:

  • 不是自動(dòng)的,每次需要對(duì)比預(yù)期結(jié)果與實(shí)際結(jié)果,尤其數(shù)據(jù)量/邏輯復(fù)雜時(shí)更痛苦;
  • 不是回歸的,上次測(cè)試完成后,下次還得重復(fù)自己一遍;

為了解決這個(gè)問(wèn)題,我們使用如單元測(cè)試技術(shù)來(lái)解決這個(gè)問(wèn)題:

  • 測(cè)試自動(dòng)化;即驗(yàn)證預(yù)期結(jié)果與實(shí)際結(jié)果交給計(jì)算機(jī)吧;
  • 測(cè)試回歸性,可以重復(fù)執(zhí)行測(cè)試,驗(yàn)證修改后邏輯是否還是正確的;

即測(cè)試的好處,從如上已經(jīng)提煉出來(lái)了:

  • 縮短發(fā)現(xiàn)問(wèn)題到解決問(wèn)題的時(shí)間;
  • 重復(fù)使用測(cè)試,保證修改后的代碼還是正確的;
  • 如果做開(kāi)源項(xiàng)目,可以提供給使用人員參考如何使用;
  • 因?yàn)閱卧獪y(cè)試都非常快,所以提升了開(kāi)發(fā)速度;

4、一切都需要測(cè)試嗎?

肯定不是,一切都是相對(duì)的;哪些不需要測(cè)試呢:

  • 你非常熟悉的功能;

  • 一些簡(jiǎn)單的CRUD;

  • 你認(rèn)為不需要測(cè)試的;比如你很有把握的東西,就沒(méi)有必要浪費(fèi)時(shí)間測(cè)試了;

哪些需要測(cè)試呢:
  • 復(fù)雜的業(yè)務(wù)邏輯/系統(tǒng)核心功能,最典型的如訂單系統(tǒng):一定要有足夠的單元測(cè)試保證,這是一個(gè)電商系統(tǒng)的核心;還有如用戶系統(tǒng)、積分系統(tǒng)等等;
  • 框架級(jí)別/工具級(jí)別/通用級(jí)別的代碼需要測(cè)試,即提供給第三方使用的代碼,因?yàn)檫@些代碼可能被很多系統(tǒng)依賴,應(yīng)該保證其正確性;而且還要保證以后版本升級(jí)的向下兼容;
  • 你認(rèn)為需要測(cè)試的,比如你沒(méi)有把握的東西,還是寫點(diǎn)測(cè)試來(lái)縮短如開(kāi)發(fā)web項(xiàng)目的重啟系統(tǒng)的時(shí)間吧;

?測(cè)試不是不耗時(shí)間的,沒(méi)意義的測(cè)試就是浪費(fèi)時(shí)間,最典型是一些書上的對(duì)一個(gè)增刪改查進(jìn)行測(cè)試,實(shí)際項(xiàng)目沒(méi)有任何意義。所以你應(yīng)該只對(duì)自己很難駕馭的覺(jué)得有必要的代碼進(jìn)行測(cè)試。不要成為一個(gè)測(cè)試狂,什么都測(cè)試。?

?

一些測(cè)試可以參考我的《 es——JavaEE快速開(kāi)發(fā)腳手架 》中的代碼。通過(guò)測(cè)試我得到了許多好處。?

?

到此我們介紹完成了測(cè)試,但是如果我們使用了如集成測(cè)試時(shí),測(cè)試執(zhí)行起來(lái)可能比較慢,跑一遍測(cè)試可能需要5分鐘,那怎么辦呢?

  • 每天下班前跑一遍集成測(cè)試,然后修復(fù),下班走人;

  • CI:持續(xù)集成,交給持續(xù)集成服務(wù)器,自動(dòng)地測(cè)試完成后把測(cè)試報(bào)告以郵件的形式發(fā)到開(kāi)發(fā)人員郵箱;

?

------------------------------------分割線----------------------------------

?

?

接下來(lái)介紹一下CI吧。

1、為什么需要CI

2、CI如何工作的

3、travis-ci介紹

?

1、為什么需要CI

正如前邊說(shuō)的,我們單獨(dú)測(cè)試可能會(huì)遇到如下問(wèn)題:

  • 如果寫了一個(gè)測(cè)試,就要把所有測(cè)試跑一遍看看整個(gè)系統(tǒng)是否是正確的,那么每次等待時(shí)間是非常漫長(zhǎng)的;
  • 如果團(tuán)隊(duì)中的其他成員改了功能并提交了,如何快速得到該次提交對(duì)當(dāng)前系統(tǒng)代碼是正確還是失敗的反饋;

那怎么辦呢?自動(dòng)化地持續(xù)集成(CI)!CI的核心就是干這件事情的。自動(dòng)化持續(xù)地集成測(cè)試。

?

使用CI后,如果使用Maven,可以新建多個(gè)profile:

  • 本地測(cè)試時(shí)忽略一些比較慢的測(cè)試;
  • CI服務(wù)器上執(zhí)行所有測(cè)試;

?

2、CI如何工作的

一個(gè)典型的持續(xù)集成流程:

?

  1. 定期檢測(cè)版本服務(wù)器上是否有代碼更新;
  2. 如果發(fā)現(xiàn)代碼更新,從版本服務(wù)器下載最新的代碼;
  3. 自動(dòng)構(gòu)建并自動(dòng)化的測(cè)試;
  4. 不管錯(cuò)誤/失敗,生成報(bào)告給開(kāi)發(fā)人員;
  5. 有些CI服務(wù)器還能產(chǎn)生可執(zhí)行的軟件,自動(dòng)化地部署到測(cè)試機(jī)器,交給測(cè)試人員測(cè)試。

如圖所示:
加速Java應(yīng)用開(kāi)發(fā)速度3——單元/集成測(cè)試+CI
?
?

?

持續(xù)集成服務(wù)器其實(shí)就是一個(gè)定時(shí)器,自動(dòng)幫你下載最新代碼、編譯、測(cè)試、集成及產(chǎn)生報(bào)告發(fā)給開(kāi)發(fā)人員。

?

常見(jiàn)的CI服務(wù)器有:

  • Apache Continuum
  • Hudson
  • CruiseControl
  • Jenkins?CI
  • TeamCity?
  • Travis CI

?

我09年時(shí)使用過(guò)TeamCity社區(qū)版,足夠滿足常見(jiàn)需求;目前我使用github托管項(xiàng)目,使用Travis CI進(jìn)行分布式的持續(xù)集成,免費(fèi),目前看來(lái)還是不錯(cuò)的。

?

3、travis-ci介紹

我現(xiàn)在開(kāi)發(fā)的 ES-JavaEE項(xiàng)目開(kāi)發(fā)腳手架 就是使用travis ci進(jìn)行持續(xù)集成;具體參考《 Getting started 》進(jìn)行與Github集成,其支持的語(yǔ)言:

支持的數(shù)據(jù)庫(kù):

  • MySQL
  • PostgreSQL
  • MongoDB
  • CouchDB
  • Redis
  • Riak
  • RabbitMQ
  • Memcached
  • Cassandra
  • Neo4J
  • ElasticSearch
  • Kestrel
  • SQLite3

更多請(qǐng)參考其官網(wǎng)的介紹。

?

?

如果是Java開(kāi)發(fā)人員,支持的JDK包括:OpenJDK 和 OracleJDK。 如果使用的是OpenJDK,Maven中使用ascii2native插件時(shí),需要如下配置:?

                  <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>native2ascii-maven-plugin</artifactId>
                <version>1.0-alpha-1</version>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>native2ascii</goal>
                        </goals>
                        <configuration>
                            <encoding>UTF-8</encoding>
                            <src>src/main/messages</src>
                            <dest>target/${project.artifactId}/WEB-INF/classes</dest>
                            <includes>messages.properties</includes>
                        </configuration>
                    </execution>
                </executions>
                <!-- native2ascii 使用的tools.jar -->
                <dependencies>
                    <dependency>
                        <groupId>com.sun</groupId>
                        <artifactId>tools</artifactId>
                        <version>1.7.0</version>
                        <scope>system</scope>
                        <systemPath>${java.home}/../lib/tools.jar</systemPath>
                    </dependency>
                </dependencies>
            </plugin>
    

如果使用mysql,端口只能是3306。

如果想開(kāi)端口測(cè)試,這是不允許的。

?

?

如下是我項(xiàng)目中的一個(gè)配置 .travis.yml ,放到項(xiàng)目的根下即可:

-----------------------------------

language: java ? ? ? ? ? 語(yǔ)言

?

env: ? ? ? ? ? ? ? ? ? ? ? ? ? 環(huán)境

? - DB=mysql ? ? ? ? ? ? ?使用mysql

?

jdk:

? - openjdk ? ? ? ? ? ? ? ?jdk使用openjdk

?

mysql:?

? database: es ? ? ? ? 數(shù)據(jù)庫(kù)名為es

? username: root ? ? 用戶名為root

? password : ? ? ? ? ? ?密碼為空

? encoding: utf8 ? ? ?編碼為utf8

?

install: ? ? ? ? ? ? ? ? ? ? 安裝時(shí)執(zhí)行的腳本

? - mvn install -Dmaven.test.skip=true ? ? mvn安裝并跳過(guò)測(cè)試

?

before_script: ? ? ? ?script之前執(zhí)行的測(cè)試

? - cd web ? ? ? ? ? ? ?

? - mvn db:create ?創(chuàng)建數(shù)據(jù)庫(kù)的mvn命令(此處使用了?maven-db-plugin 插件)

? - mvn db:schema ?創(chuàng)建腳本的mvn命令

? - mvn db:data ? ? ? ?安裝數(shù)據(jù)的mvn命令

? - cd ..

?

script: ? ? ? ? ? ? ? ? ? ? ?測(cè)試時(shí)執(zhí)行的腳步

? - cd common?

? - mvn test ? ? ? ? ? ? ?測(cè)試common子模塊

? - cd ..

? - cd web

? - mvn test -Pit ? ? ? 測(cè)試web子模塊,并指定使用it profile測(cè)試(即集成測(cè)試的配置,具體參考 pom.xml 中的profile/it)

?

notifications: ? ? ? ? ?觸發(fā)

? email: ? ? ? ? ? ? ? ? ?測(cè)試完成后測(cè)試報(bào)告發(fā)到哪

? ? - zhangkaitao0503@gmail.com ?

-----------------------------------

?

?

持續(xù)集成不能修復(fù)代碼的錯(cuò)誤,而是和單元測(cè)試一樣,縮短發(fā)現(xiàn)問(wèn)題帶解決問(wèn)題的時(shí)間,這樣可以提高開(kāi)發(fā)效率,降低項(xiàng)目風(fēng)險(xiǎn),提高項(xiàng)目的穩(wěn)定性。而且尤其是團(tuán)隊(duì)協(xié)作時(shí),可以發(fā)現(xiàn)其他人的代碼是否對(duì)自己的代碼產(chǎn)生影響。 ?

?

?

到此我們利用單元測(cè)試+CI可以加速開(kāi)發(fā)人員的開(kāi)發(fā)速度。利用好單元測(cè)試和CI,不要純粹為了單元測(cè)試和CI而去做這些事情。

?

本文沒(méi)有介紹TDD,TDD并不會(huì)那么美好,我認(rèn)為我們可以借鑒TDD的一些思想,但決不能迷信TDD,有時(shí)候,尤其如開(kāi)發(fā)企業(yè)應(yīng)用,先寫功能再寫測(cè)試可能效率更高,而且大部分時(shí)候是不需要TDD的。而且我也沒(méi)能在實(shí)際項(xiàng)目中獲取太多TDD的好處,但是我獲得了測(cè)試的好處。

?

本文也沒(méi)有介紹測(cè)試覆蓋率,我認(rèn)為不要一味的追求覆蓋率,有時(shí)候有的覆蓋率沒(méi)有任何意義。所以不要讓為了覆蓋率而覆蓋率拖慢了項(xiàng)目開(kāi)發(fā)進(jìn)度。

?

?

正如stackoverflow上的一篇帖子《 How deep are your unit tests? 》上 Kent Beck 的回答:

寫道
老板為我的代碼付報(bào)酬,而不是測(cè)試,所以,我對(duì)此的價(jià)值觀是——測(cè)試越少越好,少到你對(duì)你的代碼質(zhì)量達(dá)到了某種自信。

可以前往 coolshell “單元測(cè)試要做多細(xì)?” 去得到一些經(jīng)驗(yàn)。

?? ? ??

?

推薦閱讀:

es——JavaEE快速開(kāi)發(fā)腳手架中的一些測(cè)試用例

【第十三章】 測(cè)試 之 13.1 概述 13.2 單元測(cè)試 ——跟我學(xué)spring3

【第十三章】 測(cè)試 之 13.3 集成測(cè)試 ——跟我學(xué)spring3

stamen的單元測(cè)試系列

TDD并不是看上去的那么美

“單元測(cè)試要做多細(xì)?”

持續(xù)集成(第二版)

《xUnit測(cè)試模式》

《持續(xù)集成:軟件質(zhì)量改進(jìn)和風(fēng)險(xiǎn)降低之道》
《持續(xù)交付--發(fā)布可靠軟件的系統(tǒng)方法》

?

下一篇:使用模板加速開(kāi)發(fā)速度

加速Java應(yīng)用開(kāi)發(fā)速度3——單元/集成測(cè)試+CI


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 成年女人免费毛片视频永久 | 日韩成人黄色片 | 偷拍清纯高清视频在线 | 国产日韩欧美精品 | 激情综合视频 | 老司机精品在线观看 | 久久频这里精品香蕉久久 | 一级毛片大全免费播放 | 精品一久久香蕉国产线看观 | 国产不卡在线观看视频 | 欧美日韩中文字幕在线视频 | 亚洲欧洲一区二区三区在线观看 | www.久草| 免费播放一区二区三区 | 亚洲成人综合在线 | 在线精品一区二区三区 | 毛片午夜| 亚洲国产精品一区二区首页 | 夜色资源站www国产在线资源 | a成人毛片免费观看 | 影视先锋av资源噜噜 | 一级成人毛片免费观看欧美 | 国产在线观看成人免费视频 | 91色综合综合热五月激情 | 国产高清看片日韩欧美久久 | 国产自愉自愉全免费高清 | 国产成人精品精品欧美 | 四虎论坛| 99视频全部免费 | 四虎影视永久免费视频观看 | 岛国三级视频 | 欧美一级爱操视频 | 9299yy看片淫黄大片在线 | 久久99精品这里精品3 | 欧美成人欧美激情欧美风情 | 毛片网站免费 | 九一视频在线免费观看 | 91视频国产91久久久 | 成人午夜爽爽爽免费视频 | 在线亚洲精品国产成人二区 | 国产综合欧美日韩视频一区 |