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。我必须把它们全部换掉。如果我是从头开始设计测试中的程序,那正是我要做的