【发布时间】:2017-12-31 17:04:29
【问题描述】:
我正在尝试学习 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()中的逻辑是否比代码示例中显示的调用序列更复杂? -
目前我设置了一些值,但没有任何内容不能放入其中一个 transformVx(data) 函数中。
标签: python r unit-testing tdd testthat