标题中提出的问题可能是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()
一样。我想抑制这种可视化,而不是更改示例本身。
答案 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)