我是python和单元测试的新手。以下是主要的单元测试程序,它调用其他python程序作为测试用例
import unittest
from test import test_support
class MyTestCase1(unittest.TestCase):
def test_feature_one(self):
print "testing feature one"
execfile("/root/test/add.py")
def test_main():
test_support.run_unittest(MyTestCase1);
if __name__ == '__main__':
test_main()
add.py是基本程序,添加两个并显示它。
#!/usr/bin/env python
import sys
def disp(r):
print r
def add():
res = 3+5;
disp(res)
add()
但是当我从另一个函数调用函数时会出现问题。当我尝试运行单元测试(第一个程序)时,我遇到以下错误。但是如果我在单元测试套件之外运行add.py作为单个程序它可以正常工作。请理解这个场景需要帮助
======================================================================
ERROR: test_feature_one (__main__.MyTestCase1)
----------------------------------------------------------------------
Traceback (most recent call last):
File "first.py", line 17, in test_feature_one
execfile("/root/test/add.py")
File "/root/test/add.py", line 12, in <module>
add()
File "/root/test/add.py", line 10, in add
disp(res)
NameError: global name 'disp' is not defined
----------------------------------------------------------------------
答案 0 :(得分:0)
来自execfile(https://docs.python.org/2/library/functions.html#execfile)上的文档:
“请记住,在模块级别,全局变量和本地变量是相同的字典。 ... 如果省略locals字典,则默认为globals字典。如果省略两个字典,则表达式在调用execfile()的环境中执行。“
我不太熟悉全局和当地人在这里如何运作,所以我无法给出深刻的解释,但是根据我的理解: 这里的关键是你从函数运行execfile。如果从模块级别运行它,它将起作用:
if __name__ == '__main__':
execfile('blah')
但是如果你从函数运行它:
def f():
execfile('blah')
if __name__ == '__main__':
f()
它会失败。因为全局和本地人的魔力。
如何修复您的示例:将字典添加到execfile的参数中,它将起作用(请记住来自docs的那一行:“如果省略locals字典,则默认为全局字典。”)。
但是我没有使用execfile,而是建议从add.py导入add并在测试中调用它。 (这也需要移动调用以将add.py中的func添加到if __name__ == '__main__':
,以便不在导入上运行添加。
这里有一些关于全局和本地人如何工作的信息http://www.diveintopython.net/html_processing/locals_and_globals.html。