在Python中对整个应用进行回归测试
我有一个小的命令行应用程序(大约6000行代码)。因为我不知道怎么写单元测试,所以之前没有写;现在我想补上这些测试。我看了这个教程,但我对如何使用这个模块测试整个应用程序感到困惑;实际上,我甚至不确定我想做的是否叫“单元测试”。
具体来说,如果我用特定的参数运行我的应用程序,它应该生成一些特定的输出文件。我想确保这些输出文件没有变化。
也就是说,以下是我应用程序的命令行调用:
main.py config1.txt 100 15
main.py config2.txt def 10 qa
etc.....
这些调用会创建几个小的输出文本文件(每个小于10MB),并将它们放入各自的文件夹中(每次调用一个文件夹),文件夹的命名方式如下:
output/config1.100.15.201202011733/
output/config2.def.10.qa.201202011733/
etc...
每个文件夹里包含几个小的文本文件(每个小于10MB)。在每次代码修改后,我想用几十个命令行参数运行我的应用程序,并记录输出文件有差异的情况。(理想情况下,我希望能做更多,比如对某些输出文件进行比较,将它们作为以某个主键分隔的表格进行比较,这样即使行的顺序改变,它们仍然可以被认为是相等的;但这不是关键)。
有什么好的方法来设置这个吗?
1 个回答
12
第一步:把你的应用分成两部分。
第一部分是用来处理命令行选项的,使用的是
optparse
(或者argparse
)。第二部分是真正执行工作的部分。
你的“主”脚本首先处理第一部分,获取所有选项,然后调用第二部分来完成实际工作。
这个方法叫做“为测试而设计”,是单元测试中更重要的一部分。
第二步:一旦你有了这两部分,就测试真正执行工作的那部分。
写单元测试脚本,内容是 from the_app import the_function_or_class_that_does_real_work
测试那个执行实际工作的函数、类或者其他东西。
class Test_With_File( TestCase ):
def assertFileMatches( self, expected, actual, error=None ):
# use difflib or whatever to compare the two files.
class TestMain_Sample_File1( Test_With_File ):
def test_should_produce_known_output( self ):
with open("temp","w") as target:
the_function_that_does_real_work( 'config1.txt', arg2=100, arg3=15, out=target )
self.assertFileMatches( "output/config1.100.15.201202011733", "temp" )
你可以在“TestMain_Sample_File1”类上写不同的变体,以覆盖你觉得有趣的尽可能多的测试案例。