自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ZOMBIES:軟件開(kāi)發(fā)和測(cè)試中的構(gòu)建與拓展(二)

開(kāi)發(fā)
在開(kāi)發(fā)初期只對(duì)單個(gè)元素進(jìn)行編碼和測(cè)試,之后再拓展到多個(gè)元素上。

在 上一篇文章 中我已經(jīng)解釋了為什么把所有編程問(wèn)題當(dāng)作一群?jiǎn)适淮涡蕴幚硎清e(cuò)誤的。我也解釋了 ZOMBIES 方法中的第一條:最簡(jiǎn)場(chǎng)景。本文中我將進(jìn)一步介紹接下來(lái)的兩條:?jiǎn)卧貓?chǎng)景和多元素場(chǎng)景。

ZOMBIES 表示以下首字母縮寫(xiě):

  • Z – 最簡(jiǎn)場(chǎng)景(Zero)
  • O – 單元素場(chǎng)景(One)
  • M – 多元素場(chǎng)景(Many or more complex)
  • B – 邊界行為(Boundary behaviors)
  • I – 接口定義(Interface definition)
  • E – 處理特殊行為(Exercise exceptional behavior)
  • S – 簡(jiǎn)單場(chǎng)景用簡(jiǎn)單的解決方案(Simple scenarios, simple solutions)

在上一篇文章中,通過(guò)應(yīng)用了最簡(jiǎn)場(chǎng)景,你在代碼里構(gòu)建了一條最簡(jiǎn)可行通路。這個(gè)代碼里沒(méi)有任何業(yè)務(wù)處理邏輯。現(xiàn)在是時(shí)候向系統(tǒng)中添加一個(gè)元素了。

最簡(jiǎn)場(chǎng)景表示系統(tǒng)中什么也沒(méi)有,這是一個(gè)空的用例,我們什么也不用關(guān)心。單元素場(chǎng)景代表我們有一個(gè)元素需要關(guān)心考慮。這個(gè)單一元素可能是集合中的一個(gè)元素、一個(gè)訪問(wèn)著或者一個(gè)需要處理的事件。

對(duì)于多元素場(chǎng)景,我們需要處理更復(fù)雜的情況,比如兩個(gè)或更多的集合元素或事件。

單元素場(chǎng)景

在上一篇文章的代碼基礎(chǔ)上,向虛擬購(gòu)物筐里添加一些商品。首先,寫(xiě)一個(gè)偽測(cè)試:

[Fact]
public void Add1ItemBasketHas1Item() {
        var expectedNoOfItems = 1;
        var actualNoOfItems = 0;
        Assert.Equal(expectedNoOfItems, actualNoOfItems);
}

不出所料,這個(gè)測(cè)試失敗了,因?yàn)橛簿幋a了一個(gè)錯(cuò)誤的值:

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.57] tests.UnitTest1.NewlyCreatedBasketHas0Items [FAIL]
  X tests.UnitTest1.NewlyCreatedBasketHas0Items [4ms]
  Error Message:
   Assert.Equal() Failure
Expected: 0
Actual: 1
[...]

現(xiàn)在是時(shí)候停止偽造了?,F(xiàn)在你已經(jīng)用 ArrayList 實(shí)現(xiàn)了購(gòu)物筐。那么應(yīng)該怎么實(shí)現(xiàn)商品呢?

簡(jiǎn)潔性應(yīng)該一直是你的指導(dǎo)原則。在不了解商品的太多信息的情況下,你可以先用另一個(gè)集合來(lái)實(shí)現(xiàn)它。這個(gè)表示商品的集合應(yīng)該包含些什么呢?由于你多半會(huì)關(guān)心計(jì)算購(gòu)物筐中的商品總價(jià),所以對(duì)商品的表示至少需要包含價(jià)格(可以是任意貨幣,為簡(jiǎn)單起見(jiàn),不妨假設(shè)是人民幣)。

