[译] 单元测试,精益创业,以及两者之间的关系
- 原文地址:Unit testing, Lean Startup, and everything in-between
- 原文作者:Itamar Turner-Trauring
- 譯文出自:掘金翻譯計(jì)劃
- 譯者:gy134340
- 校對(duì)者:zhaochuanxing,yifili09
為什么軟件需要測(cè)試?
我曾經(jīng)以為是為了產(chǎn)出高質(zhì)量的代碼:你總是需要測(cè)試因?yàn)槟憧偸切枰獙懗龈哔|(zhì)量的代碼。
但是這個(gè)觀點(diǎn)有幾點(diǎn)問題。
有時(shí)候質(zhì)量不是主要問題。
在“精益創(chuàng)業(yè)” 這本書中,作者 Rric Ries 說過有時(shí)候發(fā)布一個(gè)軟件最終發(fā)現(xiàn)沒人真的想用它。
這也是他創(chuàng)作的動(dòng)機(jī)之一: 為創(chuàng)業(yè)初期建立一套更好的方法論,在真正投入時(shí)間去構(gòu)建一個(gè)高質(zhì)量的產(chǎn)品時(shí),就能夠發(fā)現(xiàn)這款產(chǎn)品是否能夠成功的方法論。
如果沒人用你的軟件的話那么確保高質(zhì)量純屬浪費(fèi)時(shí)間。
即使高質(zhì)量很有必要,但高質(zhì)量與測(cè)試之間的關(guān)系卻很模糊的。
一個(gè) QA 的團(tuán)隊(duì)跟自動(dòng)化的單元測(cè)試又什么不同?
他們的確不一樣,但他們又分別給出什么樣的質(zhì)量?
什么時(shí)候需要特別的測(cè)試?
另外,測(cè)試是有成本的:你怎樣辨別成本的花費(fèi)是否超出回報(bào)?
比如說,有一家做稅務(wù)申報(bào)軟件的公司(我稍微改了一下細(xì)節(jié))。
他們使用 Selenium 來對(duì)他們網(wǎng)站的 UI 來測(cè)試... 但是他們的應(yīng)用依然很爛,而且每次改變 UI 測(cè)試都會(huì)崩潰。
這個(gè)測(cè)試并沒有改變產(chǎn)品的質(zhì)量,相反浪費(fèi)了程序員的時(shí)間來維護(hù)測(cè)試。
他們做錯(cuò)了什么?
說我們都需要寫出高質(zhì)量的軟件并不能幫助解決這些問題。
那我們回頭來更加深入的討論一下。
測(cè)試的意義是什么?
康熙字典 :)?)里告訴我們測(cè)試是為了 “舉證,通過一定原則或標(biāo)準(zhǔn)或?qū)嶒?yàn)來,證明真理,真實(shí)性?!?br /> 軟件質(zhì)量就在那里,是的,但事實(shí)卻又不僅如此。
準(zhǔn)確的說,這只是英語定義,可以肯定,有很多不說英語的開發(fā)者。
我不想被字典來束縛我們的行為。
人類語言是數(shù)世紀(jì)以來對(duì)世界的觀察和理解,也是我們可以拿來借鑒的寶庫。
那我們來以這個(gè)為出發(fā)點(diǎn)來看看能學(xué)到點(diǎn)什么。
測(cè)試的第一個(gè)方面
下面這個(gè)是測(cè)試吧?
def test_add():assert add(2, 2) == 5沒錯(cuò),他還真是,沒毛病。
看函數(shù)名,一點(diǎn)都沒錯(cuò)。
測(cè)試說明?add()?做了他該做的:將兩個(gè)數(shù)相加得到結(jié)果。
你注意到這個(gè)測(cè)試是錯(cuò)的。
幸運(yùn)的是我們的開發(fā)流程進(jìn)入到了另一步:代碼審查。
親愛的讀者們,代碼審查告訴我我的代碼是錯(cuò)的,2 + 2 = 4,不是 5。
代碼審查是不是測(cè)試的一種?
根據(jù)字典定義來說是的:代碼審查就是根據(jù)標(biāo)準(zhǔn)來驗(yàn)證代碼的 “正確,真實(shí)性和質(zhì)量”,這個(gè)從小我們就知道。
那我們假設(shè)代碼審查跟單元測(cè)試一樣都是測(cè)試的一種。
他們都是測(cè)試,卻又相當(dāng)不同。
那主要的區(qū)別在哪里?
一種是自動(dòng)化的,一種是人來做的。
自動(dòng)化測(cè)試具有一致性和可重復(fù)性。
你可以這樣寫:
電腦每次都跑一遍一摸一樣的代碼。
代碼可以保證根據(jù)輸入每次調(diào)用add()返回他們的結(jié)果。
人在手動(dòng)驗(yàn)證一千萬種不同的計(jì)算時(shí)會(huì)遇到一些困難,比如無聊、分心、失誤、緩慢啦等等。
另一方面,任何人都可以很快的告訴你下面的代碼是錯(cuò)的:
def add(a, b):return a + b + 1計(jì)算機(jī)只按照指令執(zhí)行操作,孰對(duì)孰錯(cuò),人類能賦予它意義。
只有人才知道軟件是為何而生。
現(xiàn)在我們知道每種測(cè)試的不同,以及如何組織它:人類來發(fā)現(xiàn)意義,自動(dòng)化測(cè)試確保一致性。
測(cè)試的第二個(gè)方面
我們來看一下測(cè)試的另一個(gè)方面。
“A/B 測(cè)試”是一種嘗試不同分類來看哪種結(jié)果更好的測(cè)試。
比如你為了測(cè)試網(wǎng)站新的設(shè)計(jì):給 90% 的訪問者原有的設(shè)計(jì),同時(shí)給 10% 的訪問者新的設(shè)計(jì),看看哪種注冊(cè)人數(shù)多一點(diǎn)。
這是測(cè)試嗎?
這就叫 “A/B 測(cè)試”,跟它的名字一樣。
我們來重新看一下字典定義:“舉證,通過一定原則或標(biāo)準(zhǔn)或實(shí)驗(yàn),來證明真理,真實(shí)性?!?/p>
字典上說這也是測(cè)試,因?yàn)?span style="font-weight:700;">通過實(shí)驗(yàn)。
我們通過實(shí)驗(yàn)來看看哪個(gè)版本更受歡迎。
單于測(cè)試和代碼審查,對(duì)比來說,就是通過一定原則或標(biāo)準(zhǔn)來測(cè)試。
我們對(duì)軟件有一些特定規(guī)格,一些我們希望軟件的行為,同時(shí)我們確保它符合規(guī)格。
現(xiàn)在我們有了第二種理解與組織測(cè)試的方法:通過實(shí)驗(yàn)測(cè)試?vs?針對(duì)規(guī)格測(cè)試
測(cè)試的象限圖
將它們放在一起我們得到下面這張關(guān)于測(cè)試的圖表:
用戶行為
- 有人買你的產(chǎn)品嗎?
- 設(shè)計(jì)的改變會(huì)影響注冊(cè)人數(shù)嗎?
- 用戶知道軟件是如何工作的嗎?
這些都是無法通過軟件是否符合規(guī)格來回答。
相反需要你的經(jīng)驗(yàn)知識(shí):你需要觀察人對(duì)軟件的真實(shí)反映。
軟件表現(xiàn)
- 你的軟件在負(fù)載下表現(xiàn)如何?
- 你的產(chǎn)品拋出異常嗎?
這些問題不能通過對(duì)比規(guī)范來解答,
你需要把軟件跑起來看看到底會(huì)發(fā)生什么。
功能正確性
- 你的軟件符合規(guī)范嗎?
- 它做了它該做的嗎?
很容易說自動(dòng)化的測(cè)試可以證明這一點(diǎn),但有沒有想過單元測(cè)試在檢查 2 + 2 = 5。
在基本的層面上,軟件可以在技術(shù)上符合規(guī)范卻完全無法達(dá)成規(guī)范的初衷。
但只有人明白規(guī)范的含義,和辨別是否匹配這個(gè)規(guī)范。
功能的穩(wěn)定性
- 你的公有 API 對(duì)于相同輸入返回相同的值嗎?
- 你的代碼是否提供了它該提供的?
人不是測(cè)試這個(gè)問題的好辦法。
所有人都會(huì)忽略小問題:如果一個(gè)按鈕從 “Send Now” 變成 “Send now”,很多人都不會(huì)注意到。
對(duì)比來說,如果你的 API 從?sendNow()?變成?send_now(),或者返回一個(gè)不同類型的值,你的軟件就會(huì)崩潰。
這就是說公有的 API,或者其他軟件依賴的 API,需要穩(wěn)定性來確保正確性。
為私有的接口寫自動(dòng)化測(cè)試,或者對(duì)于迭代較快的代碼,更新測(cè)試將導(dǎo)致極高的維護(hù)成本。
應(yīng)用上述模型
如何應(yīng)用模型?
選擇如何測(cè)試
首先,模型可以幫助你根據(jù)你的目標(biāo)選擇合適的測(cè)試。
如果一家初創(chuàng)公司做一個(gè)沒人用的軟件。
寫自動(dòng)化測(cè)試純屬浪費(fèi)時(shí)間,因?yàn)樗B用戶想要什么都不知道就開始專心實(shí)施了。
這里需要用精益創(chuàng)業(yè)的方法論,一個(gè)專注于用實(shí)驗(yàn)找到什么產(chǎn)品將滿足客戶的需求的方法來解決。
這意味著專注于用戶行為象限。
只有證明他值得花費(fèi)時(shí)間來進(jìn)行下去,才值得對(duì)這個(gè)產(chǎn)品來做一些為了功能性和穩(wěn)定性的測(cè)試。
了解你是否選擇了錯(cuò)誤的測(cè)試類型
第二,這個(gè)模型可以幫助你改變錯(cuò)誤的行進(jìn)路線。
比如說那家初創(chuàng)的稅務(wù)公司,如果他們對(duì)于 UI 進(jìn)行自動(dòng)化測(cè)試但是并沒有發(fā)現(xiàn)問題,然后每改變一次 UI,整個(gè)系統(tǒng)都要重新來進(jìn)行一遍測(cè)試。
他們的問題在于系統(tǒng)的兩個(gè)方面:
這就需要他們對(duì)核心的稅務(wù)計(jì)算部分進(jìn)行穩(wěn)定性或者單元測(cè)試。
正確性可以通過代碼審查和稅務(wù)會(huì)計(jì)來反饋。
UI 一直在變,說明不需要穩(wěn)定性測(cè)試。
正確性測(cè)試可以通過人工測(cè)試來解決(比如說寫代碼的開發(fā)者)。
討論測(cè)試的根據(jù)
最后,這個(gè)模型提供了一個(gè)公有的術(shù)語,來討論的測(cè)試的意義及其不同的目標(biāo)。
- 對(duì)于人工測(cè)試還是單元測(cè)試的優(yōu)異性選擇,你可以從一個(gè)很清楚地表明它們之間的差異的模型開始。
- 你也可以從一個(gè)完全不同的角度對(duì)公司的其他方面(比如市場(chǎng))來討論測(cè)試。
總結(jié)
- 無論是選擇人還是自動(dòng)化測(cè)試來保持持續(xù)性,都是有意義的,自動(dòng)化測(cè)試提供準(zhǔn)確性,人手工測(cè)試提供意義性。
- 即需要通過實(shí)驗(yàn),也需要對(duì)比規(guī)范來進(jìn)行測(cè)試。
- 每個(gè)組合提供了不同的測(cè)試形式:用戶行為、軟件行為、正確性、穩(wěn)定性。
- 確保根據(jù)你的目標(biāo)和情況來選擇合適的測(cè)試方式。
原文發(fā)布時(shí)間為:2017年3月27日
本文來自云棲社區(qū)合作伙伴掘金,了解相關(guān)信息可以關(guān)注掘金網(wǎng)站。
總結(jié)
以上是生活随笔為你收集整理的[译] 单元测试,精益创业,以及两者之间的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好听的用户名514个
- 下一篇: 我们并非生活在“虚幻世界”宇宙或是三维空