久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

關于單元測試及項目質量管理的總結-創新互聯

摘要:如果沒寫單元測試,如若在branch中對之前代碼重構的話,則沒有移回trunck上的勇氣,有了單元測試,全部運行通過后則有信心合并。互聯網公司更是需要重視單元測試,因為版本迭代比較迅速。因此一個好的單元測試框架及一個好的項目質量管理非常重要。本文即是我對這些的心得體會。關鍵詞:java, 單元測試, TestNG, DbUnit, Spring, 項目管理, 質量管理, PMP解決問題:單元測試該如何實施?項目質量管理該如何執行?
   在開發數據訪問對象DAO層時,我們需要直接對數據層進行增刪改查CRUD操作。單元測試非常重要,因為在開發期間經常需要進行代碼重構,怎樣才能保證代碼重構的正確性呢,怎樣給代碼重構者以信心讓他放手去做呢,需要執行單元測試,只要能保證接口功能不發生任何變化,與代碼重構前完全相同,并且能直觀的感受到這一一致性,開發者便能大膽地去干了。功能開發容易,單元測試難做。第一,單元測試間相互影響:單元測試1對數據A新增的一條數據可能會影響到單元測試2驗證的正確性,你可能會想到在每個單元測試的起始時手動做一遍初始化,比如清理一遍表中數據,以清除其他單元測試的影響,這樣笨且增加工作量。第二,開發者間相互影響:如果有多人同時需要執行測試用例,使用以上的辦法后還是會發生問題,這時我們可能會選擇每個開發者自己搭建一套數據庫(內存或大型),以避免多人間的干擾,這樣還是過于麻煩,且消耗資源。   下面是基于TestNG和DbUnit的單元測試框架,它的基本思想是管理事務,在單元測試起始時使用事務,在單元測試邏輯的最后將事務回滾,因此每個單元測試內對數據庫的操作將不會實際對數據庫有實質性影響,這樣在單元測試中既可以測試邏輯的正確性,又避免影響到了其他單元測試和其他開發者,并且只需要依賴于統一的開發數據庫即可,使用還很方便。以下還使用MyBatis的功能抽象出了一個統一平臺,該統一平臺提供了大多數的公共接口,如增刪改查及批量操作等,大部分的基礎操作可以通過調用這些接口就能完成,不通用的操作傳入SQL語句也可執行。 一、MyBatis統一平臺:MyBatisAngelWang.class
  1. @Repository
    publicclassMyBatisAngelWangimplementsIRepository{
    @Autowired
    privateGeneralDAO generalDAO;
    public<T extendsBase> T get(Class<T> clz,Long id){
    HashMap hashMap= generalDAO.getLogically(clz, id);
    T ret=this.convert(hashMap, clz);
    return ret;
    }
    }
     關于單元測試及項目質量管理的總結
  上面的代碼即對數據庫直接進行了操作,我們需要對此接口編寫單元測試。具體的MyBatis使用方法,及MyBatisAngelWang統一平臺的實現辦法,需要另抽專門章節進行詳細討論。在這里就不做更深入研究了。 二、統一平臺的單元測試:MyBatisAngelWangTest
  1. import org.testng.annotations.Test;
    //@DatabaseSetup(value= "/dbunitData/TestAngelEntity.xml")publicclassMyBatisAngelWangTestextendsAbstractRollbackTest{
    @Autowired
    privateMyBatisAngelWang myBatisAngelWang;
    @Test(enabled=false)
    publicvoid testGet(){
    }
    }

    10年積累的成都網站建設、做網站經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有尉犁免費網站建設讓你可以放心的選擇與我們合作。
  可以看到此單元測試MyBatisAngelWangTest.class繼承自一個抽象類:AbstractRollbackTest。
  1. import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.TestExecutionListeners;
    @ContextConfiguration(locations={"classpath:spring-datasource-dbunit.xml",
    "classpath*:spring-services.xml"})
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
    TransactionDbUnitTestExecutionListener.class,TransactionalTestExecutionListener.class})
    @Transactional
    publicclassAbstractRollbackTestextendsAbstractTestNGSpringContextTests{
    }

  此抽象類是由我們自己定義的,其繼承自抽象類:AbstractTestNGSpringContextTests,它由Springframework提供。我們可以通過ContextConfiguration注解來注入spring配置文件。   或者這樣也可以。單元測試MyBatisAngelWangTest.class直接繼承自AbstractTestNGSpringContextTests。減少了一層。
  1. @ContextConfiguration("/config/Spring-db.xml")
    @Transactional
    @ActiveProfiles("test")
    publicclassMyBatisAngelWangTestextends
    AbstractTransactionalTestNGSpringContextTests{}