(我們需要)一個(gè)簡(jiǎn)單的集合類型,它包含一個(gè)商品 ID(可以在系統(tǒng)中的其它地方使用 ID 來(lái)指向該商品)和這個(gè)商品的價(jià)格。

鍵值對(duì)類型的數(shù)據(jù)結(jié)構(gòu)可以很容易滿足這個(gè)需求。在 C# 中最先被想到的數(shù)據(jù)結(jié)構(gòu)就是 Hashtable

在購(gòu)物應(yīng)用的代碼中給 IShoppingAPI 增加一個(gè)新功能:

int AddItem(Hashtable item);

這個(gè)新功能以一個(gè)用 Hashtable 表示的商品為輸入,返回購(gòu)物筐中的商品數(shù)量。

將測(cè)試代碼中硬編碼的值提替換為對(duì)接口的調(diào)用:

[Fact]
public void Add1ItemBasketHas1Item() {            
    var expectedNoOfItems = 1;
    Hashtable item = [new][3] Hashtable();
    var actualNoOfItems = shoppingAPI.AddItem(item);
    Assert.Equal(expectedNoOfItems, actualNoOfItems);
}

在上面的代碼中實(shí)例化了一個(gè) Hashtable 并命名為 item,然后調(diào)用購(gòu)物接口中的 AddItem(item) 方法,該方法會(huì)返回購(gòu)物筐中實(shí)際的商品數(shù)量。

轉(zhuǎn)到 ShoppingAPI 類中,實(shí)現(xiàn)這個(gè)方法:

public int AddItem(Hashtable item) {
    return 0;
}

這里再次通過(guò)寫(xiě)假代碼來(lái)檢驗(yàn)測(cè)試的效果(測(cè)試是業(yè)務(wù)代碼的第一個(gè)調(diào)用者)。如果測(cè)試失敗,將硬編碼值換成實(shí)際的代碼:

public int AddItem(Hashtable item) {
    basket.Add(item);
    return basket.Count;
}

在上面的代碼中,向購(gòu)物筐里添加了一件商品,然后返回購(gòu)物筐中的商品數(shù)量:

Test Run Successful.
Total tests: 2
     Passed: 2
 Total time: 1.0633 Seconds

到目前為止,你通過(guò)了兩個(gè)測(cè)試,同時(shí)也基本里解了 ZOMBIES 方法中的最簡(jiǎn)場(chǎng)景和單元素場(chǎng)景兩部分。

反思總結(jié)

回顧前面所做的工作,你會(huì)發(fā)現(xiàn)通過(guò)將注意力集中到處理最簡(jiǎn)場(chǎng)景和單元素場(chǎng)景上,你在構(gòu)建接口的同時(shí)也定義了一些業(yè)務(wù)邏輯邊界!這不是很棒嗎?現(xiàn)在你已經(jīng)部分地實(shí)現(xiàn)了最關(guān)鍵的抽象邏輯,并且能夠處理什么也沒(méi)有和只有一個(gè)元素的的情況。因?yàn)槟阏跇?gòu)建的是一個(gè)電子交易 API,所以你不能對(duì)顧客的購(gòu)物行為預(yù)設(shè)其它限制??偠灾?,虛擬購(gòu)物筐應(yīng)該是無(wú)限大的。

ZOMBIES 提供的逐步優(yōu)化思路的另一個(gè)重要方面(雖然不是很明顯)是從大概思路到具體實(shí)現(xiàn)的阻力。你也許已經(jīng)注意到了,要具體實(shí)現(xiàn)某個(gè)東西總是困難重重。倒不如先用硬編碼值來(lái)構(gòu)造一個(gè)偽實(shí)現(xiàn)。只有看到接口與測(cè)試之間以一種合理的方式交互之后,你才會(huì)愿意開(kāi)始完善實(shí)現(xiàn)代碼。

即便如此,你也應(yīng)該采用簡(jiǎn)單直接的代碼結(jié)構(gòu),盡可能避免條件邏輯分支。

