python - Python:测试函数/方法签名是否已更改的正确方法
问题描述
我目前正在开发一个应用程序 ( my_app
),该应用程序 () 使用另一个 python 包 ( internal_package
) 中的逻辑,该程序正在并行开发。
假设我在我的代码中使用了一个函数func1
。internal_package
中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 方式是什么?
解决方案
如果有人感兴趣,我最终使用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/更正确的方法,请告诉我。
推荐阅读
- sql - 如何防止更新语句将某些记录设置为空?
- mongodb - MongoDB 2.6.10 count() 聚合()
- python - PostGIS 空间查询性能低下
- python - 为什么在 Pykd 中找到符号时会出现“未找到符号”?
- angularjs - 如何在AngularJS $http中的url中添加一个变量元素
- python - 如何比较一组描述 NLP 中相同概念的短语的有意义水平?
- c# - 如何去除桌面图标的蓝色背景?
- r - R中的boot.ci()函数出错
- java - 由于 kotlin 中的泛型,无法实例化适配器包装器
- php - Laravel 5 POST 方法不起作用