5

我有一个小型命令行应用程序(大约 6k 行)。它没有单元测试,因为我不知道如何编写它们;但我现在追溯添加一些。我阅读了本教程,但对如何使用此模块测试整个应用程序感到困惑;事实上,我什至不确定我想做的是否称为“单元测试”。

具体来说,如果我使用某些参数运行我的应用程序,它应该会生成某些输出文件。我想确保那些输出文件没有改变。

即,我的应用程序的以下命令行调用:

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)。在每次代码更改迭代之后,我想使用几十个命令行参数运行我的应用程序,并注意输出文件不同的任何情况。(理想情况下,我想做更多的事情;例如,对于某些输出文件,将它们作为具有特定主键的制表符分隔表进行比较,这样如果行顺序发生更改,它们仍然会评估为相等;但这不是批判的)。

设置这个的好方法是什么?

4

1 回答 1

12

第 1 步。将您的应用程序分成两部分。

  1. 使用optparse(或argparse)解析命令行选项的部分。

  2. 真正发挥作用的作品。

然后,您的“主”脚本执行第 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”类上编写变体,以涵盖您感兴趣的尽可能多的测试用例。

于 2012-02-02T02:24:44.193 回答