mock測試

用虛擬對象創建以便測試的方法

mock測試就是在測試過程中,對於某些不容易構造或者不容易獲取的對象,用一個虛擬的對象來創建以便測試的測試方法。

測試介紹


對象

這個虛擬的對象就是mock對象。mock對象就是真實對象在調試期間的代替品。

對象使用範疇

真實對象具有不可確定的行為,產生不可預測的效果,(如:股票行情,天氣預報)真實對象很難被創建的真實對象的某些行為很難被觸發真實對象實際上還不存在的(和其他開發小組或者和新的硬體打交道)等等。

關鍵步驟

使用一個介面來描述這個對象。在產品代碼中實現這個介面,在測試代碼中實現這個介面,在被測試代碼中只是通過介面來引用對象,所以它不知道這個引用的對象是真實對象,還是mock對象。

測試工具

使用MockObject進行測試,主要是用來模擬那些在應用中不容易構造(如HttpServletRequest必須在Servlet容器中才能構造出來)或者比較複雜的對象(如JDBC中的ResultSet對象)從而使測試順利進行的工具。
目前,在Java陣營中主要的Mock測試工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微軟的.Net陣營中主要是Nmock,.NetMock等。

對象實例


一個鬧鐘根據時間來進行提醒服務,如果過了下午5點鐘就播放音頻文件提醒大家下班了,如果我們要利用真實的對象來測試的話就只能苦苦等到下午五點,然後把耳朵放在音箱旁,我們應該利用mock對象 來進行測試,這樣我們就可以模擬控制時間了,而不用苦苦等待時鐘轉到下午5點鐘了。下面是代碼:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SystemEnvironment extends Environmental{
public long getTime(){
return System.currentTimeMillis();
}
public void playWavFile(String fileName){
playedWav=true;
}
public boolean wavWasPlayed(){
return playedWav;
}
public void resetWav(){
playedWav=false;
}
}
 
下面是mock對象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MockSystemEnvironment extends Environmental{
private long currentTime;
public long getTime(){
return currentTime;
}
public boolean wavWasPlayed(){
return playedWav;
}
public void resetWav(){
playedWav=false;
}
}

Erlang版本


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
put(current_time,os:timestamp()),
put(played_wav,false),
 
meck:new(mock_system_environment,[non_strict]),%模擬一個系統環境
meck:expect(mock_system_environment,get_time,fun()->get(current_time)end),
meck:expect(mock_system_environment,set_time,fun(CurrentTime)->put(current_time,CurrentTime)end),
meck:expect(mock_system_environment,play_wav_file,fun(FileName)->put(played_wav,true)end),
meck:expect(mock_system_environment,wav_was_played,fun()->get(played_wav)end),
meck:expect(mock_system_environment,reset_wav,fun()->put(played_wav,false)end),
 
casemock_system_environment:wav_was_played()of
true->
mock_system_environment:reset_wav();
false->
mock_system_environment:play_wav_file("mm.wav")
end.
1.表示"模仿","假的"
mock測試可翻譯為mock-test