python - 如何在 Python 函数内正确地对代码进行单元测试

标签 python unit-testing pytest

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

这是关于单元测试(我正在使用 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

最佳答案

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

测试函数的“内部结构”不仅不切实际,而且函数的内部结构可能会发生变化。如果您正在编写单元测试并且发现代码中存在一些错误,那么您将更改代码。或者您稍后可能会回来重构内部结构以提高它们的效率,或者删除模块中的某些代码,或者其他什么。您不想每次都重写单元测试。因此,您不应该将单元测试编写得过于具体。您的单元测试应该测试函数的公共(public)接口(interface)(参数和返回值),这样您就可以确保即使您移动该接口(interface)也不会改变(即函数继续表现相同)一些代码。如果通过单元测试或其他方式发现函数内部存在一些不当行为,那么您可以使用调试器介入并一一确认每个语句以查找问题所在。

要进入正确的心态,请尝试 Test-Driven Development ,首先编写测试,本质上决定函数应该如何表现,然后实现函数内部,同时能够测试您的实现是否符合预期。 p>

关于python - 如何在 Python 函数内正确地对代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58788214/

相关文章:

python - 响应 Listctrl 变化恰好一次

python - 带 ndarray 的 ctypedef 引发 "Buffer types only allowed as function local variables"

python - 我正在尝试获取所选列表项的索引值

ios - Xcode 5.1 打破了一些测试

javascript - 如何测试传递需要自身的nodejs模块

python - 在pytest中,如何确保在类级之前调用模块级 fixture

python - pytest fixtures可以组合吗?

python - 如何检查文件是否包含纯文本?

xml - ruby 单元测试 : Is this a Valid (well-formed) XML Doc?

python - pytest 应该用于集成测试嵌入式系统吗?