Модульный тест для модуля конфигурации, который загружает значения из файла - PullRequest
0 голосов
/ 19 декабря 2018

Новое в модульном тестировании (с использованием pytest) и попытке выяснить, как я могу протестировать модуль конфигурации, который загружает его значения из INI-файла таким образом, который изолирует его от среды.

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

Как показано, ini-файл жестко задан в модуле, но не хочетбыть привязанным к config.ini, когда он потенциально недоступен.

Это упрощенная версия модуля конфигурации:

from configparser import ConfigParser

class Configuration():
    def __init__(self, ini_file):
        parser = ConfigParser()
        parser.read(ini_file)

        for section_name in parser.sections():
            self.__dict__.update(parser.items(section_name))

config = Configuration('config.ini')

Я получаю доступ к значениям конфигурации следующим образом:

from config import config

print(config.port)

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 01 февраля 2019

Вы пишете:

как я могу протестировать модуль конфигурации [...] таким образом, чтобы изолировать его от его среды.

, но также

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

Что я понимаю следующим образом: Вы хотите проверитьцепочка «входные данные конфигурации» -> ConfigParser -> Configuration, чтобы проверить, будут ли «входные данные конфигурации» найдены в Configuration ожидаемым образом.Между прочим, это скорее сценарий интеграционного тестирования, чем сценарий модульного тестирования.

Что касается упомянутой вами изоляции, я понимаю, что вы не хотите использовать «config.ini».в качестве источника данных, но то, что находится под вашим контролем.Вы уже предоставили имя файла конфигурации в качестве аргумента своему конструктору.Это хороший шаг, поскольку он дает вам некоторый контроль со стороны тестирования, а именно дает вам возможность указать файл, который будет использоваться из теста.

Однако вы можете даже пойти дальше:Класс 1020 * может читать из строки вместо файла (метод read_string, новый в Python 3.2: https://docs.python.org/3/library/configparser.html). Если вы измените свой код таким образом, чтобы тест мог контролировать, дает ли Configuration команду ConfigParser для чтения из файла или из строки вы можете создавать свои интеграционные тесты, предоставляя в качестве входных данных строки, которые изолируют вас от файловой системы.

Существует множество способов изменить код, чтобы тесты могли сделатьон анализируется из строки, а не из файла: один простой способ - сделать объект ConfigParser аргументом функции. Таким образом, вы извне создадите ConfigParser и либо прочитаете его из файла, либоиз строки. Другой вариант - выполнить чтение из вспомогательного метода, который вы можете переопределить в своем тесте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...