首先是解釋什么是單元測試,單元測試是指對於一個大型項目里,對於單一模塊或者單一接口的測試。
然后解釋為什么要寫單元測試,首先對於一個大型的項目,如果你每次都要重啟一遍服務器調頁面或者接口的bug,那就會很影響效率。
那么一部分人就說了,我們都已經寫了那么多業務邏輯代碼了,為什么還要寫那么多沒有用的測試代碼呢,反正最后bug肯定會在最終被發現的,而且測試這種事情不應該是測試干的事情嗎?
還有一部分人說,我水平以及很高了,徒手千行代碼不出bug,不需要測試。
對於前面一種人,我舉個例子吧,如果你寫20個接口有5個是有bug的,還不算這5個會不會導致其他的接口出問題,那么你排除一個錯誤的時間應該在30分鍾左右,其中重啟服務器,調試,運行,尋找,都要時間,而這30分鍾,單元測試早就寫完了。而且白盒測試,都是程序自己的事情。
對於后一種人,我只能說,測試不是證明你是對的,而是證明你沒有錯。
說了那么多,那么到底怎么寫單元測試呢?
首先單元測試的包應該和src同級目錄,這樣在項目完成之后就可以直接刪除,不影響項目任何地方。
導入JUnit4的jar包。
新建一個工具類
import org.junit.AfterClass; import org.junit.BeforeClass; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 單元測試工具類 * @author XX * */ public class UnitTestBase { protected static ClassPathXmlApplicationContext context = null; /*對於單一配置文件的項目利用這個做單元測試,直接把路徑寫死了*/ @BeforeClass public static void setUpBeforeClass() throws Exception{ //獲取spring配置文件,生成上下文 context = new ClassPathXmlApplicationContext("classpath*:beans.xml"); context.start(); } @AfterClass public static void setUpAfterClass()throws Exception{ context.destroy(); } /*下面的方法是用來適配有很多XML配置文件的項目,繼承之后傳入路徑即可生成對應的context*/ /*private ClassPathXmlApplicationContext context; private String springXmlpath; public UnitTestBase() {} public UnitTestBase(String springXmlpath){ this.springXmlpath = springXmlpath; } @Before public void berfore() { if(StringUtils.isEmpty(springXmlpath)) { springXmlpath = "classpath*:spring-*.xml"; } try { context = new ClassPathXmlApplicationContext(springXmlpath.split("[,\\s]+")); context.start(); } catch (Exception e) { e.printStackTrace(); } } @After public void after() { context.destroy(); } @SuppressWarnings("unchecked") protected <T extends Object> T getBean(String beanId) { return (T)context.getBean(beanId); } protected <T extends Object> T getBean(Class<T> clazz) { return context.getBean(clazz); } */ }
然后選擇對於你要新建單元測試的類按照下面的圖操作
這里只是演示一下,一般不直接對實現類做測試,直接對接口來測試,一般測試的是服務層的接口和持久層的接口
下面是測試的代碼
import org.junit.Test; import com.xxx.newSystem.utils.UnitTestBase;//導入之前的工具類 public class IUserServiceTest extends UnitTestBase { IUserService userService = (IUserService) context.getBean("userService"); @Test public void testLogin() { System.err.println(userService.login("xex", "123456")); } }
//這是利用工具類中注釋掉的方法,用於有多個xml配置文件的時候做測試 public class TestOneInterface extends UnitTestBase{ public TestOneInterface(){ super("classpath*:beans.xml"); } @Test public void test() { IUserService userService = super.getBean("userService"); System.err.println(userService.login("xx", "123456")); } }
對於Junit4使用,網上的方法也有很多,注解的配置也有很多,我只是找我需要的。還是各取所需比較好,之后的項目我都會寫單元測試的,做到真正的敏捷開發。