欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

關(guān)于單元測試及項目質(zhì)量管理的總結(jié)-創(chuàng)新互聯(lián)

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

    10年積累的成都網(wǎng)站建設(shè)、做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有尉犁免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
  可以看到此單元測試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"/>
    <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->
    <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>

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

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

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

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

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

    來自王安琪

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

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

    Email:aitanjupt@hotmail.com

    QQ:289770363

    當前題目:關(guān)于單元測試及項目質(zhì)量管理的總結(jié)-創(chuàng)新互聯(lián)
    標題來源:http://aaarwkj.com/article20/dgojjo.html

    成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)用戶體驗、標簽優(yōu)化、網(wǎng)站收錄外貿(mào)建站、全網(wǎng)營銷推廣

    廣告

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

    成都seo排名網(wǎng)站優(yōu)化
    亚洲国产精品一区二区电影| 欧洲亚洲国产一区二区| 日本国产一区二区三区在线| 国产精品六区久久综合亚洲av| 欧美日韩国产精品综合| 久久精品国产亚洲av超一| 6080yy精品一区二区三区| 日本在线高清精品人妻| 国产精品人妻在线av| 久国产精品久久久极品| 高清免费在线自偷自拍| 亚洲视频在线视频看视频在线 | 亚洲成av人天堂影院| 日韩中文字幕在线首页 | 日本不卡在线观看欧美精品| 中国美女下面毛茸茸视频| 日韩精品女性三级视频| 亚洲全乱码精品一区二区| 一区二区三区不卡中文字幕| 侵犯人妻中文字幕一区二区| 国产精品午夜福利91| 麻豆视频在线观看传媒| 日韩a国产v亚洲欧美精品| 中文字幕人成乱码在线观看| 人人妻人人澡人人爽人人dvd | 四虎在线经典视频播放| 亚洲午夜精品日韩乱码| 亚洲成色在线综合剧情网站| 久久久久久国产精彩视频| 色男人天堂亚洲男人天堂| 91日韩中文字幕在线观看| 男女在线视频网站免费| 人妻免费视频中文字幕| 日本乱一区二区三区在线| 亚洲激情粉嫩中文字幕| 日本精品人妻一区二区三区蜜桃 | 国产在线一区二区三区不卡| 91精品人妻一区二区| 欧美色欧美亚洲另类视频| 丰满少妇一区二区三区在线观看| 日韩欧美一区二区麻豆|