在单元测试中调用单独的python程序

时间:2014-10-09 16:36:17

标签: python unit-testing

我是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

 ----------------------------------------------------------------------

1 个答案:

答案 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