單元測試簡述

2021-09-19 12:36:07 字數 3356 閱讀 4276

最開始專案中是沒有單元測試的,基本都是自己通過各種方式來實現測試的。比如修改**,測完再改回來;再比如直接模擬使用者操作,直接當黑盒測試,然後自己去看相應的邏輯有沒有,狀態有沒有改變。

這些方式有幾個缺點:

這個裡面多次手工測試比較難受,太浪費時間了。以前由於乙個邏輯牽扯比較多,構造物件比較複雜,僅僅用junit寫測試的工作量還是太大,所以單元測試一直沒有進行下去。

後來引入的mockito框架來用於新**的測試,powermock用於以前的**測試。下面將介紹一下mockito和powermock框架,就明白為什麼要用這兩個框架了。

mockito是用的比較廣的mock框架。mock技術的目的和作用是模擬一些在應用中不容易構造或者比較複雜的物件,從而把測試與測試邊界以外的物件隔離開。

為了說明使用方法,先引入一下基本物件

public class user 

//... construction getter

}

public class service 

return false;

}}

預設的static import

import static org.mockito.mockito.*;

import static org.junit.assert.*;

如果要測試service#checkuser方法,我們就要構造user物件。假設complexobject構造很複雜,如果不用mock,測試將寸步難行。下面來看看mockito是如何構造乙個假的user並進行測試的吧。

@test

public void testcheckuser() throws exception

上面可以看到只用mock方法就可以了,然後設定一下getuserid方法的返回就行了。when的語法理解很容易,就不解釋了。

上面的when語句也可以換成

doreturn(2).when(user).getuserid();
在這個例子中,這兩種when的寫法都是可行的。

一共有以下幾種方式來模擬乙個方法。

當然也有then***這種形式。

spy和mock很像,都是模擬乙個物件。但是mock是把所有方法都接管了,spy是預設呼叫物件的方法。如果先mock出乙個物件,然後對每乙個方法呼叫docallrealmethod,這就相當於spy出乙個物件。

所以spy和mock只是初始模擬物件的預設設定不一樣而已,其他行為都是一樣的。

可以直接用註解來實現mock:

@mock

user user;

@before

public void initmocks()

@test

public void testcheckuser() throws exception

這個需要呼叫initmocks(this)來注入,這裡是通過@before,也可以通過@runwith來呼叫initmocks方法。

也可以用spy註解:

@spy user user;
還有乙個註解比較有用@injectmocks,這個可以把物件注入到其他物件中去的。

下面稍微新增一下**:

public class complexobject 

//...

}

public class service 

//...

}

public class testservice 

@test

public void testhandleuser() throws exception

//...

}

這個是用來判斷方法是否被呼叫,呼叫是否超時,呼叫了多少次等測試。

@test

public void testcheckuser() throws exception

如果方法有引數,也可以驗證引數。

這裡只是簡介,如果想詳細了解mockito,建議還是看官網文件。

mockito不支援final方法,私有方法,靜態方法,而powermock支援。所以這裡也要介紹一下。但是還是不建議專案中使用,如果需要使用powermock才能測試,說明**的可測試性不好,需要改進**。一般都是歷史遺留**或者第三方庫相關測試的時候才需要使用。

下面是使用方式

@runwith(powermockrunner.class)

@preparefortest( )

public class yourtestcase

給個例子,大家就理解了

@runwith(powermockrunner.class)

@preparefortest( )

public class testservice

@test

public void testteststaticfinal() throws exception

@test

public void testprivate() throws exception

@test

public void testtestprivatewitharg() throws exception

}

public class service 

private string testprivate()

public string testprivateforpublic()

private string testprivatewitharg(string arg)

}

私有方法用powermock測試後,如果要修改名字就會很麻煩,重構起來也可能會影響測試用例。所powermock的正確使用方式是盡量不使用。

因為要反射呼叫私有方法,所以寫法沒有mockito那麼優雅。我這裡使用的是基於mockito的powermock,所以可以混合使用,比如上面用到的spy,when等。當然powermock還有基於其他mock框架(easymock)的擴充套件,這裡就不再進一步介紹了。

想讓測試更加高效,測試框架還是其次,寫出可測試性的**才是最重要的。

單元測試 單元測試文章收藏

前言 前段時間公司計畫做自動化測試,自己也打算圍繞幾個點做相關調研,現在想想呢?其實對自動化測試的概念都還不是十分清晰,當時主要還是圍繞 單元測試 向qa小夥伴學習了一段時間,現由於公司重組,學習中斷,這裡簡單記錄一些單元測試好文,留待後續參考.什麼叫自動化測試?自動化測試覆蓋率?覆蓋率如何做到的?...

單元測試之Django單元測試

每個應用,自帶tests.py 整合在django的專案檔案裡,更多是開發人員寫django自動的測試執行 3.1 前後置方法執行特點 django.test.testcase類主要由前 後置處理方法和test開頭的方法組成 特點 繼承於django.test.testcase 測試用例都是test...

單元測試(三) 建立多執行緒單元測試

junit本是不支援多執行緒的,乙個單元測試case主程序跑完,其他new出來的執行緒都會gg思密達。此篇mark乙份在junit中執行多執行緒的方法。net.sourceforge.groboutils groboutils core 5test slf4j public class device...