регрессионное тестирование всего приложения в Python - PullRequest
5 голосов
/ 02 февраля 2012

У меня небольшое приложение командной строки (около 6 тыс. Строк). У него нет модульных тестов, потому что я не знал, как их написать; но я задним числом добавляю немного сейчас. Я прочитал этот урок , но я озадачен тем, как протестировать все приложение с помощью этого модуля; на самом деле, я даже не уверен, что то, что я хочу сделать, называется «модульным тестом».

В частности, если я запускаю свое приложение с определенными параметрами, оно должно генерировать определенные выходные файлы. Я хочу убедиться, что эти выходные файлы не изменены.

А именно, следующие вызовы командной строки моего приложения:

main.py config1.txt 100 15
main.py config2.txt def 10 qa
etc.....

создайте несколько небольших выходных текстовых файлов (<10 МБ каждый) и поместите их в отдельные папки (по одной на каждый вызов), названные так: </p>

output/config1.100.15.201202011733/
output/config2.def.10.qa.201202011733/
etc...

Каждая папка содержит несколько небольших текстовых файлов (<10 МБ каждая). После каждой итерации изменения кода я хотел бы запустить свое приложение с несколькими десятками параметров командной строки и отметить любые случаи, когда выходные файлы отличаются. (В идеале я хотел бы сделать больше, чем это; например, для некоторых выходных файлов сравните их как таблицы с разделителями табуляции с определенным первичным ключом, чтобы при изменении порядка строк они все равно оценивались как равные; критический). </p>

Какой хороший способ настроить это?

1 Ответ

12 голосов
/ 02 февраля 2012

Шаг 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", чтобы охватить столько тестов, сколько вам интересно.

...