References:
Introduction
簡(jiǎn)單介紹一下概念研儒。
所謂測(cè)試用例
- 從開發(fā)的角度枝冀,所謂測(cè)試用例靶橱,主要是方便在開發(fā)斯撮、重構(gòu)過(guò)程中俊柔,對(duì)代碼邏輯、編輯條件的一些測(cè)試梗醇。
- 如果不使用測(cè)試用例的寫法冶匹,可以每個(gè).java文件都寫一個(gè)main方法進(jìn)行測(cè)試。
- 然而虽风,main方法測(cè)試的手段棒口,low,并且不利于重用辜膝。
- 于是无牵,在java中,常用JUnit框架厂抖,對(duì)代碼進(jìn)行測(cè)試茎毁。
Java中測(cè)試基本概念
- 測(cè)試單元:對(duì)一個(gè)類進(jìn)行測(cè)試。
- 建議僅對(duì)public方法進(jìn)行測(cè)試忱辅。
JUnit 踩坑
安裝
下載 JUnit-xxx.jar (下載地址) 和 Hamcrest(點(diǎn)擊直接下載) 充岛,放在一個(gè)文件夾下
第一個(gè)測(cè)試用例
- 按照官方推薦,編寫一個(gè)java類
public class Calculator {
public int evaluate(String expression) {
int sum = 0;
for (String summand: expression.split("\\+"))
sum += Integer.valueOf(summand);
return sum;
}
}
- 編譯這個(gè)文件
javac Calculator.java
目錄下出現(xiàn) Calculator.class
- 然后編寫一個(gè)
Test.java
文件
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class CalculatorTest {
@Test
public void evaluatesExpression() {
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
}
}
- 編譯
Test.java
# Linux or MacOS
javac -cp .:junit-4.XX.jar:hamcrest-core-1.3.jar CalculatorTest.java
# Windows
javac -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar CalculatorTest.java
- 運(yùn)行測(cè)試用例
# Linux or MacOS
java -cp .:junit-4.XX.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorTest
# Windows
java -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorTest
# 以下為輸出:
JUnit version 4.12
.
Time: 0.006
OK (1 test)
- 讓測(cè)試用例失敗
Test.java
中修改assert相關(guān)項(xiàng)耕蝉,重復(fù) 4-5,輸出如下:
JUnit version 4.12
.E
Time: 0.006
There was 1 failure:
1) evaluatesExpression(CalculatorTest)
java.lang.AssertionError: expected:<8> but was:<6>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
...
FAILURES!!!
Tests run: 1, Failures: 1:
結(jié)合 Intellij IDEA
- 先隨便寫個(gè)類夜只,拿來(lái)測(cè)試
package fc.learn.java.junit;
public class BaobaoFeng {
public void awei18shi(){
laohanTuiche();
guanyinzuolian();
zhongchu();
dulongzuan();
}
public void laohanTuiche(){
System.out.println("laohantuiche!");
}
private void guanyinzuolian(){
System.out.println("guanyinzuolian!");
}
private int zhongchu(){
return 1;
}
public String dulongzuan(){
return "dulongzuan!";
}
public String lianxuzhongchu(int param){
if (param < 5){
throw new IllegalArgumentException("test exception!");
}
return "lianxuzhongchu";
}
}
- 在類名
BaobaoFeng
出垒在,點(diǎn)開 quickLips:
直接點(diǎn)擊create:
完成,就建立了一個(gè)BaobaoFengTest.java
扔亥〕∏可以看到,這里不支持private方法的旅挤。
package fc.learn.java.junit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class BaobaoFengTest {
BaobaoFeng fengbaobao;
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void awei18shi() {
}
@Test
public void laohanTuiche() {
}
@Test
public void dulongzuan() {
}
@Test
public void lianxuzhongchu(){
}
}
- 要測(cè)試哪個(gè)方法踢关,就在
Test.java
中的對(duì)應(yīng)方法編寫測(cè)試用例,然后右鍵運(yùn)行即可粘茄。
比如我要測(cè)試dulongzuan()
方法的返回值签舞,可以如下:
用JUnit測(cè)試web項(xiàng)目中DAO層
- 和上一節(jié)中的步驟2相同,可以在 Interface 上打開 quickTips柒瓣,自動(dòng)創(chuàng)建Test文件儒搭。
- 在Class前加
@RunWith
和@ContextConfiguration
:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/config/context/appcontext-*.xml")
public class TryJunitDaoTest {
@Autowired
TryJunitDao tryJunitDao;
@Test
@Transactional // 此處加上Transactional注解,測(cè)試完成之后會(huì)回滾
public void insert() {
TryJunitDto dto = new TryJunitDto();
tryJunitDao.insert(dto)
}
@Test
public void select() {
TryJunitDto dto = tryJunitDao.select();
Assert.assertNotEquals(dto, null);
}
}
用 JUnit 模擬請(qǐng)求
實(shí)際上,模擬請(qǐng)求芙贫,關(guān)鍵是Mock
搂鲫,和JUnit關(guān)系不是特別大。
- 同樣磺平,生成
Test.java
文件魂仍,然后
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:/config/spring/appcontext-*.xml",
"file:src/main/webapp/WEB-INF/servlet-context.xml"
})
public class MockRequestControllerTest {
@Autowired
private MockRequestController mockRequestController;
@Test
public void testAcceptRequest() throws Exception {
// 這里拐辽,構(gòu)造 MockRequest
MockHttpServletRequest request = new MockHttpServletRequest();
request.setAttribute("user", "user");
mockRequestController.acceptRequest(request);
}
}