我正在尝试学习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