【问题标题】:imported module and global variables导入的模块和全局变量
【发布时间】:2020-09-21 05:28:31
【问题描述】:

我正在尝试在 python 中为带有函数 y 的代码 X 编写单元测试。在测试代​​码中,我使用: 从 X 导入 y。

但是,在 X 内部,还有其他函数,函数 z,用于定义全局变量。 在导入函数y然后调用的测试代码中,它给出了这些全局变量未定义的错误(因为我特别只调用函数y,而不是z)。

有没有一种方法可以在我的测试代码中定义那些需要的全局变量并运行导入的函数(即“y”)?

这是代码 X:

def calc_z:
    global a, b, c
    return(a+b+c)

def calc_y:
    return(a*b*c)

我正在为 calc_y 编写单元测试。在单元测试中: 从 X 导入 calc_y。但是 calc_y 使用的是 calc_z 中定义的那些全局变量。我以为我可以在测试文件中定义全局 a、b、c 以消除 calc_y 对 calc_z 的依赖,但是没有用。

【问题讨论】:

  • 您能否添加一些代码来显示问题,如果可能的话作为minimal reproducible example?我没有从描述中理解您的问题。
  • 您的全局变量未在calc_z 中定义,它们仅在此处使用(并且不需要global 语句,您可以在不改变结果的情况下将其删除)。您的变量必须在函数之外的某个地方定义,否则这两个函数都不起作用。
  • 我没有在这里的简短描述中为变量赋值。但在原始代码中,这些全局值是在 calc_z 中定义的。这个模块 X 不是我的代码,我只是想为它的一些重要方法编写单元测试。我想一般的问题是,当该方法使用在该模块内全局定义的多个变量时,如何为该方法编写测试?
  • 全局变量仍然没有在函数内部定义,只是被引用,所以它们必须在函数外部定义,你应该可以在你的测试中设置它们。
  • 我知道 main 中的变量都是全局的,但如果它们被定义为全局 a、b、c ,那么函数内部的那些变量也是可以访问的。

标签: python unit-testing module


【解决方案1】:

确实可以在函数中定义全局变量,尽管这是一种糟糕的编程风格(但我知道你不能改变这一点)。这会更改变量的创建时间(它们通常仅在调用该函数时创建),但不会更改位置 - 它们仍然全局存在于模块中,您仍然可以从外部设置它们。

因此,您的示例的测试可能如下所示(假设您使用 pytest):

import x
 
def test_calc_y():
    x.a = 1
    x.b = 2
    x.c = 3
    assert x.calx_y() == 6

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多