2

标题中提出的问题可能是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)有两个以上,我不希望为每个示例编写一个测试函数。我希望他们只是在文件夹中进行测试。这可以通过 unittests 解决discover。并且 b),它们中的大多数以可视化计算结束,就像您使用matplotlib.pyplot.show(). 我想抑制这种可视化,而不改变示例本身。

4

2 回答 2

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')
于 2013-04-13T17:22:08.353 回答
1

我认为,正确的方法是模拟您正在使用的 GUI(如您问题下方的评论中所述)。

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

xvfb-run python unittest.py
于 2013-04-08T22:08:52.670 回答