国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于TDD的領(lǐng)域?qū)ο髮訉ο筇崛》椒ㄑ芯?/h1>
2018-05-15 08:31姚遠(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ū)ο髮又械膶ο髮φ鎸嵤澜缋锏臉I(yè)務(wù)及角色進(jìn)行抽象與映射,封裝了現(xiàn)實世界中的關(guān)鍵業(yè)務(wù)過程與實體狀態(tài)。因此,如何建立云服務(wù)領(lǐng)域?qū)ο髮邮敲嫦驅(qū)ο箝_發(fā)方法中的關(guān)鍵部分。測試驅(qū)動開發(fā)(Test Driven Development ,簡稱TDD)作為一種軟件開發(fā)方法,使用一組單元測試用例作為軟件開發(fā)的基礎(chǔ)與手段,意在使軟件開發(fā)過程始終不偏離軟件的主要功能,以實現(xiàn)敏捷開發(fā)。提出一種基于TDD進(jìn)行領(lǐng)域?qū)ο髮拥膶ο筇崛?、?gòu)建領(lǐng)域?qū)ο髮拥姆椒ǎ⑼ㄟ^實例對該方法進(jìn)行驗證。驗證結(jié)果顯示,構(gòu)建的領(lǐng)域?qū)ο髮恿6染?xì),識別準(zhǔn)確、完整。

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

DOI:10.11907/rjdk.172548

中圖分類號:TP301

文獻(xiàn)標(biāo)識碼:A 文章編號: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)域邏輯對象原理

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

面向?qū)ο蠓治?、設(shè)計與開發(fā)已由最初的粗粒度簡單對象封裝,演化出幾種成熟的分層對象設(shè)計模型。受C/S(客戶/服務(wù)器)、N-Tier(多層架)、B/S架構(gòu)、SOA(面向服務(wù)架構(gòu))等軟件開發(fā)架構(gòu)的影響,以及多種開發(fā)語言進(jìn)化的推動,面向?qū)ο蟮能浖话憧砂?~5個邏輯層次劃分[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完成,同時由于領(lǐng)域?qū)嶓w是現(xiàn)實世界中人、物的抽象,只要是屬于該業(yè)務(wù)領(lǐng)域的專家即能對領(lǐng)域?qū)嶓w進(jìn)行問題分析,這就為現(xiàn)實需求理解和軟件功能實現(xiàn)之間搭建了一座很好的橋梁。領(lǐng)域?qū)ο竽P偷慕⒁矠檐浖δ軐崿F(xiàn)帶來了極大好處,由于領(lǐng)域內(nèi)業(yè)務(wù)流程容易發(fā)生變化,但領(lǐng)域?qū)ο髤s相對變化較小,所以通過先識別領(lǐng)域?qū)ο髮?,進(jìn)而構(gòu)建整個軟件層次對象模型,可以大大降低軟件的升級和維護(hù)成本。

一般有兩種方法實現(xiàn)領(lǐng)域?qū)嶓w層中的領(lǐng)域?qū)ο蠼#孩儆蒛ML統(tǒng)一建模過程提出的傳統(tǒng)方法進(jìn)行識別,這種方法要求在軟件需求獲取階段使用用例圖捕捉用戶需求,并根據(jù)用例圖中的名詞、行為等進(jìn)行領(lǐng)域?qū)嶓w識別;②由數(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è)計,要求一開始就有一個宏大而全局的軟件架構(gòu),這對于軟件設(shè)計者把握架構(gòu)與系統(tǒng)分析能力都提出了較高要求,而后者則由傳統(tǒng)的CS架構(gòu)體系轉(zhuǎn)化而來,先做好數(shù)據(jù)庫設(shè)計再由數(shù)據(jù)表映射出領(lǐng)域?qū)嶓w。這種方式實際上是一種由面向過程開發(fā)向面向?qū)ο蟮倪^渡方式,由于數(shù)據(jù)庫先于領(lǐng)域?qū)嶓w設(shè)計出來,所以軟件開發(fā)不得不向已經(jīng)成形的數(shù)據(jù)庫架構(gòu)傾斜,使軟件后續(xù)設(shè)計遭遇掣肘。因此,本文提出TDD構(gòu)建領(lǐng)域?qū)ο蟮姆椒ā?/p>

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

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

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

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

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

通過將需求分解為測試用例中的期望值與期望結(jié)果,可以很直觀地找到相應(yīng)的領(lǐng)域?qū)ο?。通過需求功能編寫測試用例,測試用例將直觀表達(dá)出用戶需求的各種數(shù)據(jù),由這些數(shù)據(jù)發(fā)現(xiàn)領(lǐng)域?qū)ο?。一般的領(lǐng)域?qū)ο蠖紩袆?chuàng)建、修改、檢索、刪除的操作(一般被稱為CRUD操作)。因此,對于一個已定義出的領(lǐng)域?qū)ο螅梢詣?chuàng)建4個測試用例,分別對應(yīng)這4種操作。為了使這幾個測試用例通過單元測試,它們的屬性和方法必須滿足測試用例中的調(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)行測試用例編寫時,根據(jù)需求編寫測試用例,會發(fā)現(xiàn)領(lǐng)域?qū)嶓w間有很強(qiáng)的聯(lián)系。繼續(xù)從測試用例中發(fā)現(xiàn)新的實體。

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

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

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

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

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

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

如用戶的需求為:需要將一份合同保存下來,合同信息需要保存日期、簽訂甲方、簽訂乙方、合同款項、支付方式、標(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));

}

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

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

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

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

猜你喜歡
測試用例
基于SmartUnit的安全通信系統(tǒng)單元測試用例自動生成
淺析基于因果圖法軟件測試用例的設(shè)計
基于MBD模型自動生成測試用例的軟件測試方法
基于混合遺傳算法的回歸測試用例集最小化研究
基于需求模型的航天軟件測試用例生成方法
基于依賴結(jié)構(gòu)的測試用例優(yōu)先級技術(shù)
電動汽車整車控制軟件測試用例設(shè)計方法及應(yīng)用
軟件測試用例執(zhí)行優(yōu)化研究
淺析軟件測試用例管理
軟件回歸測試用例選取方法研究

洪泽县| 图们市| 博爱县| 衡阳市| 横峰县| 彭水| 榕江县| 灵璧县| 揭阳市| 白朗县| 抚宁县| 五莲县| 茶陵县| 巴南区| 广水市| 武城县| 安图县| 铜鼓县| 榕江县| 陇南市| 清水河县| 巨鹿县| 长武县| 铅山县| 江城| 恩平市| 连云港市| 阿尔山市| 炉霍县| 固阳县| 宜都市| 中卫市| 梨树县| 津市市| 峨边| 宜丰县| 荣昌县| 延长县| 双流县| 衡阳县| 广德县|