idea测试单元错误_不要单元测试错误
idea測(cè)試單元錯(cuò)誤
在進(jìn)入標(biāo)題主題之前,我們先來(lái)看一個(gè)簡(jiǎn)單的編程示例。 在編程任務(wù)中,我將演示一些不良的編碼樣式,并以此為基礎(chǔ),我將更容易解釋為什么相同的樣式在單元測(cè)試中是不良的。 好吧,既然我寫(xiě)了這句話,這似乎是一個(gè)顯而易見(jiàn)的陳述。 為什么在編程方面不好的時(shí)候在單元測(cè)試中會(huì)有什么好處。 一件事是, 并非總是這樣,另一件事是,當(dāng)我們創(chuàng)建單元測(cè)試時(shí),相同的錯(cuò)誤可能并不那么明顯。
演示任務(wù)
演示任務(wù)非常簡(jiǎn)單。 讓我們編寫(xiě)一個(gè)類(lèi)來(lái)確定整數(shù)> 1是否為質(zhì)數(shù)。 該算法很簡(jiǎn)單。 檢查以2開(kāi)頭的所有數(shù)字,直到該數(shù)字的平方根為止。 如果數(shù)字不是質(zhì)數(shù),我們將找到一個(gè)將數(shù)字除以整數(shù)的數(shù)字;如果找不到除數(shù),則數(shù)字是質(zhì)數(shù)。
public class PrimeDecider {final int number;public PrimeDecider(int number) {this.number = number;}public boolean isPrime() {for (int n = 2; n * n < number; n++) {if (number % n == 0) {return false;}}return true;} }單元測(cè)試是
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue;import org.junit.Test;public class PrimDeciderTest {@Testpublic void sample_2_IsPrime() {PrimeDecider decider = new PrimeDecider(2);boolean itIsPrime = decider.isPrime();assertTrue(itIsPrime);}@Testpublic void sample_17_IsPrime() {PrimeDecider decider = new PrimeDecider(17);boolean itIsPrime = decider.isPrime();assertTrue(itIsPrime);}@Testpublic void sample_10_IsNotPrime() {PrimeDecider decider = new PrimeDecider(10);boolean itIsPrime = decider.isPrime();assertFalse(itIsPrime);} }這是一個(gè)很好的測(cè)試,可讀性強(qiáng),有一些復(fù)制粘貼,最重要的是,它使我們100%地覆蓋了代碼。 相信我:
全是綠色。 沒(méi)錯(cuò)! 我們開(kāi)心。
出現(xiàn)錯(cuò)誤
然而,有一天,有人想到了一個(gè)奇怪的想法來(lái)測(cè)試9是否為質(zhì)數(shù)。 信不信由你,我們的程序說(shuō)9是質(zhì)數(shù)。 因此,測(cè)試人員(或者,如果您不是很幸運(yùn)的客戶)會(huì)打開(kāi)一個(gè)故障單:
BGTCKT17645329-KT對(duì)于與3相乘的數(shù)字,Prime方法無(wú)法給出正確的答案。 例如,對(duì)于表示9的對(duì)象,結(jié)果為true。
然后是錯(cuò)誤修復(fù)的繁瑣工作。 通常是多么快樂(lè)。 首先,您克服了自己的耳語(yǔ):“客戶很愚蠢”。 顯然,客戶是愚蠢的,因?yàn)樗胧褂迷擃?lèi)來(lái)測(cè)試數(shù)字9,這本來(lái)就不是……哈哈! 并且因?yàn)殄e(cuò)誤描述根本是錯(cuò)誤的。 沒(méi)有方法Prime ! 并且代碼正確地檢測(cè)到例如數(shù)字3(它本身是3的乘法)是質(zhì)數(shù)。 并且它還正確檢測(cè)出6和12不是質(zhì)數(shù)。 因此,客戶如何敢于制作這樣的錯(cuò)誤報(bào)告。 這樣的想法可能會(huì)使您冷靜下來(lái),但對(duì)業(yè)務(wù)沒(méi)有幫助,這是像您這樣的專(zhuān)業(yè)人員的首要任務(wù)。
冷靜下來(lái)后,您承認(rèn)該代碼實(shí)際上不適用于數(shù)字9,因此您開(kāi)始調(diào)試和修復(fù)它。 首先是失敗的單元測(cè)試。 那就是我們要做TDD的方式:
@Testpublic void demonstrationOf_BGTCKT17645329() {PrimeDecider decider = new PrimeDecider(9);boolean itIsPrime = decider.isPrime();assertFalse(itIsPrime);}然后您提供了修復(fù)程序:
public boolean isPrime() {if (number == 9)return false;for (int n = 2; n * n < number; n++) {if (number % n == 0) {return false;}}return true;}我只是在開(kāi)玩笑!
實(shí)際上,我已經(jīng)在實(shí)際的生產(chǎn)代碼中看到了類(lèi)似的修復(fù)程序。 當(dāng)您承受時(shí)間壓力并且生活有限時(shí),即使您知道適當(dāng)?shù)慕鉀Q方案,也可能會(huì)提出類(lèi)似的解決方案。 在這種情況下,只需簡(jiǎn)單地在循環(huán)條件中的<符號(hào)前面插入a =即可測(cè)試該數(shù)字實(shí)際上不是素?cái)?shù)的平方。 本質(zhì)上是代碼
for (int n = 2; n * n =< number; n++) {會(huì)好的。
在實(shí)際的生產(chǎn)情況下,這可能是一個(gè)真實(shí)而龐大的重構(gòu),并且如果由于代碼通常用于小于25的數(shù)字而很少出現(xiàn)這些特殊情況,那么此修復(fù)在商業(yè)上是可以的。
實(shí)際修復(fù)錯(cuò)誤
更現(xiàn)實(shí)一點(diǎn),并假設(shè)您意識(shí)到問(wèn)題不僅限于數(shù)字9,還包括所有平方數(shù),然后應(yīng)用此修復(fù)程序:
public class PrimeDecider {final int number;public PrimeDecider(int number) {this.number = number;}public boolean isPrime() {if (isASquareNumber(number))return false;for (int n = 2; n * n < number; n++) {if (number % n == 0) {return false;}}return true;}private boolean isASquareNumber(int number) {double d = Math.sqrt(number);return Math.floor(d) == d;} }這很丑,但是行得通。 包含數(shù)千行的上帝類(lèi)的真實(shí)單詞代碼即使在重構(gòu)后也不會(huì)比這更好。
完成了嗎 并不是的。 讓我們?cè)俅慰匆幌聠卧獪y(cè)試。 它記錄了該代碼
sample 2 is prime sample 17 is prime sample 10 is not prime demonstration of BGTCKT17645329那并不是特別有意義,尤其是最后一行。 報(bào)告該錯(cuò)誤(除了一些錯(cuò)誤的陳述),指出數(shù)字9的處理不正確。 但是實(shí)際的錯(cuò)誤是程序無(wú)法正確處理質(zhì)數(shù)平方的數(shù)字。 如果您知道ITIL,則第一個(gè)是事件,第二個(gè)是問(wèn)題。 我們?yōu)槭录?chuàng)建了單元測(cè)試,這很好,我們做到了。 它有助于調(diào)試。 但是,當(dāng)我們確定問(wèn)題所在時(shí),在應(yīng)用此修復(fù)程序之前,我們并未創(chuàng)建一個(gè)程序來(lái)測(cè)試該問(wèn)題的修復(fù)程序。 這不是真正的TDD,因?yàn)閷?duì)事件進(jìn)行了單元測(cè)試,但我們并未創(chuàng)建它來(lái)測(cè)試修復(fù)程序。
適當(dāng)?shù)臏y(cè)試應(yīng)使用類(lèi)似以下的名稱(chēng)
some sample square number is not prime(在方法名稱(chēng)中使用適當(dāng)?shù)鸟橊勌?#xff09;,它將有一些平方數(shù),例如9、25、36作為測(cè)試數(shù)據(jù)。
結(jié)論
修復(fù)錯(cuò)誤時(shí),請(qǐng)小心TDD。 您可能會(huì)錯(cuò)誤地應(yīng)用它。 TDD說(shuō)在編寫(xiě)代碼之前先編寫(xiě)單元測(cè)試。 您編寫(xiě)的單元測(cè)試將定義您要編寫(xiě)的代碼。 這不是演示該錯(cuò)誤的單元測(cè)試。 您可以將其用作調(diào)試和查找根本原因的工具。 但這不是TDD的一部分。 當(dāng)您知道要寫(xiě)什么時(shí),無(wú)論您急于修改代碼:都要編寫(xiě)將測(cè)試您要編寫(xiě)的功能的單元測(cè)試。
這就是我想要在標(biāo)題中暗示的意思:針對(duì)功能或功能更改編寫(xiě)單元測(cè)試,以修復(fù)錯(cuò)誤而不是錯(cuò)誤。
翻譯自: https://www.javacodegeeks.com/2015/02/not-unit-test-bugs.html
idea測(cè)試單元錯(cuò)誤
總結(jié)
以上是生活随笔為你收集整理的idea测试单元错误_不要单元测试错误的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑黑白壁纸月球(地球壁纸黑白)
- 下一篇: netbeans插件_如何编写NetBe