TDD演示

?TDD測試演示

?TDD算柳,是踢蛋蛋,啊不台谢,是測試驅(qū)動開發(fā)的簡稱

那什么是TDD寻狂,其實可以粗淺的理解為,先寫測試類朋沮。

詳細(xì)可以百度蛇券。

TDD的實現(xiàn)流程可以大概下圖表示:


?我們先看下下面這個需求。

模擬小白和小強打架樊拓,小白和小強有普通攻擊和大招纠亚,還有狀態(tài)。

在打架之后筋夏,小白和小強的狀態(tài)會改變(狀態(tài)簡化為只有血量)蒂胞。

小白的A為普通攻擊會扣5滴血,B為大招回自己10滴血条篷,扣對方10滴血啤誊。小白最大血量120岳瞭。

小強的A為普通攻擊會扣6滴血,B為大招傷自己5滴血蚊锹,扣對方30滴血。小強最大血量100稚瘾。

?我們先上手一個測試類牡昆。(代碼為java,你們可以補充其他語言的例子)

首先摊欠,要測試這小白和小強打架丢烘,肯定先要有個小白和小強,然后他們打架些椒。

這個打架的執(zhí)行用一個業(yè)務(wù)類來執(zhí)行播瞳,叫Fight。

所以我們先寫一個測試類叫FightTest免糕,為Fight這個業(yè)務(wù)類編寫測試赢乓,專門用來測試Fight

測試先行,我們就要先想Fight類中有什么石窑。這個業(yè)務(wù)類應(yīng)該有一個方法Fight.action牌芋。這個方法是打架的動作。

Fight.action這個方法傳入兩個Role(角色)和一個代表動作的字符 action

這個Fight.action可以用來執(zhí)行小白和小強打架的動作

然后要有兩個角色Role松逊,一個小白LittleWhite躺屁,一個小強LitterStrong。實現(xiàn)這兩個對象

所以我們直接寫出兩個對象new出來经宏,然后寫出Fight.action方法的測試用例

所以我們要寫一個Fight測試用例(諾犀暑,TDD就是先寫測試)我們要思考怎么測試Fight.action才是符合需求的。

讓測試結(jié)果符合需求烁兰。

由于我們需求是讓攻擊之后角色狀態(tài)改變耐亏,所以我們要測試每一種攻擊的可能造成的結(jié)果是否符合需求。

public class FightTest {

Fight f = null;

Role littleWhite = null;

Role littleStrong = null;

//@Before注解的意思是每次執(zhí)行@Test注解測試的時候都會執(zhí)行@Before注解的內(nèi)容

@Before

public void setUp() throws Exception {

f = new Fight();

littleWhite = new Role();

littleStrong = new Role();

}

//@Test注解用來執(zhí)行測試缚柏,該方法測試Fight.action

//記住苹熏,一個類寫一個測試類,每個方法寫一個測試方法(一些比較簡單的方法比如get币喧,set那些可以不用測)

@Test

public void testAction() {

State state = new State();

//初始化狀態(tài)測試,測試血量超過最大值的情況

state.setBlood(130);

littleWhite.setState(state);

littleStrong.setState(state);

state.setBlood(120);

Assert.assertEquals(state, littleWhite.getState());

state.setBlood(100);

Assert.assertEquals(state, littleStrong.getState());

state.setBlood(100);

littleWhite.setState(state);

littleStrong.setState(state);

//littleWhite的所有攻擊測試包括邊際條件

//進(jìn)攻方轨域,防守方,攻擊方式A杀餐。

f.action(littleWhite, littleStrong, 'A');

state.setBlood(95);

Assert.assertEquals(state, littleStrong.getState());

state.setBlood(120);

littleWhite.setState(state);

state.setBlood(100);

littleStrong.setState(state);

f.action(littleWhite, littleStrong, 'B');

state.setBlood(120);

Assert.assertEquals(state, littleWhite.getState());

state.setBlood(90);

Assert.assertEquals(state, littleStrong.getState());

state.setBlood(0);

littleStrong.setState(state);

f.action(littleWhite, littleStrong, 'A');

Assert.assertEquals(state, littleStrong.getState());

state.setBlood(1);

littleStrong.setState(state);

f.action(littleWhite, littleStrong, 'A');

state.setBlood(0);

Assert.assertEquals(state, littleStrong.getState());

state.setBlood(0);

littleStrong.setState(state);

f.action(littleWhite, littleStrong, 'B');

Assert.assertEquals(state, littleStrong.getState());

state.setBlood(1);

littleStrong.setState(state);

f.action(littleWhite, littleStrong, 'B');

state.setBlood(0);

Assert.assertEquals(state, littleStrong.getState());

state.setBlood(100);

littleWhite.setState(state);

//littleStrong的所有攻擊測試包括邊際條件

f.action(littleStrong, littleWhite, 'A');

state.setBlood(94);

Assert.assertEquals(state, littleWhite.getState());

state.setBlood(100);

littleWhite.setState(state);

f.action(littleStrong, littleWhite, 'B');

state.setBlood(70);

Assert.assertEquals(state, littleWhite.getState());

state.setBlood(0);

littleWhite.setState(state);

f.action(littleStrong, littleWhite, 'A');

state.setBlood(0);

Assert.assertEquals(state, littleWhite.getState());

state.setBlood(1);

littleWhite.setState(state);

f.action(littleStrong, littleWhite, 'A');

state.setBlood(0);

Assert.assertEquals(state, littleWhite.getState());

f.action(littleStrong, littleWhite, 'B');

state.setBlood(0);

Assert.assertEquals(state, littleWhite.getState());

state.setBlood(1);

littleWhite.setState(state);

f.action(littleStrong, littleWhite, 'B');

state.setBlood(0);

Assert.assertEquals(state, littleWhite.getState());

}

}

