您好,登錄后才能下訂單哦!
敏捷開發是一種以人為核心、迭代、循序漸進的開發方式。在Spring框架的發展歷程中,處處彰顯敏捷開發思想的身影。我們可以從Spring中提出的“約定優于配置”的思想,實現業務Bean零配置及按需加載、敏捷單元測試和模塊化管理機制等。學習怎樣運用敏捷開發思想,有助于提高應用開發效率和編寫易于測試的代碼。因此要成為一名出色的軟件開發工程師,學習敏捷開發相關思想是非常有必要的。
1、敏捷開發概述
敏捷開發是一種以人為核心、迭代、循序漸進的開發方法。在敏捷開發中,軟件項目的構建被切成多個子項目,各個子項目的成果都是經過測試,具備集成和可運行性。換言之,就是把一個大項目分為多個相互聯系,但也可獨立運行的子項目,并分別完成,在此軟件過程中軟件一直處于可使用狀態。
1.1、敏捷開發原則
主張簡單:如果現在不需要這項功能,就不要再設計中增加它。不必要對這個系統進行過分設計,等日后需求有變化時,再來重構這個系統
擁有變化:需求時刻在變,人們對于需求的理解也時刻在變。在項目開發過程中,項目成員可能會變化。項目相關干系人的觀點也可能會變化,前期定制的目標、標準也可能會變化。因此開發方法必須能夠擁抱變化。
可持續性:即便已經把一個能夠運行的系統交付給用戶,項目可能也是失敗的--實現項目關系人的需求,其中就包括系統應該要有足夠的魯棒性,能夠適應日后的發展。可持續性指的是下一個主要的發布版本,捉著正在構建的系統的運轉和支持。要做到這一點,不僅僅要構建高質量的軟件,還要創建足夠的文檔,保證下一場軟件競爭能有效的進行。
遞增的變化:沒必要在一開始的時候就設計一個囊括一切的框架模型,只要設計一個小的最基礎的核心架構,打下基礎,然后慢慢地改進架構,或者在不需要時丟棄這個架構,這就是遞增的思想。
快速反饋:從開始采取行動,到獲得行動的反饋,二者之間的時間至關重要。和客戶緊密工作,了解并分析他們的需求,或是開發滿足他們需求的用戶界面,這樣就提供了快速反饋的機會。
1.2、敏捷開發過程
測試驅動開發(Test-Driven Development,TDD)是一種不同于傳統軟件開發流程的新型開發方法。它要求在編寫某個功能的代碼之前要先編寫測試代碼,然后只編寫測試通過的功能代碼,通過測試來推動整個開發的進行。這有助于編寫簡潔可用和高質量的代碼,有很高的靈活性和健壯性,能夠快速響應變化,并加速開發過程。測試驅動開發的基本過程:(1)、快速新增一個測試(2)、運行測試,發現新增的測試不能通過(3)、做一些小改動,盡快讓測試程序可運行(4)、再次運行測試,并且讓測試通過(5)、重構代碼,消除重復設計,優化設計結構
持續集成:頻繁、持續地在多個團隊成員的工作中進行集成,并給與反饋。主要是SVN等版本控制器的使用
結對編程:兩個程序員在一臺機器上共同工作。一個輸入代碼,一個審查。主要是與測試相結合
站立會議
小版本發布,一般以周、月為單位,盡可能多的發布產品。
較少的文檔。敏捷開發中不是沒有文檔,而是有大量的文檔,即測試代碼,這些代碼真是的反應了用戶的需求以及系統API的用法。
以合作為中心
1.3、敏捷開發方法Scrum
Scrum是一個敏捷開發框架,是一個增量的、迭代的開發過程。在這個框架中,整個開發周期包括若干小的迭代周期,每個小的迭代周期成為Spint,每個Sprint的建議長度為2~4周。
1.4、測試驅動開發TDD實例
//為了便于測試,這里寫一個測試基類 package com.smart.web; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpSession; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; import org.testng.annotations.BeforeClass; import org.unitils.UnitilsTestNG; import org.unitils.spring.annotation.SpringApplicationContext; import org.unitils.spring.annotation.SpringBeanByType; @SpringApplicationContext( { "classpath:applicationContext.xml" }) public class BaseWebTest extends UnitilsTestNG { @SpringBeanByType public AnnotationMethodHandlerAdapter handlerAdapter; //聲明Request與Response模擬對象 public MockHttpServletRequest request; public MockHttpServletResponse response; public MockHttpSession session; //執行測試前先初始模擬對象 @BeforeClass public void before() { request = new MockHttpServletRequest(); response = new MockHttpServletResponse(); request.setAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING, true); request.setCharacterEncoding("UTF-8"); } } package com.smart.web; import org.springframework.web.servlet.ModelAndView; import org.testng.annotations.Test; import org.unitils.spring.annotation.SpringBeanByType; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; public class AddUserViewTest extends BaseWebTest { //注入用戶管理控制器 @SpringBeanByType private UserManageController controller; @Test public void addUserView() throws Exception { //設置請求URI及方法 request.setRequestURI("/admin/user/add"); request.setMethod("GET"); //驗證結果 ModelAndView mav = handlerAdapter.handle(request, response, controller); assertNotNull(mav); assertEquals(mav.getViewName(), "/addUser"); } } package com.smart.web; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping("/admin/user") public class UserManageController { @RequestMapping("/add") public String addUser() { return "/addUser"; } @RequestMapping("/save") public String saveUser(HttpServletRequest request) { String userName = request.getParameter("userName"); String password = request.getParameter("password"); if(StringUtils.isEmpty(userName)||StringUtils.isEmpty(password)){ request.setAttribute("errorMsg", "用戶或密碼不能為空!"); return "/addUser"; }else{ return "/success"; } } }
如果assert出現紅色的,說明測試驅動開發未成功,繼續微調,直到assert全部為綠色的,說明測試驅動開發實例完成。感興趣的童鞋可以繼續測試一下Service和Dao層。
2、版本控制器GIT
2.1、版本控制器的意義
實現開發團隊并行并發、提高開發效率的基礎。其目的在于對軟件開發進程中文件或目錄的發展提供有效的追蹤手段,保證在需要時課回到舊版本,避免文件的丟失、修改的丟和和相互覆蓋,通過對版本庫的訪問控制避免未授權的訪問和修改,達到有效保護企業軟件資產和只是產權的目的。
2.2、SVN
2.3、GIT
與常用的CVS、SVN等不同,GIT采用了分布式版本的方式,不必服務器端軟件支持,使源碼的發布和交流極其方便。每個GIT克隆都是一個完整的文件庫,含有全部歷史記錄和修訂追蹤能力。最大特色是“分支”及“合并”操作快速、簡便。支持離線工作,GIT是整個項目訪問的原子提交。
3、代碼構建利器Maven
maven是一個強大的構建工具,能夠幫助用戶建立一套有效的自動化構建體系。從清理、編譯、測試到生成報告,再到打包和部署。用戶不再需要一遍又一遍得輸入命令,只需要利用簡單的命令(mvn clean、install等)就可以完成構建任務。
maven的生命周期,基本上包括:項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署、站點生成等步驟。maven項目周期是一個抽象概念,這意味著它不做任何實質性的事情,也就是說它的實現細節交給maven的各種強大插件完成。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。