如何设计高效测试用例_高效的企业测试-单元和用例测试(2/6)
如何設(shè)計(jì)高效測試用例
在本系列的第一部分中,我們看到了有效測試應(yīng)滿足的一些普遍適用的原則和約束。 在這一部分中,我們將仔細(xì)研究代碼級(jí)單元測試和組件或用例測試。
單元測試
單元測試驗(yàn)證單個(gè)單元(通常是類)的行為,而忽略或模擬該單元外部的所有問題。 單元測試應(yīng)測試各個(gè)單元的業(yè)務(wù)邏輯,而不驗(yàn)證其進(jìn)一步的集成或配置。
根據(jù)我的經(jīng)驗(yàn),大多數(shù)企業(yè)開發(fā)人員對單元測試的構(gòu)建方式都有很好的了解。 您可以在我的咖啡測試項(xiàng)目中查看此示例,以了解想法。 大多數(shù)項(xiàng)目將JUnit與Mockito結(jié)合使用以模擬依賴關(guān)系,理想情況下使用AssertJ有效地定義可讀的斷言。 我一直認(rèn)為,我們可以執(zhí)行單元測試而無需特殊的擴(kuò)展程序或運(yùn)行程序,即僅使用純JUnit運(yùn)行它們。 原因很簡單:執(zhí)行時(shí)間; 我們應(yīng)該能夠在幾毫秒內(nèi)運(yùn)行數(shù)百個(gè)測試。
單元測試通常執(zhí)行速度非常快,并且易于執(zhí)行,并且不會(huì)對測試套件的生命周期施加任何約束,因此它們易于支持構(gòu)建復(fù)雜的測試套件或特殊的開發(fā)工作流程。
但是,具有許多模擬被測類的依賴關(guān)系的單元測試的缺點(diǎn)是,它們將與實(shí)現(xiàn)緊密結(jié)合,尤其是類結(jié)構(gòu)和方法,這使得重構(gòu)代碼變得困難。 換句話說,對于生產(chǎn)代碼中的每個(gè)重構(gòu)動(dòng)作,測試代碼也需要更改。 在最壞的情況下,這會(huì)導(dǎo)致開發(fā)人員進(jìn)行較少的重構(gòu),這僅僅是因?yàn)樗鼈冏兊锰闊┝?#xff0c;從而Swift導(dǎo)致項(xiàng)目代碼質(zhì)量下降。 理想情況下,開發(fā)人員應(yīng)該能夠重構(gòu)代碼并四處移動(dòng)內(nèi)容,只要他們不改變應(yīng)用程序的行為(從用戶的角度來看)即可。 單元測試并不總是使重構(gòu)生產(chǎn)代碼變得容易。
根據(jù)項(xiàng)目的經(jīng)驗(yàn),單元測試對于測試具有簡潔邏輯或功能的高密度代碼(例如特定算法的實(shí)現(xiàn))非常有效,同時(shí)又不會(huì)與其他組件發(fā)生過多交互。 特定類中的代碼密度越小或越復(fù)雜,循環(huán)復(fù)雜性越低,或者與其他組件的交互性越高,則測試該類的單元測試效果就越差。 尤其是在具有少量專業(yè)業(yè)務(wù)邏輯并且與外部系統(tǒng)具有大量集成的微服務(wù)中,對許多單元測試的需求減少了。 除了少數(shù)例外,這些系統(tǒng)的各個(gè)單元通常包含很少的專用邏輯。 在選擇權(quán)衡時(shí)間和精力的地方時(shí),必須考慮到這一點(diǎn)。
用例測試
為了解決將測試與實(shí)現(xiàn)緊密耦合的問題,我們可以使用略有不同的方法來擴(kuò)大測試范圍。 在我的書中 ,我描述了組件測試的概念,因?yàn)槿鄙僖粋€(gè)更好的術(shù)語,我們也可以將其稱為用例測試。
用例測試是代碼級(jí)集成測試,由于測試啟動(dòng)時(shí)間的原因,該類測試尚未使用嵌入式容器或反射掃描。 他們驗(yàn)證通常參與單個(gè)用例的一致組件的業(yè)務(wù)邏輯行為,從邊界的業(yè)務(wù)方法一直到所有涉及的組件。 與外部系統(tǒng)(如數(shù)據(jù)庫)的集成已被嘲笑。
在不使用自動(dòng)連接組件的更先進(jìn)技術(shù)的情況下構(gòu)建此類方案聽起來很費(fèi)力。 但是,我們定義了可重用的測試組件或test double ,它們通過模擬,接線和測試配置來擴(kuò)展組件,以最大程度地減少重構(gòu)變更的整體工作量。 目標(biāo)是制定單一職責(zé),以將更改的影響限制在測試范圍內(nèi)的單個(gè)或幾個(gè)類中。 以可重復(fù)使用的方式執(zhí)行此操作會(huì)限制總體所需的工作量,并且在項(xiàng)目規(guī)模變大后會(huì)得到回報(bào),因?yàn)槲覀兠總€(gè)組件只需支付一次管道費(fèi)用,這很快就可以攤銷。
為了獲得更好的主意,假設(shè)我們正在測試訂購咖啡的用例,其中包括兩個(gè)類CoffeeShop和OrderProcessor 。
測試雙重類CoffeeShopTestDouble和OrderProcessorTestDouble或*TD駐留在項(xiàng)目的測試范圍中,而它們擴(kuò)展了駐留在主范圍中的CoffeeShop和OrderProcessor組件。 測試雙打可能會(huì)設(shè)置所需的模擬和連線邏輯,并可能使用與用例相關(guān)的模擬或驗(yàn)證方法來擴(kuò)展類的公共接口。
下面顯示了CoffeeShop組件的測試double類:
public class CoffeeShopTestDouble extends CoffeeShop { public CoffeeShopTestDouble(OrderProcessorTestDouble orderProcessorTestDouble) { entityManager = mock(EntityManager. class ); orderProcessor = orderProcessorTestDouble; } public void verifyCreateOrder(Order order) { verify(entityManager).merge(order); } public void verifyProcessUnfinishedOrders() { verify(entityManager).createNamedQuery(Order.FIND_UNFINISHED, Order. class ); } public void answerForUnfinishedOrders(List<Order> orders) { // setup entity manager mock behavior } }測試double類可以訪問CoffeeShop基類的字段和構(gòu)造函數(shù)以設(shè)置依賴項(xiàng)。 它使用其測試雙重形式的其他組件,例如OrderProcessorTestDouble ,以便能夠調(diào)用用例中包含的其他模擬或驗(yàn)證方法。
測試雙重類是可重用的組件,在每個(gè)項(xiàng)目范圍內(nèi)編寫一次,并在多個(gè)用例測試中使用 :
class CoffeeShopTest { private CoffeeShopTestDouble coffeeShop; private OrderProcessorTestDouble orderProcessor; @BeforeEach void setUp() { orderProcessor = new OrderProcessorTestDouble(); coffeeShop = new CoffeeShopTestDouble(orderProcessor); } @Test void testCreateOrder() { Order order = new Order(); coffeeShop.createOrder(order); coffeeShop.verifyCreateOrder(order); } @Test void testProcessUnfinishedOrders() { List<Order> orders = Arrays.asList(...); coffeeShop.answerForUnfinishedOrders(orders); coffeeShop.processUnfinishedOrders(); coffeeShop.verifyProcessUnfinishedOrders(); orderProcessor.verifyProcessOrders(orders); } }用例測試驗(yàn)證在入口點(diǎn)(這里為CoffeeShop上調(diào)用的單個(gè)業(yè)務(wù)用例的處理。 這些測試變得簡短且易于閱讀,因?yàn)榻泳€和模擬發(fā)生在單個(gè)測試雙打中,并且它們還可以利用特定于用例的驗(yàn)證方法,例如verifyProcessOrders() 。
如您所見,測試雙重?cái)U(kuò)展了生產(chǎn)范圍類,用于設(shè)置模擬和驗(yàn)證行為的方法。 盡管這似乎是一些設(shè)置工作,但如果我們有多個(gè)用例可以在整個(gè)項(xiàng)目中重復(fù)使用這些組件,則成本將Swift攤銷。 我們的項(xiàng)目增長得越多,這種方法的好處就越大,尤其是當(dāng)我們查看測試執(zhí)行時(shí)間時(shí)。 我們所有的測試用例仍然使用JUnit運(yùn)行,它可以立即執(zhí)行數(shù)百個(gè)測試用例。
這是此方法的主要優(yōu)點(diǎn):用例測試的運(yùn)行速度與普通單元測試一樣快,但由于僅需對單個(gè)或幾個(gè)組件進(jìn)行更改,因此可以方便地重構(gòu)生產(chǎn)代碼。 此外,使用針對我們領(lǐng)域的富有表現(xiàn)力的設(shè)置和驗(yàn)證方法來增強(qiáng)測試效率,從而使我們的測試代碼更具可讀性,更易于使用,并避免了測試案例中的樣板代碼。
不包含任何高級(jí)測試上下文運(yùn)行程序的代碼級(jí)測試可以非常快速地執(zhí)行,并且即使在非常復(fù)雜的項(xiàng)目中也不會(huì)為整體構(gòu)建增加太多時(shí)間。 該系列的下一部分將顯示代碼級(jí)以及系統(tǒng)級(jí)集成測試。
翻譯自: https://www.javacodegeeks.com/2019/09/efficient-enterprise-testing-unit-use-case.html
如何設(shè)計(jì)高效測試用例
總結(jié)
以上是生活随笔為你收集整理的如何设计高效测试用例_高效的企业测试-单元和用例测试(2/6)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DIY装机配置搭配推荐装机怎么搭配
- 下一篇: selenium 等待_Selenium