3 回答

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
正如 deHaar 在他的評(píng)論中指出的那樣,您想要涵蓋許多邊緣情況。在測(cè)試數(shù)據(jù)庫(kù)時(shí),可以執(zhí)行以下操作:
您模擬數(shù)據(jù)庫(kù)(在您的存儲(chǔ)庫(kù)中的 Spring 項(xiàng)目中),并將其配置為返回/拋出。然后在您的測(cè)試中,您測(cè)試以下內(nèi)容:
givenNoCustomerInDB_thenNotFoundExceptionThrownIsWrappedToXXX()
. 在這里,您將測(cè)試調(diào)用數(shù)據(jù)庫(kù)的服務(wù)方法是否捕獲異常并相應(yīng)地包裝它。對(duì)于這種方法,您可能需要查找 Mockito,它是 Java 的“事實(shí)上的”模擬框架。另一種選擇是在進(jìn)行測(cè)試時(shí)使用內(nèi)存數(shù)據(jù)庫(kù)(例如 H2)。
要記住的一件事:您有責(zé)任確保模擬(或 H2)表現(xiàn)得像您的真實(shí)數(shù)據(jù)庫(kù)。@Kraylog 建議將適配器寫入 IO 設(shè)備的集成測(cè)試,以及確保模擬行為相同的合同測(cè)試。

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
首先,雖然大多數(shù)函數(shù)都可以進(jìn)行測(cè)試,但并非所有函數(shù)都需要直接測(cè)試。通過(guò)調(diào)用代碼的測(cè)試可以更好地測(cè)試一些。
其次,在處理依賴于狀態(tài)的副作用或代碼時(shí),有一些方法可以創(chuàng)建測(cè)試特定場(chǎng)景所需的上下文。其中一種方法是使用test doubles。
當(dāng)然,我們需要對(duì)不是純函數(shù)的代碼進(jìn)行測(cè)試。您可以盡量減少非純函數(shù)的代碼量(例如使用函數(shù)式編程),但如果您不這樣做,那么您的其余代碼也需要進(jìn)行測(cè)試。
最后,您所說(shuō)的“比率”或通常所說(shuō)的“測(cè)試覆蓋率”取決于您對(duì)測(cè)試套件的信心水平。最后,正是這種信心使您可以重構(gòu)代碼而不必?fù)?dān)心破壞事物,這最終才是重點(diǎn)。

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
在將測(cè)試對(duì)象與其通常環(huán)境隔離的測(cè)試中,您會(huì)input -> logic -> output經(jīng)??吹竭@種模式,因?yàn)檩斎霐?shù)據(jù)必須由環(huán)境提供,而測(cè)試是對(duì)象所經(jīng)歷的環(huán)境。
TDD經(jīng)常使用孤立的測(cè)試;它們通常既快速又令人尷尬地并行,這意味著在設(shè)計(jì)階段運(yùn)行它們具有較低的機(jī)會(huì)成本。
String getName (int id)
{
// read the name of a staffmember out of the DB and return it
}
在像這樣的示例中,我們通常會(huì)被驅(qū)使設(shè)計(jì)“該”數(shù)據(jù)庫(kù)是可配置的,并且在我們的測(cè)試中,我們將提供預(yù)加載到正確狀態(tài)的內(nèi)存數(shù)據(jù)庫(kù)。
// Copy input to database
// connect test subject to database
// invoke query, thereby retrieving the output
是一樣的圖案,只是雕刻的不同。
在許多情況下,我們可以在我們的設(shè)計(jì)中為數(shù)據(jù)庫(kù)引入一些抽象,并使該抽象而不是數(shù)據(jù)庫(kù)成為配置的依賴項(xiàng)。因此,與其使用與數(shù)據(jù)庫(kù)對(duì)話的抽象,不如使用更簡(jiǎn)單的實(shí)現(xiàn),通過(guò)硬編碼來(lái)返回一些值。
這樣的事情有時(shí)被稱為測(cè)試替身。
// Use the input to initialize the test double
// connect test subject to test double
// invoke query, thereby retrieving the output
同樣的模式再次出現(xiàn),“邏輯”的細(xì)節(jié)發(fā)生了一些變化。
logicofinput -> logic -> output不一定是您的生產(chǎn)代碼。編寫與一個(gè)外觀集成的測(cè)試是很常見(jiàn)的,該外觀協(xié)調(diào)測(cè)試主體與其(雙重)依賴關(guān)系之間的交互協(xié)議。
(測(cè)試,就像生產(chǎn)代碼一樣,有設(shè)計(jì)——現(xiàn)在投資一個(gè)好的設(shè)計(jì)可能會(huì)在測(cè)試的整個(gè)生命周期內(nèi)產(chǎn)生可觀的利潤(rùn))。
添加回答
舉報(bào)