我目前在撰寫一個API讓使用者輸入start,end當作頭尾區間並輸出素數表,我要進行單元測試,目標是模擬使用者的各種輸入可能,但我目前碰到一個問題,在一般開發環境下unit test到底要寫在API package下面,還是在關鍵的運算package底下?做為後端菜鳥有點不太清楚XD
如果是在API package底下,那我該怎麼寫呢,因為我發現我API依賴的函式可能有點多,unit test感覺要mock很多關聯函式,希望有大神能教教我沒那麼麻煩的方法 QQ
這邊是我的所有API檔案
這邊則是我的API,他會去導入使用者輸入的numStart,numEnd,並移到程式快取去解算並輸出(註解資料庫的部分可以不用管)
而我的API有依賴到cache的部分,我不清楚unit test是否可以只做這邊的部分
如果還需要我補充更詳細的地方,我會第一時間補充,感謝各位
Q1 : 在一般開發環境下 unit test 到底要寫在 API package 下面,還是在關鍵的運算 package 底下?做為後端菜鳥有點不太清楚 XD
A: 單個模組自己的"單元"測試, 會在該模組資料夾跟production code檔案一起, 就像是關鍵的運算 package 底下; test資料夾下的, 我看一些開源專案跟我自己, 我習慣是作integration test用的.
Q2 : 如果是在 API package 底下,那我該怎麼寫呢,因為我發現我 API 依賴的函式可能有點多,unit test 感覺要 mock 很多關聯函式
A : 樓主的設計, 我看了一下API的前半段都屬於input data(DTO)的validation, 我習慣會多加validater做這塊,就把那堆判斷跟if的拉進去validation就好, 這塊就能單獨寫unit test; cache那塊也是. API那層就能做屬於integration了
那如果單純是測試對於合法不合法的輸入,是不是都能得到正確的被期待的結果輸出,我可以只針對底層做unit test就好嗎,例如calculateCacheInRange那個函式?
那如果單純是測試對於合法不合法的輸入,是不是都能得到正確的被期待的結果輸出,我可以只針對底層做 unit test 就好嗎
4, 合法不合法的輸入 與 calculateCacheInRange就都能分開在自己的檔案內有單元測試了
/api
is???.go
validator.go
isxx_validator_test.go
/cache
cache.go
cache_test.go
/test
整合測試or e2e測試
感謝,大概有頭緒了,但我api程式的第四個if也有依賴到cache的函式,如果也移到validator做test不是也會需要mockㄇ
4, 但你看看你設計的思維
你其實是前面才有判斷跟流程, cache是直接拿值就回傳了
所以他其實就只要mock, 但你隨便stub給值就好.
所以在validator測試的就真的是那幾個if
這是我覺得改動幅度比較小的搬遷.
可以跟公司的小夥伴們討論看看
我的話可能會小改成
func isxxValidator(c *gin.Context,callback func (start, end int) (int, int)) {
//第四個if
if xxx {
xxx, yyy := callback(start, end)
}
}
測試的話就換成一個沒太大意義會給值的stub func就好, 就不必去mock cache