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

时间:2019-02-14 16:22:00

标签: python unit-testing scope

我有一个像这样的程序

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

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

从外壳程序“ python foo.py”运行时,它会打印出96

我也有test_foo.py

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()

从外壳运行此test_foo.py时,我会得到

$ 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)

所以我的问题是,是否可以从test_foo.py测试foo.py,设置x并查看它是否在类A中使用。f无需更改foo.py程序

显然,这是真实程序的简化版本

我在python 3.6和2.7上得到了相同的结果

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

3 个答案:

答案 0 :(得分:2)

您的x变量在if块中定义,该变量检查foo.py是否作为主程序运行,因此foo.py由{{1}导入时},test_foo.py未定义,因此会出现错误。

您应该在x块之外定义x

if

x = 96 class A(): def __init__(self): self.foo = x if __name__ == '__main__': a=A() print(a.foo) 中,如果您要覆盖test_foo.py的{​​{1}}的值,则应使用x而不是foo,因为{{ 1}}否则将是foo.x=37的局部变量。

答案 1 :(得分:1)

您需要将其更改为:

class Window(QMainWindow):
    def __init__(self, parent=None):
        #This initializes the main window or form
        super(Window,self).__init__(parent=parent)
        self.setGeometry(1,31,900,900)
        self.setWindowTitle("Pre-Alignment system")

def run():
    app = QApplication.instance()
    if app is None: 
        app = QApplication(sys.argv)
    GUI = Window()
    view = Display_Pixels(GUI)
    #view = MyView(GUI)
    GUI.show()
    sys.exit(app.exec_())

run()

并在测试中:

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

答案 2 :(得分:0)

您可以在此处访问全局范围内的变量x

        self.foo = x

直接运行脚本时,__name__是' main ',则需要设置全局变量x并构造A()。 导入foo下的if模块代码时,不会执行。全局范围内或外部范围内都没有变量x