我有一个小型命令行应用程序(大约 6k 行)。它没有单元测试,因为我不知道如何编写它们;但我现在正在追溯添加一些。我读了this tutorial但是我对如何使用这个模块测试整个应用程序感到困惑;事实上,我什至不确定我想做的是否称为“单元测试”。
具体来说,如果我使用某些参数运行我的应用程序,它应该会生成某些输出文件。我想确保这些输出文件没有改变。
即,我的应用程序的以下命令行调用:
main.py config1.txt 100 15
main.py config2.txt def 10 qa
etc.....
创建一些小的输出文本文件(每个< 10 MB)并将它们放入单独的文件夹(每次调用一个),命名如下:
output/config1.100.15.201202011733/
output/config2.def.10.qa.201202011733/
etc...
每个文件夹都包含一些小文本文件(每个<10MB)。每次代码更改迭代后,我想使用几十个命令行参数运行我的应用程序,并记录输出文件不同的任何情况。 (理想情况下,我想做的不止于此;例如,对于某些输出文件,将它们作为制表符分隔的表与某个主键进行比较,这样如果行顺序发生变化,它们仍然会被评估为相等;但事实并非如此关键)。
设置它的好方法是什么?
最佳答案
第 1 步。将您的应用分成两部分。
使用
optparse
(或argparse
)解析命令行选项的部分。真正起作用的部分。
您的“主要”脚本然后执行第 1 部分以获取所有选项并调用第 2 部分来完成实际工作。
这被称为“可测试性设计”,是单元测试中比较重要的部分。
第 2 步。一旦你有了两个部分,测试真正起作用的部分。
编写单元测试脚本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”类上编写变体,以涵盖您感兴趣的尽可能多的测试用例。
关于python - 在 Python 中对整个应用程序进行回归测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9106251/