多元素場(chǎng)景

通過(guò)定義顧客向購(gòu)物筐里添加兩件商品時(shí)的期望來(lái)拓展應(yīng)用程序。首先構(gòu)造一個(gè)偽測(cè)試。它的期望值為 2,但是現(xiàn)在將實(shí)際值硬編碼為 0,強(qiáng)制讓測(cè)試失?。?/p>

[Fact]
public void Add2ItemsBasketHas2Items() {
        var expectedNoOfItems = 2;
        var actualNoOfItems = 0;
        Assert.Equal(expectedNoOfItems, actualNoOfItems);
}

執(zhí)行測(cè)試,前兩個(gè)測(cè)試用例通過(guò)了(針對(duì)最簡(jiǎn)場(chǎng)景和單元素場(chǎng)景的測(cè)試),而硬編碼的測(cè)試不出所料地失敗了:

A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.57] tests.UnitTest1.Add2ItemsBasketHas2Items [FAIL]
  X tests.UnitTest1.Add2ItemsBasketHas2Items [2ms]
  Error Message:
   Assert.Equal() Failure
Expected: 2
Actual: 0

Test Run Failed.
Tatal tests: 3
     Passed: 2
     Failed: 1

將硬編碼值替換為實(shí)際的代碼調(diào)用:

[Fact]
public void Add2ItemsBasketHas2Items() {
        var expectedNoOfItems = 2;
        Hashtable item = [new][3] Hashtable();
        shoppingAPI.AddItem(item);
        var actualNoOfItems = shoppingAPI.AddItem(item);
        Assert.Equal(expectedNoOfItems, actualNoOfItems);
}

在這個(gè)測(cè)試中,你向購(gòu)物筐中添加了兩件商品(實(shí)際上是將同一件商品添加了兩次),然后比較期望的商品數(shù)量和第二次添加商品后調(diào)用 shoppingAPI 返回的商品數(shù)量是否相等。

現(xiàn)在所有測(cè)試都能夠通過(guò)!

敬請(qǐng)期待

現(xiàn)在你已經(jīng)了解了最簡(jiǎn)場(chǎng)景、單元素場(chǎng)景和多元素場(chǎng)景。我將下一篇文章中介紹邊界行為和接口定義。敬請(qǐng)期待!

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2023-05-13 17:38:03

ZOMBIES軟件開(kāi)發(fā)

2023-05-30 18:19:23

ZOMBIES開(kāi)發(fā)軟件

2023-05-30 18:26:49

ZOMBIES軟件開(kāi)發(fā)

2023-02-09 16:48:12

軟件開(kāi)發(fā)測(cè)試結(jié)對(duì)測(cè)試

2011-05-12 11:28:40

軟件開(kāi)發(fā)

2023-01-09 16:08:19

2018-01-09 18:33:24

軟件開(kāi)發(fā)測(cè)試軟件測(cè)試

2024-04-02 06:03:00

GenAI軟件開(kāi)發(fā)人工智能

2009-06-12 11:35:28

模式框架軟件設(shè)計(jì)

2016-09-28 19:26:31

2023-06-09 19:01:03

軟件開(kāi)發(fā)

2011-08-11 09:56:50

模式

2024-07-23 08:06:19

緩存技術(shù)策略

2022-08-26 08:18:04

軟件開(kāi)發(fā)高級(jí)系統(tǒng)設(shè)計(jì)低級(jí)系統(tǒng)設(shè)計(jì)

2016-12-26 18:16:20

軟件開(kāi)發(fā)云華為企業(yè)云華為

2011-12-26 15:19:20

聚合

2014-03-21 09:30:26

軟件開(kāi)發(fā)碼農(nóng)

2023-06-08 16:47:09

軟件開(kāi)發(fā)工具

2014-01-16 14:06:18

軟件開(kāi)發(fā)團(tuán)隊(duì)管理

2013-02-18 09:54:05

軟件開(kāi)發(fā)程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)