iT邦幫忙

1

golang API web 單元測試問題

  • 分享至 

  • xImage

我目前在撰寫一個API讓使用者輸入start,end當作頭尾區間並輸出素數表,我要進行單元測試,目標是模擬使用者的各種輸入可能,但我目前碰到一個問題,在一般開發環境下unit test到底要寫在API package下面,還是在關鍵的運算package底下?做為後端菜鳥有點不太清楚XD

如果是在API package底下,那我該怎麼寫呢,因為我發現我API依賴的函式可能有點多,unit test感覺要mock很多關聯函式,希望有大神能教教我沒那麼麻煩的方法 QQ

這邊是我的所有API檔案https://ithelp.ithome.com.tw/upload/images/20230819/201621362z3psAYDtV.png

這邊則是我的API,他會去導入使用者輸入的numStart,numEnd,並移到程式快取去解算並輸出(註解資料庫的部分可以不用管)https://ithelp.ithome.com.tw/upload/images/20230819/20162136F0nCrfQgwX.png

而我的API有依賴到cache的部分,我不清楚unit test是否可以只做這邊的部分https://ithelp.ithome.com.tw/upload/images/20230819/20162136yDsgRTA7NX.pnghttps://ithelp.ithome.com.tw/upload/images/20230819/20162136pWwCVWepjI.png

如果還需要我補充更詳細的地方,我會第一時間補充,感謝各位

obarisk iT邦研究生 1 級 ‧ 2023-08-19 23:18:50 檢舉
test 是寫給你自己或是幫你 檢查程式 的人看的。

需要看的人可以接受的位置,就可以了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
雷N
iT邦研究生 1 級 ‧ 2023-08-20 21:01:29
最佳解答

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了

看更多先前的回應...收起先前的回應...
brown125 iT邦新手 5 級 ‧ 2023-08-20 21:42:09 檢舉

那如果單純是測試對於合法不合法的輸入,是不是都能得到正確的被期待的結果輸出,我可以只針對底層做unit test就好嗎,例如calculateCacheInRange那個函式?

雷N iT邦研究生 1 級 ‧ 2023-08-20 22:23:08 檢舉

那如果單純是測試對於合法不合法的輸入,是不是都能得到正確的被期待的結果輸出,我可以只針對底層做 unit test 就好嗎
4, 合法不合法的輸入 與 calculateCacheInRange就都能分開在自己的檔案內有單元測試了

雷N iT邦研究生 1 級 ‧ 2023-08-20 22:25:37 檢舉

/api
is???.go
validator.go
isxx_validator_test.go

/cache
cache.go
cache_test.go

/test
整合測試or e2e測試

brown125 iT邦新手 5 級 ‧ 2023-08-20 23:12:54 檢舉

感謝,大概有頭緒了,但我api程式的第四個if也有依賴到cache的函式,如果也移到validator做test不是也會需要mockㄇ

雷N iT邦研究生 1 級 ‧ 2023-08-21 10:13:30 檢舉

4, 但你看看你設計的思維
你其實是前面才有判斷跟流程, cache是直接拿值就回傳了
所以他其實就只要mock, 但你隨便stub給值就好.

所以在validator測試的就真的是那幾個if
這是我覺得改動幅度比較小的搬遷.
可以跟公司的小夥伴們討論看看

雷N iT邦研究生 1 級 ‧ 2023-08-21 10:26:11 檢舉

我的話可能會小改成

func isxxValidator(c *gin.Context,callback func (start, end int) (int, int)) {
  //第四個if
  if xxx {
    xxx, yyy := callback(start, end)
   
  }
} 

測試的話就換成一個沒太大意義會給值的stub func就好, 就不必去mock cache

雷N iT邦研究生 1 級 ‧ 2023-08-21 10:30:56 檢舉

或者cache的部分在api這層用個interface
但你就會需要在new controller時作注入
這樣的概念叫做DIP, 實作方法能參考IoC+DI

brown125 iT邦新手 5 級 ‧ 2023-08-21 15:50:35 檢舉

https://ithelp.ithome.com.tw/upload/images/20230821/201621361bcQoER1l9.png
不好意思,我test的部分是寫成這樣了,但他的報錯我查了很久都沒頭緒。
https://ithelp.ithome.com.tw/upload/images/20230821/20162136nu8hoVSmqq.png

雷N iT邦研究生 1 級 ‧ 2023-08-21 21:39:19 檢舉

有點難猜XD 沒行數
但他是說沒辦法把string 轉成go []int

我要發表回答

立即登入回答