如何抑制用execfile调用的脚本中的语句执行?

时间:2013-04-06 09:19:25

标签: python unit-testing

标题中提出的问题可能是the XY-Problem的情况,但我无法找到更简洁的描述。我想通过在每个脚本上运行execfile(filename)来测试一些python脚本,然后查看它们是否触发断言/抛出异常。到目前为止一切都很好,但是他们中的大多数人也开始用一个声明构成一个gui,让我们说world.show('someString')。对于自动化测试,我不想看到gui。如何在不改变剧本本身的情况下压制gui?

修改 关于评论:在本质上,我可以做:

import unittest

class TestExamples(unittest.TestCase):

    def test_firstExample(self):
        execfile('example1.py')

    def test_secondExample(self):
        execfile('example2.py')

    # and many more

if __name__ == '__main__':
    unittest.main()

但是a)有两个以上,我宁愿不为每个例子写一个测试函数。我希望他们只是在文件夹中进行测试。这可以通过单元测试discover来解决。并且b),其中大部分以可视化计算结束,就像使用matplotlib.pyplot.show()一样。我想抑制这种可视化,而不是更改示例本身。

2 个答案:

答案 0 :(得分:3)

这是一个相当简单的选择:假设您有一个像这样的文件world.py ......

def show(text):
    return some_gui_stuff.confirm(text)

...然后创建一个新文件fakeworld.py,看起来像这样......

def show(text):
    return True

...然后在您的测试脚本中,执行类似......

的操作
import sys
sys.modules['world'] = __import__('fakeworld')
execfile('example1.py')

example1.py尝试import world时,它会使用您在测试脚本顶部导入的假冒版本。

这意味着您必须为world.py中的每个功能创建假版本。如果有很多功能,但只有一两个需要改变,那么制作这样的测试脚本可能会更容易......

import world
import fakeworld
world.show = fakeworld.show
execfile('example1.py')

...或者如果world.show实际上是唯一的功能,您甚至可能不需要创建fakeworld.py - 只需执行类似...

import world
world.show = lambda x: True
execfile('example1.py')

答案 1 :(得分:1)

我认为,正确的方法是模拟您正在使用的GUI(如下面的评论中提到的那样)。

但“简单方法”可能是安装xvfb - 虚拟帧缓冲X服务器(例如Debian它将是xfvb包)并使用以下命令运行你的unittest脚本:

xvfb-run python unittest.py