• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于TDD的領(lǐng)域?qū)ο髮訉?duì)象提取方法研究

      2018-05-15 08:31:14姚遠(yuǎn)張樊黃玉蘭
      軟件導(dǎo)刊 2018年4期
      關(guān)鍵詞:測試用例

      姚遠(yuǎn) 張樊 黃玉蘭

      摘 要:目前云系統(tǒng)服務(wù)端存在著各類分層模型架構(gòu),盡管這些分層架構(gòu)通常有所差異,但始終存在著領(lǐng)域?qū)ο髮樱―omain Object Layer)。領(lǐng)域?qū)ο髮又械膶?duì)象對(duì)真實(shí)世界里的業(yè)務(wù)及角色進(jìn)行抽象與映射,封裝了現(xiàn)實(shí)世界中的關(guān)鍵業(yè)務(wù)過程與實(shí)體狀態(tài)。因此,如何建立云服務(wù)領(lǐng)域?qū)ο髮邮敲嫦驅(qū)ο箝_發(fā)方法中的關(guān)鍵部分。測試驅(qū)動(dòng)開發(fā)(Test Driven Development ,簡稱TDD)作為一種軟件開發(fā)方法,使用一組單元測試用例作為軟件開發(fā)的基礎(chǔ)與手段,意在使軟件開發(fā)過程始終不偏離軟件的主要功能,以實(shí)現(xiàn)敏捷開發(fā)。提出一種基于TDD進(jìn)行領(lǐng)域?qū)ο髮拥膶?duì)象提取、構(gòu)建領(lǐng)域?qū)ο髮拥姆椒?,并通過實(shí)例對(duì)該方法進(jìn)行驗(yàn)證。驗(yàn)證結(jié)果顯示,構(gòu)建的領(lǐng)域?qū)ο髮恿6染?xì),識(shí)別準(zhǔn)確、完整。

      關(guān)鍵詞:TDD;測試用例;領(lǐng)域?qū)ο髮?;?duì)象識(shí)別;軟件建模;云系統(tǒng)

      DOI:10.11907/rjdk.172548

      中圖分類號(hào):TP301

      文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2018)004-0036-03

      Abstract:There are various layered model structures in the present cloud system server. Although in general these structures are different they all have domain object layer (DOL). The objects in DOL are the abstraction and reflection of operation and roles in the real world and they encapsulate the key operational process and entity status. Therefore how to establish DOL is the key part of the whole development. This paper uses test-driven development(TDD) as the software development method in which a group of unit test samples are employed as the basis to ensure basic users' needs to be met and agile development to be accomplished in the whole development process. It is proposed to do object extraction based on TDD and establish DOL. The test confirms that the logic objects in the established DOL are in very tiny particle size with accurate and complete recognition.

      Key Words:TDD; test samples; domain object layer; object recognition; software model design; cloud system

      1 TDD用于發(fā)現(xiàn)領(lǐng)域邏輯對(duì)象原理

      軟件開發(fā)過程由面向過程開發(fā)轉(zhuǎn)向面向?qū)ο箝_發(fā)已有將近20年歷史,面向?qū)ο箝_發(fā)方法已經(jīng)走過了簡單對(duì)象封裝、分組對(duì)象域、按功能職責(zé)分層進(jìn)行對(duì)象劃分的歷程[1-2]。軟件組成部分不再是簡單地按功能切分,而是按照業(yè)務(wù)領(lǐng)域的業(yè)務(wù)過程及角色識(shí)別出相應(yīng)對(duì)象,通過這些對(duì)象獨(dú)立使用或相互協(xié)作組成相應(yīng)的軟件功能模塊。

      面向?qū)ο蠓治?、設(shè)計(jì)與開發(fā)已由最初的粗粒度簡單對(duì)象封裝,演化出幾種成熟的分層對(duì)象設(shè)計(jì)模型。受C/S(客戶/服務(wù)器)、N-Tier(多層架)、B/S架構(gòu)、SOA(面向服務(wù)架構(gòu))等軟件開發(fā)架構(gòu)的影響,以及多種開發(fā)語言進(jìn)化的推動(dòng),面向?qū)ο蟮能浖话憧砂?~5個(gè)邏輯層次劃分[3-6]。以一般云系統(tǒng)提供的服務(wù)端軟件架構(gòu)為例,軟件層次如圖1所示。

      其中領(lǐng)域?qū)嶓w層是層次架構(gòu)中的核心層,業(yè)務(wù)領(lǐng)域的所有關(guān)鍵業(yè)務(wù)均由相應(yīng)領(lǐng)域?qū)嶓w完成,同時(shí)由于領(lǐng)域?qū)嶓w是現(xiàn)實(shí)世界中人、物的抽象,只要是屬于該業(yè)務(wù)領(lǐng)域的專家即能對(duì)領(lǐng)域?qū)嶓w進(jìn)行問題分析,這就為現(xiàn)實(shí)需求理解和軟件功能實(shí)現(xiàn)之間搭建了一座很好的橋梁。領(lǐng)域?qū)ο竽P偷慕⒁矠檐浖δ軐?shí)現(xiàn)帶來了極大好處,由于領(lǐng)域內(nèi)業(yè)務(wù)流程容易發(fā)生變化,但領(lǐng)域?qū)ο髤s相對(duì)變化較小,所以通過先識(shí)別領(lǐng)域?qū)ο髮?,進(jìn)而構(gòu)建整個(gè)軟件層次對(duì)象模型,可以大大降低軟件的升級(jí)和維護(hù)成本。

      一般有兩種方法實(shí)現(xiàn)領(lǐng)域?qū)嶓w層中的領(lǐng)域?qū)ο蠼#孩儆蒛ML統(tǒng)一建模過程提出的傳統(tǒng)方法進(jìn)行識(shí)別,這種方法要求在軟件需求獲取階段使用用例圖捕捉用戶需求,并根據(jù)用例圖中的名詞、行為等進(jìn)行領(lǐng)域?qū)嶓w識(shí)別;②由數(shù)據(jù)庫的ER模型導(dǎo)出底層數(shù)據(jù)庫結(jié)構(gòu),再由數(shù)據(jù)庫的ER模型直接向上擴(kuò)展為相應(yīng)的領(lǐng)域?qū)嶓w模型。

      在上述兩種領(lǐng)域?qū)ο蠼7椒ㄖ?,前者要求自頂向下進(jìn)行面向?qū)ο笤O(shè)計(jì),要求一開始就有一個(gè)宏大而全局的軟件架構(gòu),這對(duì)于軟件設(shè)計(jì)者把握架構(gòu)與系統(tǒng)分析能力都提出了較高要求,而后者則由傳統(tǒng)的CS架構(gòu)體系轉(zhuǎn)化而來,先做好數(shù)據(jù)庫設(shè)計(jì)再由數(shù)據(jù)表映射出領(lǐng)域?qū)嶓w。這種方式實(shí)際上是一種由面向過程開發(fā)向面向?qū)ο蟮倪^渡方式,由于數(shù)據(jù)庫先于領(lǐng)域?qū)嶓w設(shè)計(jì)出來,所以軟件開發(fā)不得不向已經(jīng)成形的數(shù)據(jù)庫架構(gòu)傾斜,使軟件后續(xù)設(shè)計(jì)遭遇掣肘。因此,本文提出TDD構(gòu)建領(lǐng)域?qū)ο蟮姆椒ā?/p>

      TDD全稱為Test Driven Development,意即測試驅(qū)動(dòng)開發(fā)。它是近幾年根據(jù)軟件開發(fā)體系極限編程(XP Programming)和敏捷開發(fā)(Agile Programming)發(fā)展而來的一種開發(fā)實(shí)踐[7]。

      TDD要求使用一組單元測試用例作為軟件開發(fā)的起點(diǎn)。它實(shí)際上是一種迭代的軟件開發(fā)過程,在每一次軟件迭代開發(fā)過程中,開發(fā)者首先需要根據(jù)軟件功能撰寫一組測試用例,這組用例需要覆蓋所有要求開發(fā)的功能。根據(jù)這組測試用例,即可確定所需開發(fā)的功能集合,而且必定也是能夠滿足用戶需求的最小功能集合。同時(shí),由于每次迭代開發(fā)均由測試用例先導(dǎo),即使用戶需求有大的變更,也可以根據(jù)需要重新編寫測試用例,并進(jìn)行功能開發(fā)。而這種重新編寫所花費(fèi)的人力與時(shí)間成本相比于上述兩種傳統(tǒng)方法開發(fā),有效性大大提升[8-10]。

      2 通過TDD提取領(lǐng)域?qū)ο髮拥姆椒?/p>

      在實(shí)際開發(fā)中,使用TDD結(jié)合面向?qū)ο蠓謱娱_發(fā)設(shè)計(jì)技術(shù),取得了良好效果。首先將系統(tǒng)劃分為服務(wù)層、業(yè)務(wù)邏輯層、領(lǐng)域?qū)ο髮?、持久化層、底層?shù)據(jù)庫等層次。在實(shí)際開發(fā)過程中,主要進(jìn)行領(lǐng)域?qū)ο蟮膭?chuàng)建,再由它向上擴(kuò)展出業(yè)務(wù)邏輯層和服務(wù)層軟件對(duì)象,向下借助O/R Mapping工具得到相應(yīng)的持久化層對(duì)象及數(shù)據(jù)庫表。在實(shí)際開發(fā)過程中,針對(duì)每個(gè)用戶需求寫出一個(gè)測試用例。使用Java的JUnit框架對(duì)生成的測試用例進(jìn)行自動(dòng)測試。測試用例的寫法與普通Java類似,只是每個(gè)作為測試用例的方法加上[test]注記,以使該方法的JUnit框架可以進(jìn)行自動(dòng)調(diào)用。在測試用例中可以使用Assert類檢查測試結(jié)果,比較實(shí)際結(jié)果與期望結(jié)果的差別。當(dāng)每個(gè)測試方法的結(jié)果不符合預(yù)期時(shí),該測試用例即被認(rèn)為沒有通過,此時(shí)開發(fā)者必須修改代碼,以通過該測試用例。

      2.1 領(lǐng)域?qū)ο蠡窘Y(jié)構(gòu)識(shí)別

      通過將需求分解為測試用例中的期望值與期望結(jié)果,可以很直觀地找到相應(yīng)的領(lǐng)域?qū)ο?。通過需求功能編寫測試用例,測試用例將直觀表達(dá)出用戶需求的各種數(shù)據(jù),由這些數(shù)據(jù)發(fā)現(xiàn)領(lǐng)域?qū)ο?。一般的領(lǐng)域?qū)ο蠖紩?huì)有創(chuàng)建、修改、檢索、刪除的操作(一般被稱為CRUD操作)。因此,對(duì)于一個(gè)已定義出的領(lǐng)域?qū)ο?,可以?chuàng)建4個(gè)測試用例,分別對(duì)應(yīng)這4種操作。為了使這幾個(gè)測試用例通過單元測試,它們的屬性和方法必須滿足測試用例中的調(diào)用。因此,根據(jù)測試用例獲得的領(lǐng)域?qū)ο笠部梢垣@得所需定義的屬性與方法,因而得到了相應(yīng)領(lǐng)域?qū)ο蟮幕窘Y(jié)構(gòu)。

      2.2 發(fā)現(xiàn)領(lǐng)域?qū)嶓w間的聯(lián)系

      當(dāng)進(jìn)行測試用例編寫時(shí),根據(jù)需求編寫測試用例,會(huì)發(fā)現(xiàn)領(lǐng)域?qū)嶓w間有很強(qiáng)的聯(lián)系。繼續(xù)從測試用例中發(fā)現(xiàn)新的實(shí)體。

      2.3 發(fā)現(xiàn)用于規(guī)則約束與取值范圍的實(shí)體類

      在定義領(lǐng)域?qū)嶓w時(shí),對(duì)于規(guī)則約束與取值范圍的考慮是一個(gè)重要內(nèi)容,屬于系統(tǒng)基礎(chǔ)架構(gòu)的一部分。通過撰寫某一領(lǐng)域?qū)嶓w的CRUD測試用例,可以將一個(gè)類的屬性上升為另一個(gè)獨(dú)立的類。

      根據(jù)對(duì)每個(gè)測試用例的相關(guān)操作,可以完整地定義出領(lǐng)域?qū)嶓w層中所有規(guī)則約束與取值范圍的類。

      2.4 領(lǐng)域?qū)嶓w層提取

      通過撰寫覆蓋需求的測試用例代碼,利用IDE的自動(dòng)化測試工具和代碼生成工具,可以很快構(gòu)建出領(lǐng)域?qū)嶓w層的領(lǐng)域?qū)嶓w、由于在測試用例中已對(duì)需要的領(lǐng)域?qū)嶓w的屬性和方法進(jìn)行了定義,因此可以很快地構(gòu)建出對(duì)應(yīng)領(lǐng)域?qū)嶓w類的框架代碼,然后直接實(shí)現(xiàn)領(lǐng)域?qū)嶓w類的屬性,最后實(shí)現(xiàn)領(lǐng)域?qū)ο蟮姆椒w。由于針對(duì)每個(gè)領(lǐng)域?qū)嶓w,已經(jīng)有對(duì)應(yīng)的一組CRUD測試用例。因此,該領(lǐng)域?qū)ο蟮姆椒▽?shí)現(xiàn)可以被立即驗(yàn)證其功能的正確性。

      3 通過TDD提取領(lǐng)域?qū)嶓w層的方法驗(yàn)證

      如用戶的需求為:需要將一份合同保存下來,合同信息需要保存日期、簽訂甲方、簽訂乙方、合同款項(xiàng)、支付方式、標(biāo)的物名稱。則相應(yīng)的測試用例為:

      [test]

      void canCreateContract(){

      Contract newcontract = new Contract ();

      newcontract.signdate = newdate;

      newcontract.PartyA = “湖北晨星公司”;

      newcontract.PartyB = “萬琪公司”;

      newcontract.TradeItem = “房屋裝修”;

      newcontract.Money = 2000000.00;

      newcontract.PayMethod = ”銀行轉(zhuǎn)帳”;

      Repository repos = Repository.getInstance();

      int count = repos.getObjectCount(Contract.class);

      repos.saveObject(newcontract);

      Assert.assertNotEqual(newcontract.ID, null);

      Assert.assertEqual(newcontract.SerialNo, 0);

      Assert.assertEqual(count+1,repos,getObjectCount(Contract.class));

      }

      由該測試用例可得到兩個(gè)領(lǐng)域?qū)嶓w類Contract與Repository,進(jìn)一步設(shè)計(jì)CRUD測試用例,得到其屬性與方法??色@得Contract與Repository類所需要定義的屬性與方法,也因此得到相應(yīng)領(lǐng)域?qū)ο蟮幕窘Y(jié)構(gòu)。

      設(shè)計(jì)測試用例發(fā)現(xiàn)實(shí)體間的聯(lián)系,比如需要滿足需求“每份裝修施工合同必須記錄每個(gè)房間的面積、使用材質(zhì)以及所需施工時(shí)間”,可發(fā)現(xiàn)新的領(lǐng)域?qū)嶓w類、合同明細(xì)類ContractItem。

      根據(jù)規(guī)則約束與取值范圍繼續(xù)設(shè)計(jì)測試用例,則可以保證“銀行轉(zhuǎn)帳”、“現(xiàn)金”等之外不合法的數(shù)據(jù)被測試用例識(shí)別。得到新的實(shí)體類、交易方式類TradeMethod。

      根據(jù)以上步驟,可以快速得出領(lǐng)域?qū)ο髮拥能浖?,?shí)現(xiàn)系統(tǒng)功能。圖2是根據(jù)上述測試用例設(shè)計(jì)實(shí)現(xiàn)的領(lǐng)域?qū)ο髮屿o態(tài)結(jié)構(gòu)圖。

      猜你喜歡
      測試用例
      測試用例自動(dòng)生成技術(shù)綜述
      回歸測試中測試用例優(yōu)化技術(shù)研究與探索
      基于SmartUnit的安全通信系統(tǒng)單元測試用例自動(dòng)生成
      淺析基于因果圖法軟件測試用例的設(shè)計(jì)
      基于MBD模型自動(dòng)生成測試用例的軟件測試方法
      基于混合遺傳算法的回歸測試用例集最小化研究
      基于需求模型的航天軟件測試用例生成方法
      基于依賴結(jié)構(gòu)的測試用例優(yōu)先級(jí)技術(shù)
      電動(dòng)汽車整車控制軟件測試用例設(shè)計(jì)方法及應(yīng)用
      軟件測試用例執(zhí)行優(yōu)化研究
      鄂温| 新民市| 泸溪县| 遵化市| 花垣县| 建始县| 锦屏县| 会泽县| 迁西县| 泾阳县| 凌海市| 长寿区| 安新县| 仪征市| 杭锦旗| 泸州市| 榆林市| 天峻县| 疏附县| 牡丹江市| 荥阳市| 大同县| 成安县| 三都| 商南县| 汪清县| 和顺县| 铜山县| 乡宁县| 凌海市| 涟水县| 怀安县| 昌吉市| 泽普县| 湖南省| 赣榆县| 南投县| 葫芦岛市| 朝阳市| 绥阳县| 洮南市|