三、供給單元測試的專用spring配置文件:spring-datasource-dbunit.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
    <beansxmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd"default-autowire="byName">
    <description>spring-datasource-configuration</description>
    <beanclass="com.angel.context.ApplicationContextAwareHelper"/>
    <!-- 定義事務管理器(聲明式的事務) -->
    <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <propertyname="dataSource"ref="dataSource"/>
    </bean>
    <tx:annotation-driventransaction-manager="transactionManager"/>
    <beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <propertyname="locations">
    <list>
    <value>classpath*:props/datasource_dev.properties</value>
    </list>
    </property>
    </bean>
    <beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <propertyname="driverClassName"value="${jdbc.driver}"/>
    <propertyname="url"
    value="${jdbc.dbunit.url}"/>
    <propertyname="username"value="${jdbc.user}"/>
    <propertyname="password"value="${jdbc.password}"/>
    </bean>
    <!-- MyBatis 配置 -->
    <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <propertyname="basePackage"value="com.angel.*.dao"/>
    <propertyname="sqlSessionFactoryBeanName"value="xSqlSessionFactory"/>
    </bean>
    <beanid="xSqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
    <propertyname="dataSource"ref="dataSource"/>
    <propertyname="typeAliasesPackage"value="com.angel.*.entities"/>
    <propertyname="configLocation"value="classpath:mybatis/mybatis-config.xml"/>
    <propertyname="mapperLocations"value="classpath:/com/angel/dao/*.xml"/>
    <propertyname="plugins">
    <array>
    <!--page interceptor-->
    <beanclass="com.angel.orm.db.QueryInterceptor"/>
    </array>
    </property>
    </bean>
    <tx:annotation-driventransaction-manager="transactionManager"/>
    </beans>

       這樣大家測試的數據庫都是同一個了,也不會有任何的相互影響了。因為事務回滾了,不信的話可以提交一條Insert測試哦,執行完后查看數據庫中并沒有插入任何數據。然而,在一個單元測試中,先Insert再get是可以取到數據的,神奇吧?!

四、其它:ApplicationContextAwareHelper.class
  1. publicclassApplicationContextAwareHelperimplementsApplicationContextAware{
    privatestaticApplicationContext context;
    @Override
    publicvoid setApplicationContext(ApplicationContext applicationContext){
    context= applicationContext;
    }
    publicstaticApplicationContext getContext(){
    return context;
    }
    }

當我們需要比較動態的獲取某些bean時,需要ApplicationContextAwareHelper類。比如說,我要自己拼接一個bean的名稱,還要獲得該bean,則可以使用下面的代碼來獲取:
  1. DruidDataSource dataSource =ApplicationContextAwareHelper.getBean("dataSource_"+ dataSources[i]);

       當然,這不屬于單元測試的范疇了,有點跑題,但是蠻有用的,在這里記一下。

 五、項目質量管理    通過上面數步就能夠很好的實施單元測試了。然而單元測試說來容易,執行難,有方法了,但推進它又是另外一件事了。在互聯網公司中,很多個小項目并發進行,同時存在,項目成員亦流動性較大,相近的項目會分布在各項目組中。這樣,每個小項目組可能有其自己的規范或是沒有。規范就像法律一樣,是個人素質的最底線、最低層約束。項目開發成員素質較高還好,可能不會引起混亂,當項目組成員多了,素質參差不齊就麻煩了。這時就需要執行項目經理職能的角色出現了。這時項目經理可以且應該具體要求各小組的開發流程、規范。在互聯網項目中沒有項目經理存在的情況下,可以由行政層面或配置項目管理專員來實現。  當然項目質量管理除了要規范單元測試以外,還有很多其他方法,具體可以查看我的這篇文章:http://www.cnblogs.com/wgp13x/p/4101314.html。其中的B圖-質量管理即體現了項目質量管理的實施辦法,可能不夠細致,有空再詳細敘述一下。   多謝大家的鼓勵! 

