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