【问题标题】:Python: Correct way to test whether function/method signature has changedPython:测试函数/方法签名是否已更改的正确方法
【发布时间】:2021-04-28 09:51:08
【问题描述】:

我目前正在开发一个应用程序 (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 方式是什么?

【问题讨论】:

  • 你为什么不用 2 个参数来调用它?
  • 你的意思是internal_package.func1(a=1,b=2)作为test_func1_signature()-Test函数的唯一内容?没有assert- 声明?在这种情况下,想法是如果签名发生更改,则会引发错误,否则不会发生任何事情(即测试成功)。对吗?
  • 问题:假设abc 是例如数据帧。如果我只是调用它,我需要有效的数据帧abc 进行测试,以免引发任何错误。但是,我只想测试func1 的参数是否被称为ab(如果给定c)并且在这种情况下没有任何默认值

标签: python unit-testing pytest integration-testing


【解决方案1】:

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

获取 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/更正确的方法,请告诉我。

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 2019-07-06
    • 2013-04-04
    • 2019-06-13
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多