我正在嘗試學習TDD,同時編寫一個腳本,將其輸入數據轉換爲一系列長函數。無論我是用python還是R編寫它,問題都是相似的。我認爲它與TDD理解更相關。如何爲一系列數據轉換編寫單元測試?
# Look of main in python
def main():
data = get_data()
data_a = transform_fun1(data)
data_b = transform_fun2(data_a)
data_c = transform_fun3(data_b)
....
return data_x
# Look of main in R
main <- function() {
data <- get_data() %>%
transform_fun1() %>%
transform_fun2() %>%
transform_fun3() %>%
...
data_x
}
什麼寫每個transform_fun
單元測試的最好的過程,知道他們需要輸入以前transform_fun
的結果呢?
一開始它看起來相當乾淨,但隨着我越來越深入,我開始在每個測試中重現越來越多的main
,這種測試並沒有好聞。複製main
過程的整個部分看起來與單元測試的想法不直觀。
# in python (pytest)
def test_transform_fun_n(data):
data_a = transform_fun1(data)
data_b = transform_fun2(data_a)
...
data_n = transform_fun_n(data_n-1)
assert data_n == blabla
# in R (testthat)
test_that("transform_fun_n do what I expect", {
data_a <- transform_fun1(data)
data_b <- transform_fun2(data_a)
...
data_n <- transform_fun_n(data_n-1)
expect_that(data_n, equals(blabla))
})
我也嘗試在每一步之間添加夾具(至少在python中),但它看起來並不理想。
- 編輯 - 試圖勾畫出VoiceOfUnreason的答案。
def transformV1(data):
return data + x
def transformV2(data):
return transformV1(data) + y
def transformV3(data):
return transformV2(data) + z
def main():
data = get_data()
return transformV3(data)
*我開始在每次測試中重現越來越多的main * - 在main()中是否有比您的代碼示例中顯示的調用序列更復雜的邏輯? – guillaume31
目前我設置了一些值,但沒有任何值不能放入transformVx(數據)函數中的一個。 – xav