如何在Python函数中正确地对测试代码进行单元化

如何对函数内部的变量/值进行单元测试?

这是关于单元测试(我正在使用pytest)的一个相当基本的问题,我想确保所有代码的行为均符合预期。

一定有适当的方法可以做到这一点,但我没有发现。到目前为止,我尝试将我的代码分成尽可能多的函数,以获取可以测试的尽可能多的返回值。但是我无法在这些函数中进行测试。

在这里,我只能测试返回值interp_function是否按预期工作,而无法测试其余代码。

def multidim_interp_function(grid = None,max_error_in_mm=1,max_error_in_deg=1):

    def interp_function(array_of_pts):
        fct_list = create_interp(grid)
        max_error = [max_error_in_mm]*3
        if len(grid) == 6:
            max_error.extend([max_error_in_deg]*3)
    return np.column_stack([error*fct_list[i](array_of_pts) for i,error in enumerate(max_error)])

return interp_function
kim_heechul 回答:如何在Python函数中正确地对测试代码进行单元化

基本上,您希望函数的行为相同,因此应该预测结果。您不想测试功能的内部状态,而是测试输出。


def my_calculus(divise,multiply):
    def inner(value):
        return value * multiply / divide
    return inner

calculus = my_calculus(2,4)

@pytest.mark.parameterize("function,value,expected",[
    (calculus,2,4),(calculus,5,10)
])
def test_my_calculus(function,expected):
     assert function(value) == excepted
,

您不需要测试函数的实现。如果您在函数内部编写了foo = 'bar',则无需测试是否已为foo正确分配了值'bar';您可以期望它能正常工作。使用单元测试,您希望成为一个更多抽象步骤。您想检查函数multidim_interp_function是否在给定已知输入的情况下返回正确的结果。像对待Python中的其他函数一样对待函数:您不会编写单元测试来弄清楚max()在内部的工作方式,而是会编写断言max(3,4)返回值的测试4

测试功能的“内部”不仅是不切实际的,而且功能的内部可能会发生变化。如果您正在编写单元测试,并且发现自己的代码中存在一些错误,那么您将要更改代码。或者,您稍后可以返回并重构内部结构,以提高内部效率,或者对模块中的某些代码进行重复数据删除,或执行其他操作。您不想每次都重写单元测试。因此,您不应编写过于具体的单元测试。您的单元测试应该测试该函数的公共接口(参数和返回值),因此即使您移动了该接口,也可以确保该接口不变(即该函数继续表现相同)。一些代码。如果通过单元测试或其他方式发现该函数内部存在某些异常行为,则可以使用调试器并逐个确认每条语句以查找问题所在。

要进入正确的心态,请尝试Test-Driven Development,首先编写测试,从本质上确定函数应该的行为,然后实现函数内部,所有这些同时能够测试您的实现是否符合期望。

本文链接:https://www.f2er.com/3129443.html

大家都在问