#python-2.7 #unit-testing
#python-2.7 #модульное тестирование
Вопрос:
я использую ConfigParser для чтения INI-файла в проекте Python (2.7). Теперь я хочу написать Unittest, но я не уверен, какой самый чистый способ его тестирования.
я уже пытался адаптировать init-метод класса, который считывает INI-файл, чтобы я мог передать файл, который следует использовать в качестве параметра. вот так:
def __ini__(self, config_file='/src/config/my_conf.ini'):
self.conf = ConfigParser.SafeConfigParser()
self.conf.read(config_file)
он отлично работает в рабочей среде. Однако мне не удается запустить его в unittest. Файл конфигурации никогда не доступен. Не имеет значения, использую ли я значение по умолчанию или меняю его на ‘/test/config/my_conf.ini’.
Я бы предпочел использовать относительные пути.
Может кто-нибудь сказать мне, что я делаю неправильно с путем в unittest. Или у кого-нибудь есть идея получше, как с этим справиться?
Большое спасибо!
Ответ №1:
Распространенным решением такого рода проблем является то, что во время модульного тестирования вы просто не получаете доступ к реальному файлу. Вместо этого вы «издеваетесь» над функциональностью, которая считывает содержимое файла. Затем этот макет контролируется тестом, например, для каждого тестового случая ваша модифицированная функциональность возвращает данные, как если бы они были прочитаны из файла.
Это не обязательно должно выполняться на уровне доступа к файлам. В вашем примере вы также могли бы издеваться над ConfigParser.SafeConfigParser()
. То есть, во время тестирования ваш код не будет обращаться к истинному анализатору конфигурации, а только к некоторому макету, который просто ведет себя как один и фактически управляется тестовым кодом.
Однако в вашем коде для этого потребуется немного хитрости: способ написания __init__
функции затрудняет получение контроля из кода модульного тестирования. Таким образом, рекомендуется изменить код таким образом, чтобы тестовый код имел больший контроль над доступом к файлам или анализатором конфигурации. Найдите «инверсия управления», чтобы узнать больше о том, как это можно сделать.