來自王安琪

作者:Angel 出處:http://www.cnblogs.com/wgp13x/ 歡迎轉載或分享,但請務必聲明文章出處。如果文章對您有幫助,希望你能推薦或關注。

王安琪,英文名Angel,南京郵電大學計算機應用技術碩士學位。 熟悉Java、C#編程語言。專注于WebService、海量數據處理、搜索引擎技術、消息中間件技術、分布式文件存儲、.NET應用程序開發、系統架構設計。主要從事大數據管理系統的研發,項目經理,系統架構師,就職于江蘇金陵科技集團有限公司。

Email:aitanjupt@hotmail.com

QQ:289770363

當前題目:關于單元測試及項目質量管理的總結-創新互聯
標題來源:http://www.js-pz168.com/article20/dgojjo.html

成都網站建設公司_創新互聯,為您提供品牌網站建設用戶體驗標簽優化網站收錄外貿建站全網營銷推廣

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都seo排名網站優化
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
日韩三级免费观看| 日韩理论片中文av| 亚洲精品乱码久久久久| 麻豆一区二区99久久久久| 成人avav在线| 欧美久久久久久久| 欧美老女人在线| 中文子幕无线码一区tr| 日本欧美久久久久免费播放网| 成人高清在线视频| 视频在线精品一区| 欧美r级在线观看| 亚洲综合成人在线| 国产suv精品一区二区6| 欧美裸体网站| 91精选在线观看| 亚洲免费观看高清完整版在线 | 欧美国产一区二区在线| 欧美人xxxx| 亚洲欧洲日韩av| 国产一区在线视频| 免费看成人片| 欧美一区二区视频观看视频 | 久精品国产欧美| 欧美日韩三级在线| 亚洲欧美在线视频| 国产黑丝在线一区二区三区| 日韩电影免费观看在| 日韩精品一区二区三区中文不卡| 亚洲国产精品一区二区www| 波多野结衣的一区二区三区| 亚洲黄色成人久久久| 久久久久久久网| 蜜臀国产一区二区三区在线播放| 国产自产精品| 日韩一区二区三区免费观看| 亚洲成a人片在线不卡一二三区 | 免费成人美女在线观看| 国产一区自拍视频| 欧美一级二级三级乱码| 日日欢夜夜爽一区| 国产一区二区三区av在线| 欧美一区二区三区影视| 无吗不卡中文字幕| 国产一区免费| 欧美成人女星排行榜| 青青草精品视频| 久久综合入口| 久久嫩草精品久久久久| 激情文学综合插| 视频一区视频二区视频三区高| 国产欧美精品一区二区色综合朱莉| 精品一区二区三区av| 色综合视频二区偷拍在线| 国产日本欧洲亚洲| 国产精品香蕉一区二区三区| 在线观看欧美激情| 亚洲人妖av一区二区| 114国产精品久久免费观看| 欧美理论电影在线| 视频一区免费在线观看| 快播日韩欧美| 国产欧美日韩卡一| 不卡av免费在线观看| 欧美日本韩国一区二区三区视频| 亚洲国产sm捆绑调教视频| 国产伦精品一区二区三区免 | 成人看片黄a免费看在线| 在线观看不卡一区| 亚洲制服丝袜av| 国产自产在线视频一区| 国产亚洲精品中文字幕| 国产**成人网毛片九色| 欧美日韩亚洲综合| 午夜欧美电影在线观看| 欧美一区二区综合| 国产精品国产自产拍高清av| 91网址在线看| 精品久久久三级丝袜| 国产麻豆精品久久一二三| 一本色道综合亚洲| 亚洲成人免费在线| 日韩精品一区二区三区外面| 亚洲欧美日韩电影| 韩国成人动漫在线观看| 欧美激情一区二区三区蜜桃视频| thepron国产精品| 日韩一区二区电影在线| 国产精品中文有码| 欧美日韩在线一区二区| 久久国产精品99久久久久久老狼| 日本韩国欧美国产| 日韩精品亚洲专区| 色综合久久久网| 丝袜亚洲另类欧美| 亚洲午夜精品一区二区三区| 亚洲一区二区欧美激情| 日本午夜精品一区二区| 伊人色综合久久天天人手人婷| 久久久久免费网| 亚洲欧美福利一区二区| 蜜桃导航-精品导航| 亚洲日本在线天堂| 欧美成人蜜桃| 一区二区久久久久久| 日本一区精品| 午夜精品在线看| 一本久久精品一区二区| 免费人成在线不卡| 在线观看一区不卡| 精品亚洲porn| 日韩写真欧美这视频| 成人午夜视频在线观看| 精品成人免费观看| 91嫩草国产在线观看| 亚洲国产精华液网站w| 狠狠色综合网站久久久久久久| 中文字幕欧美一| 欧美一区二区三区四区夜夜大片| 亚洲无线码一区二区三区| 亚洲一区二三| 免费在线成人网| 7777精品伊人久久久大香线蕉超级流畅| 国产精品一区二区久久不卡| 欧美大片在线观看| 5g影院天天爽成人免费下载| 中文字幕一区二区5566日韩| 欧美h视频在线| 五月婷婷色综合| 欧美亚洲愉拍一区二区| 国产高清在线观看免费不卡| 欧美成人激情免费网| 99国精产品一二二线| 日韩美女视频19| 亚洲精品在线免费| 精品无人区卡一卡二卡三乱码免费卡| 91精品国产麻豆| 97超级碰碰| 亚洲精品视频免费观看| 色综合久久综合网欧美综合网| 韩国av一区二区三区| 精品国产麻豆免费人成网站| 国产在线精品日韩| 亚洲国产精品久久人人爱蜜臀| 欧美性生活久久| 波多野结衣亚洲| ...xxx性欧美| 色偷偷成人一区二区三区91| 国产成人日日夜夜| 国产欧美一区二区精品秋霞影院| 欧美裸体网站| 精品在线你懂的| 久久久久久久性| 日本在线一区| 国内精品伊人久久久久av影院| 久久夜色精品一区| 蜜桃视频成人| 久久国产成人午夜av影院| 欧美精品一区二区三区久久久| 蜜桃狠狠色伊人亚洲综合网站| 欧美a一区二区| 精品国产乱码久久久久久老虎 | 国产精品伦一区二区三级视频| 亚洲精品国产精品久久| 国产精品综合一区二区三区| 中文字幕免费在线观看视频一区| 神马影院午夜我不卡| 国产黄色精品视频| 最新国产精品久久精品| 欧美性大战久久久久久久| 99精品一区二区三区| 亚洲一区二区三区四区中文字幕| 欧美喷潮久久久xxxxx| 国产精品久久国产三级国电话系列| 午夜在线成人av| 欧美草草影院在线视频| 欧美日韩一区二区三| 国产精品中文欧美| 亚洲欧美在线观看| 欧美片网站yy| 久久精彩视频| 国产一区二区久久| 亚洲欧美一区二区视频| 欧美日韩中文字幕一区二区| 国产v亚洲v天堂无码| 免费成人av在线播放| 国产欧美久久久精品影院| 在线观看免费亚洲| 国产99视频精品免费视频36| 美女视频黄久久| 中文字幕av一区二区三区| 欧美视频在线观看一区二区| 国产精品久久波多野结衣| 久久99精品久久只有精品| 国产精品久久免费看| 欧美日本一区二区三区四区| 欧美aaaaa喷水| 成人国产视频在线观看| 偷窥少妇高潮呻吟av久久免费| 久久精品日产第一区二区三区高清版|