原創(chuàng)|使用教程|編輯:鄭恭琳|2021-01-21 17:12:36.523|閱讀 278 次
概述:Spring是領(lǐng)先的企業(yè)Java應(yīng)用程序框架,因此需要進(jìn)行適當(dāng)級(jí)別的測(cè)試以確保使用其構(gòu)建的應(yīng)用程序的質(zhì)量和安全性。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Spring是領(lǐng)先的企業(yè)Java應(yīng)用程序框架,因此需要進(jìn)行適當(dāng)級(jí)別的測(cè)試以確保使用其構(gòu)建的應(yīng)用程序的質(zhì)量和安全性。
Spring框架(以及Spring Boot)是最受歡迎的Java企業(yè)軟件框架之一。它在關(guān)鍵任務(wù)應(yīng)用程序中的使用意味著它已經(jīng)受到質(zhì)量和安全性的審查。
之前,我們討論了盡管開發(fā)人員擁有良好的改進(jìn)記錄,但開發(fā)人員如何不喜歡單元測(cè)試,并詳細(xì)介紹了Parasoft Jtest的單元測(cè)試助手如何提供一種指導(dǎo)性的自動(dòng)化測(cè)試方法,以使測(cè)試不僅更加可口,而且更容易、更有效。在本文中,我將繼續(xù)與Spring框架相同的主題,向您展示如何在這個(gè)重要的應(yīng)用程序框架中利用自動(dòng)化和指導(dǎo)性測(cè)試。
Spring框架對(duì)集成測(cè)試提供了很好的支持,但是需要大量的手動(dòng)編碼才能正確設(shè)置測(cè)試用例。為Spring應(yīng)用程序構(gòu)建和維護(hù)測(cè)試為開發(fā)人員帶來了一系列獨(dú)特的挑戰(zhàn),其中包括:
Spring框架必須初始化和配置
該應(yīng)用程序通常具有第三方庫依賴項(xiàng)(永久存儲(chǔ),外部服務(wù)等)
應(yīng)用程序通常使用內(nèi)置的Spring功能來進(jìn)行會(huì)話,安全性,消息傳遞等。對(duì)于剛開始使用Spring測(cè)試的開發(fā)人員來說,設(shè)置這些功能可能很棘手。
需要適當(dāng)配置應(yīng)用程序依賴項(xiàng)(即Bean)
這些挑戰(zhàn),加上編寫全面且可維護(hù)的測(cè)試套件通常要花費(fèi)大量時(shí)間這一事實(shí),導(dǎo)致開發(fā)人員編寫的測(cè)試不足,從而導(dǎo)致安全漏洞、缺陷、退化和許多麻煩。
Parasoft Jtest單元測(cè)試助手可以使生成,改進(jìn)和維護(hù)JUnit測(cè)試的過程變得更加輕松和省時(shí),從而為開發(fā)人員提供幫助,從而使開發(fā)人員可以快速構(gòu)建良好的測(cè)試,并返回他們想要的東西–編寫代碼。
Spring框架包括一個(gè)測(cè)試框架,該框架使測(cè)試控制器、服務(wù)和其他組件更加容易。它包括用于配置Spring測(cè)試容器,調(diào)用Controller處理程序方法以及使用自定義斷言驗(yàn)證行為的功能。
Spring MVC控制器示例:
@Controller public class TodoController { @Autowired private TodoService service; @GetMapping("/") public String findAll(Model model) { List<Todo> todos = service.findAll(); model.addAttribute("todos", todos); return "todo/list"; } }
該示例控制器實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的REST服務(wù),以從“待辦事項(xiàng)”列表中獲取項(xiàng)目。它取決于包含業(yè)務(wù)邏輯的TodoService。
要測(cè)試findAll方法,我們需要一個(gè)JUnit測(cè)試,該測(cè)試執(zhí)行以下操作:
使用受測(cè)控制器和TodoService依賴的TodoService配置Spring容器。
將有效請(qǐng)求發(fā)送到findAll處理程序方法。
驗(yàn)證響應(yīng)的元素,包括返回值(“todo/list”)和Model屬性“todos”。
Spring MVC Junit測(cè)試示例可能如下所示:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class TodoControllerTest { @Autowired TodoController controller; @Autowired TodoService todoService; MockMvc mockMvc; @Before public void setup() { mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); } @Configuration static class Config { @Bean public TodoController getTodoController() { return new TodoController(); } @Bean public TodoService getTodoService() { return new TodoService(); } } @Test public void testFindAll() throws Exception { mockMvc.perform(get("/")).andExpect(view().name("todo/list")); } }
上面的示例是一個(gè)非常簡(jiǎn)單的測(cè)試-但是仍然有很多“樣板”代碼需要編寫,并且還有很多工作要做。在此示例中,我們使用內(nèi)部Configuration類為Spring配置了控制器及其服務(wù)。然后,我們使用MockMvc函數(shù)將請(qǐng)求發(fā)送到處理程序方法(使用Perform),并使用andExpect驗(yàn)證返回的視圖名稱。
上述測(cè)試有什么問題?沒什么-想象一個(gè)更復(fù)雜的控制器方法,它具有多個(gè)處理程序方法,這些方法接受更多的參數(shù)并產(chǎn)生更多的輸出。編寫測(cè)試將花費(fèi)更多時(shí)間,尤其是在良好的測(cè)試覆蓋范圍很重要的情況下。此外,大多數(shù)實(shí)際測(cè)試都需要更多的配置(XML或類配置、會(huì)話和環(huán)境、安全性等)。
Parasoft Jtest的單元測(cè)試助手可幫助開發(fā)人員以多種方式編寫Spring測(cè)試:
快速自動(dòng)生成樣板代碼以進(jìn)行Spring MVC測(cè)試
自動(dòng)生成參數(shù)化測(cè)試以增加測(cè)試范圍
模擬依賴關(guān)系以隔離輔助方法并簡(jiǎn)化測(cè)試
在運(yùn)行時(shí)收集覆蓋率數(shù)據(jù)并分析測(cè)試流程
提供快速修復(fù)建議以改善測(cè)試
自動(dòng)生成測(cè)試
在Parasoft Jtest中生成Spring測(cè)試非常簡(jiǎn)單–只需在IDE中為控制器選擇一個(gè)Spring處理程序方法,然后選擇一個(gè)test-creation操作:
選擇常規(guī)Spring或參數(shù)化Spring會(huì)自動(dòng)為您生成樣板Spring MVC測(cè)試,包括Configuration類(以及控制器依賴的所有Bean)。還添加了mockMvc.perform調(diào)用,并且將其預(yù)先配置為調(diào)用為其創(chuàng)建測(cè)試的處理程序方法。Jtest單元測(cè)試助手甚至添加了一些示例斷言,您可以取消注釋和配置它們。
通過在首選項(xiàng)中設(shè)置“Spring測(cè)試的ContextConfiguration屬性”選項(xiàng),Parasoft Jtest支持使用XML或類配置生成測(cè)試。
模擬依賴
管理單元測(cè)試中的依賴關(guān)系至關(guān)重要,因?yàn)楹芏鄰?fù)雜性和工作都來自隔離測(cè)試中的單元。默認(rèn)情況下,Jtest單元測(cè)試助手使用Mockito或PowerMockito來模擬依賴關(guān)系(如果您不想這樣做,可以在首選項(xiàng)中將其禁用)。模擬依賴關(guān)系允許測(cè)試控制那些依賴關(guān)系,將處理程序方法與應(yīng)用程序的其余部分隔離開來,從而將測(cè)試工作集中在處理程序上。在我們的示例處理程序中,findAll方法是在TodoService上調(diào)用的-如果我們使用真實(shí)的TodoService,我們將有效地測(cè)試TodoController和TodoService。這可能是我們想要進(jìn)行集成測(cè)試而不是單元測(cè)試所需要的。在測(cè)試中模擬TodoService.findAll的響應(yīng),使我們可以將測(cè)試工作重點(diǎn)放在處理程序方法上。
(如果您想了解有關(guān)Spring測(cè)試中的模擬依賴項(xiàng)的更多信息,請(qǐng)閱讀我的下一篇文章。)
由于Spring Boot為Bean提供簡(jiǎn)化的配置以及測(cè)試的附加注釋,因此,單元測(cè)試助手在檢測(cè)到項(xiàng)目中的Spring Boot時(shí)會(huì)生成稍有不同的測(cè)試。例如,MockMvc是自動(dòng)裝配的,依賴項(xiàng)使用@MockBean進(jìn)行了模擬,并使用了@SpringBootTest批注。
您可以使用任何普通的JUnit運(yùn)行器運(yùn)行生成的測(cè)試。Parasoft Jtest提供了運(yùn)行JUnit并分析測(cè)試的工具欄操作。
運(yùn)行測(cè)試后,將顯示測(cè)試執(zhí)行流程,并由單元測(cè)試助手提出改進(jìn)測(cè)試的建議,并在您的IDE中進(jìn)行報(bào)告:
處理程序方法通常被配置為接受路徑,查詢或其他參數(shù)作為該方法的參數(shù)。若要測(cè)試MVC處理程序方法,可以使用MockMvc來構(gòu)建路徑/查詢以及調(diào)用該方法所需的任何其他參數(shù)。
Jtest單元測(cè)試助手會(huì)自動(dòng)配置mockMvc.perform調(diào)用以調(diào)用處理程序方法。個(gè)別參數(shù)在測(cè)試中顯示為局部變量(或參數(shù)化測(cè)試中的參數(shù)),需要對(duì)其進(jìn)行配置以使測(cè)試正常運(yùn)行。
例如(請(qǐng)參閱下面的單元測(cè)試助手,縮寫為UTA):
@Test public void testGetPerson() throws Throwable { // When String id = ""; // UTA: Configure an appropriate parameter value since the tested method depends on it ResultActions actions = mockMvc.perform(get("/people/" + id));
在這里,需要配置“id”字符串–如果未配置,則使用的路徑將是“/people/”,并且Spring不會(huì)將提供的路徑與適當(dāng)?shù)奶幚沓绦蚍椒ㄟM(jìn)行匹配。
class=”p1″>單元測(cè)試助手會(huì)查找各種類型的處理程序方法參數(shù),并通過以下方式自動(dòng)為它們準(zhǔn)備測(cè)試:
HttpSession(添加示例setAttribute()調(diào)用)
標(biāo)頭(添加header()調(diào)用),
請(qǐng)求主體(添加有效負(fù)載變量和content()調(diào)用)
身份驗(yàn)證(將示例實(shí)例化添加到setup方法,并調(diào)用principal())
運(yùn)行不會(huì)導(dǎo)致調(diào)用處理程序方法的測(cè)試,會(huì)產(chǎn)生如下建議:
根據(jù)處理程序方法應(yīng)提供給調(diào)用者的方式,它可能返回各種類型。在大多數(shù)情況下,處理程序方法返回ModelAndView(或類似的對(duì)象,如Model或RedirectView)以服務(wù)于頁面,或返回某種ResponseEntity(有時(shí)只是要序列化的原始對(duì)象)。Spring MVC Test框架可以訪問此響應(yīng)以進(jìn)行驗(yàn)證。
例如,Jtest單元測(cè)試助手為返回ModelAndView的處理程序方法添加了以下斷言:
// When String id = "1"; ResultActions actions = mockMvc.perform(get("/people/" + id)); // Then // actions.andExpect(status().isOk()); // actions.andExpect(header().string("", "")); // actions.andExpect(view().name("")); // actions.andExpect(model().attribute("", ""));
生成測(cè)試后,您可以取消注釋這些斷言并填充值以快速構(gòu)建有用且有價(jià)值的測(cè)試。如果斷言在運(yùn)行時(shí)失敗,則單元測(cè)試助手會(huì)提供建議和快速修復(fù),以自動(dòng)更新期望值或簡(jiǎn)單地刪除斷言。要使用適當(dāng)?shù)闹悼焖僭O(shè)置斷言,您可以取消注釋斷言,使其失敗,然后使用快速修復(fù)程序設(shè)置正確的期望值。
Spring(與Spring Boot結(jié)合使用)是領(lǐng)先的企業(yè)Java應(yīng)用程序框架,因此需要進(jìn)行適當(dāng)級(jí)別的測(cè)試,以確保使用其構(gòu)建的應(yīng)用程序的質(zhì)量和安全性。但不幸的是,目前尚無法達(dá)到此級(jí)別的測(cè)試,這主要是由于時(shí)間不足以及所需的手動(dòng)編碼和維護(hù)量。Parasoft Jtest單元測(cè)試助手不僅提供單元測(cè)試自動(dòng)化,還提供指導(dǎo)性的測(cè)試創(chuàng)建和依賴管理,以加速測(cè)試創(chuàng)建并減少維護(hù)。
要了解更多信息,請(qǐng)閱讀單元測(cè)試助手如何通過模擬框架幫助進(jìn)行依賴項(xiàng)管理。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn