Python:测试function/method签名是否改变的正确方法
Python: Correct way to test whether function/method signature has changed
我目前正在开发一个应用程序 (my_app
),它使用来自另一个 python 包 (internal_package
) 的逻辑,该包正在并行开发。
假设我在我的代码中使用了 internal_package
中的函数 func1
。在internal_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 方法是什么?
如果有人感兴趣,我最终使用了内置 inspect
库中的 getfullargspec
。在 documentation 它说:
Get the names and default values of a Python function’s parameters. A named tuple is returned:
FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)
因为我对 args
部分感兴趣,所以我从 func1
中检索它们如下:
inspect.getfullargspec(func1)[0]
然后 returns ['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
如果有人知道 better/more pythonic/more 正确的方法,请告诉我。
我目前正在开发一个应用程序 (my_app
),它使用来自另一个 python 包 (internal_package
) 的逻辑,该包正在并行开发。
假设我在我的代码中使用了 internal_package
中的函数 func1
。在internal_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 方法是什么?
如果有人感兴趣,我最终使用了内置 inspect
库中的 getfullargspec
。在 documentation 它说:
Get the names and default values of a Python function’s parameters. A named tuple is returned:
FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)
因为我对 args
部分感兴趣,所以我从 func1
中检索它们如下:
inspect.getfullargspec(func1)[0]
然后 returns ['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
如果有人知道 better/more pythonic/more 正确的方法,请告诉我。