然后為了不報錯我們要創(chuàng)建Role類和Fight類還有State類干发,并且Fight類中創(chuàng)建action方法。

記住這個時候不要著急實現(xiàn)三個類的內(nèi)容史翘。

所以三個類里面只有這么多東西

public class Fight? {

public void action(Role attack, Role defense, char action) {

}

}

public class Role {

State state;

public State getState() {

return state;

}

public void setState(State state) {

this.state = state;

}

}

public class State {

int blood;

public int getBlood() {

return blood;

}

public void setBlood(int blood) {

this.blood = blood;

}

}

public class Fight? {

public void action(Role first, Role second, char trick) {

}

}

然后這個時候我們知道了枉长,實現(xiàn)需求要構(gòu)建三個類冀续,剛剛寫了Fight類的測試,而Role類和State類的測試還沒寫

所以我們需要寫出Role類和State類的測試

然后我們分析需求必峰。Role類為角色類洪唐,這個類應(yīng)該有個方法模擬Role的動作。

這個方法可以接受Fight.action傳進(jìn)來攻擊方式和對手的狀態(tài)

然后返回對手更新后的狀態(tài)回Fight.action

然后根據(jù)這個需求寫測試類RoleTest

public class RoleTest {

Role r = null;

Trick defaultTrick = null;

Trick bigTrick = null;

@Before

public void setUp() throws Exception {

r = new Role();

defaultTrick = new Trick();

bigTrick = new Trick();

r.setDefaultTrick(defaultTrick);

r.setBigTrick(bigTrick);

}

@Test

public void testExecute() {

Trick defaultTrick = new Trick();

r.setDefaultTrick(defaultTrick);

State olestate = new State();

olestate.setBlood(100);

State newstate = new State();

newstate.setBlood(95);

Assert.assertEquals(newstate, r.execute (olestate,'A'));

//.........后面省略

}

}

另外還要Statk類的測試用例

public class StatkTest {

//................省略

}

我們在寫的時候發(fā)現(xiàn)吼蚁,我們Role需要兩個Trick(招數(shù))對象defaultTrick(普通攻擊),和bigTrick(大招)

來描述凭需。所以我們添加上兩個Trick屬性,以及新建一個Trick類肝匆。

Role類變成這樣粒蜈。但我們還是不要急著實現(xiàn)

public class Role {

State state;

Trick defaultTrick;

Trick bigTrick;

public Trick getDefaultTrick() {

return defaultTrick;

}

public void setDefaultTrick(Trick defaultTrick) {

this.defaultTrick = defaultTrick;

}

public Trick getBigTrick() {

return bigTrick;

}

public void setBigTrick(Trick bigTrick) {

this.bigTrick = bigTrick;

}

public State getState() {

return state;

}

public void setState(State state) {

this.state = state;

}

public State execute(State defense, char trick) {

return null;

}

}

依然的,我們先創(chuàng)建個Trick的測試用例

public class TrickTest {

//................省略

}

這個時候我們終于可以開始實現(xiàn)Trick旗国。然后寫完一個方法枯怖,運行一個測試方法。

測試通過之后進(jìn)行代碼重構(gòu)能曾。代碼重構(gòu)無需修改測試度硝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市借浊,隨后出現(xiàn)的幾起案子塘淑,更是在濱河造成了極大的恐慌,老刑警劉巖蚂斤,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件存捺,死亡現(xiàn)場離奇詭異,居然都是意外死亡曙蒸,警方通過查閱死者的電腦和手機捌治,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纽窟,“玉大人肖油,你說我怎么就攤上這事”鄹郏” “怎么了森枪?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長审孽。 經(jīng)常有香客問我县袱,道長,這世上最難降的妖魔是什么佑力? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任式散,我火速辦了婚禮,結(jié)果婚禮上打颤,老公的妹妹穿的比我還像新娘暴拄。我一直安慰自己漓滔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布乖篷。 她就那樣靜靜地躺著响驴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪那伐。 梳的紋絲不亂的頭發(fā)上踏施,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音罕邀,去河邊找鬼。 笑死养距,一個胖子當(dāng)著我的面吹牛诉探,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棍厌,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼肾胯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耘纱?” 一聲冷哼從身側(cè)響起敬肚,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎束析,沒想到半個月后艳馒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡员寇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年弄慰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝶锋。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡陆爽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扳缕,到底是詐尸還是另有隱情慌闭,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布躯舔,位于F島的核電站驴剔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏庸毫。R本人自食惡果不足惜仔拟,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飒赃。 院中可真熱鬧利花,春花似錦科侈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挠乳,卻和暖如春权薯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睡扬。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工盟蚣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卖怜。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓屎开,卻偏偏與公主長得像,于是被迫代替她去往敵國和親马靠。 傳聞我的和親對象是個殘疾皇子奄抽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)甩鳄,斷路器逞度,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,511評論 0 23
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法妙啃,內(nèi)部類的語法档泽,繼承相關(guān)的語法,異常的語法彬祖,線程的語...
    子非魚_t_閱讀 31,643評論 18 399
  • 今天我生日茁瘦,往家打了電話,弟媳婦祝我生日快樂储笑!家里唯一一個親人的祝福甜熔!謝謝了! 我還是先把自己調(diào)整好吧突倍!家里的人和...
    李娟日記閱讀 133評論 0 0
  • 1. 上學(xué)時有一個同學(xué)A羽历,她從來不遲到早退焊虏,按時上下學(xué)。上課時腰板挺的直直的秕磷,目不轉(zhuǎn)睛跟隨老師的行動而移動诵闭。課間1...
    小饞媽閱讀 647評論 2 3