Python 如何从单元测试测试文件中的变量范围

Python 如何从单元测试测试文件中的变量范围,python,unit-testing,scope,Python,Unit Testing,Scope,我有一个这样的程序 class A(): def __init__(self): self.foo = x if __name__ == '__main__': x = 96 a=A() print(a.foo) 当它从shell“pythonfoo.py”运行时,它将输出96 我也有考试 import foo import unittest class TestFoo(unittest.TestCase): def test1(s

我有一个这样的程序

class A():
    def __init__(self):
        self.foo = x

if __name__ == '__main__':
    x = 96
    a=A()
    print(a.foo)
当它从shell“pythonfoo.py”运行时,它将输出96

我也有考试

import foo

import unittest

class TestFoo(unittest.TestCase):
    def test1(self):
        x=37
        a=foo.A()
        self.assertEqual(a.foo, 37)


if __name__ == '__main__':
    unittest.main()
当我从shell运行这个测试时,我得到

$ python test_foo.py 
E
======================================================================
ERROR: test1 (__main__.TestFoo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_foo.py", line 8, in test1
    a=foo.A()
  File "/home/zzz/foo.py", line 3, in __init__
    self.foo = x
NameError: global name 'x' is not defined

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)
所以我的问题是,是否有可能从testfoo.py测试foo.py,设置x并看到它在类A.f中使用,而不改变foo.py程序

显然,这是一个实际程序的简化版本

我在Python3.6和2.7中得到了相同的结果


我尝试过使用各种组合的
global
,但没有找到使用该组合的方法

您需要将其更改为:

class A():
    def __init__(self,x):
        self.foo = x
在测试中:

class TestFoo(unittest.TestCase):
    def test1(self):
        x=37
        a=foo.A(x)
        self.assertEqual(a.foo, 37)

您的
x
变量是在检查
foo.py
是否作为主程序运行的
if
块中定义的,因此当
test\u foo.py
导入
foo.py
时,将不会定义
x
,因此会出现错误

您应该在
if
块之外定义
x

x = 96

class A():
    def __init__(self):
        self.foo = x

if __name__ == '__main__':
    a=A()
    print(a.foo)

test\u foo.py
中,如果您想覆盖
foo
x
值,您应该执行
foo.x=37
而不是
x=37
,因为
x
否则将是
test1

的局部变量,您可以在全局范围内访问变量
x

self.foo=x
当您直接运行脚本时,
\uu name\uu
是“main”,则设置全局变量
x
并构造
A()

导入
foo时,如果未执行
,则在
下导入
foo
模块代码。在全局范围内或任何外部范围内都没有变量
x

对,我可以这样做,它会工作的!但是想象一下,有几十个函数使用x。我必须把它们全部换掉。如果我是从头开始设计测试中的程序,那正是我要做的