ИБ разработка фреймворка часть 2

Продолжение поста

Предыстория: Когда мне поставили задачу создать фреймворк для автотестирования клиентского «Агента» на Windows, первая проблема, которая встала передо мной — удаленное управление машиной. Агент — десктопное приложение. Я не мог просто дернуть API, мне нужно было физически установить приложение.

Выбор пал на pywinrm. Для работы с Windows иеальный инструмент, для выполнения PowerShell команд на удаленной Windows-машине из Python тестов, проверять реестр, перезапускать службы на машине пользователя.

Через месяц меня попросили поддержать не только установку, но и GUI-режим (чтобы тестировать окно агента через pywinauto). Пришлось написать второй контроллер, который отличался только логикой инициализации. Тесты ломались, потому что я иногда путал, какой контроллер для какого теста использовать. Фреймворк становился жестким и нерасширяемым.

Этап 2. Рождение «авторегистации» классов Поняв, что так жить нельзя, я решил превратить контроллеры в плагины. В Python есть магический метод __init_subclass__. Если написать базовый класс BaseController, а в нем задать словарь CONTROLLER_REGISTRY = {}, то каждый новый контроллер будет автоматически добавлять себя в этот словарь при создании. Скриншот 1

Этап 3. Гибкость, к которой я стремился Теперь в самих автотестах я перестал писать import ConsoleController. Вместо этого я вызываю фабрику, которая достает нужный контроллер из реестра по имени: скриншот 2

Итог этой истории: Авторегистрация спасла меня от бесконечных if-elif. Теперь, если завтра появится третий вид управления агентом (например, через SSH, если агент портируют на Linux), я просто создам новый класс LinuxController, добавлю его в код, и все существующие тесты заработают с ним без правок. Они просто получат строку “linux” из конфигурации.

Продолжение следует… :)

Все делаю через WinRM - об этом будет отдельный пост

#qa #python #qaсетка

ИБ разработка фреймворка часть 2 | Сетка — социальная сеть от hh.ru ИБ разработка фреймворка часть 2 | Сетка — социальная сеть от hh.ru