首页 > 解决方案 > Python:测试函数/方法签名是否已更改的正确方法

问题描述

我目前正在开发一个应用程序 ( my_app),该应用程序 () 使用另一个 python 包 ( internal_package) 中的逻辑,该程序正在并行开发。

假设我在我的代码中使用了一个函数func1internal_packageinternal_package,定义如下:

def func1(a, b):
    # do something
    ...

func1但是,如果(即调用函数的参数)的函数签名发生变化,让我们说

def func1(a, b, c):
    # do something
    ...

我的代码当然会引发异常,因为我没有传递参数c

为了立即意识到这一点,我想在 pytest 中编写一个测试。在我的理解中,这种测试不是单元测试,而是集成测试。

我的方法是这样的:

import inspect
import internal_package

def test_func1_signature():
    expected_signature = ?  # not sure how to correctly provide the expected signature here
    actual_signature = inspect.signature(internal_package.func1)
    
    assert actual_signature == expected_signature

我希望这是一个常见问题,但我找不到任何相关内容。执行此类测试的最 Pythonic 方式是什么?

标签: pythonunit-testingpytestintegration-testing

解决方案


如果有人感兴趣,我最终使用getfullargspec了内置inspect库。在文档中它说:

获取 Python 函数参数的名称和默认值。返回一个命名元组: FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)

由于我对该args部分感兴趣,因此我从以下位置检索它们func1

inspect.getfullargspec(func1)[0]

然后返回['a', 'b']。然后我可以像这样在 pytest 中编写一个简单的测试:

import pytest
import inspect

def test_func1_signature:
    expected_signature = ['a', 'b']  # I specify what i expect

    actual_signature = inspect.getfullargspec(func1)[0]

    assert actual_signature == expected_signature 

如果有人知道更好/更pythonic/更正确的方法,请告诉我。


推荐阅读