Вопрос или проблема
(Я имею в виду тест-драйверы (программное обеспечение), а не тестирование драйвера устройства.)
Цель:
Тестировать любые командные/GUI программы на уровне процессов на локальной машине. (поддержка или масштабирование в облаке не требуется)
Что-то вроде Selenium
или TestCafe
в веб-тестировании, но для нативных программ.
Случаи использования:
- Запуск неинтерактивной командной программы с аргументами.
- Проверка кода выхода/сигнала на успешность.
- Фильтрация stdout/stderr для определения успеха теста.
- Чтение выходных файлов для определения успеха теста.
- Запуск интерактивной GUI программы с аргументами и доменным сокетом fd.
- Ожидание (проверка) статуса путем чтения живого потока stdout/stderr и/или чтения через IPC.
- Отправка событий оконной системы и/или пакетов IPC для управления её поведением.
- Проверка выводов, как пункт 1.
- Linux в первую очередь. Поддержка Windows желательна, или нужно искать другой фреймворк.
- Нет сложных зависимостей между тестами, если можно управлять их последовательным или параллельным выполнением (на уровне пакетов тестов или отдельных запусков).
Ожидаемые функции на Linux:
- Запуск любой программы и получение кода выхода/сигнала/stdout и других файлов.
- Запуск или выполнение кода для подготовки теста и очистки/проверки.
- Получение в реальном времени вывода stdout/stderr запущенной программы.
- Двусторонняя связь с запущенной программой через пакетный нативный IPC (например, AF_UNIX SOCK_DGRAM).
- Отправка событий оконной системы (x11, wayland) запущенной программе как ввода.
- Опционально поддержка Windows (с IPC, win32 WM/события ввода), или поиск другого фреймворка.
Альтернатива
Найти кроссплатформенный фреймворк для работы с подпроцессами, чтобы обрабатывать сложные детали подпроцессов, TTY и IPC. Так чтобы я мог легко построить тест-драйвер на его основе.
Фреймворки рабочих процессов, такие как chromium recipe-py
, кажутся слишком запутанными (и плохо документированными) для использования в случае тест-драйвера.
Ответ или решение
Обзор
Создание многофункционального тестового драйвера для нативных программ на Linux с возможностью расширения на Windows — задача, требующая тщательного подхода к процессам, сигналам, вводу-выводу и обработке событий. Рассмотрим подходящие фреймворки и инструменты для достижения этих целей.
Рекомендации для Linux
-
Автоматизация процессов с помощью Python:
Использование Python для автоматизации процессов широко распространено благодаря его мощным библиотекам:- subprocess: предоставляет интерфейс для запуска программ и взаимодействия с их вводом-выводом и кодами выхода.
- pyautogui: полезна для симуляции событий взаимодействия с окном на графическом уровне.
- PyInvoke: для организации задач автоматизации и управления процессами.
-
IPC и обработка сигналов:
Для межпроцессного взаимодействия стоит рассмотреть использование UNIX-сокетов, что поддерживается такими Python-библиотеками, как socket (для работы сAF_UNIX SOCK_DGRAM
). -
Обработка оконных событий:
Для отправки событий оконной системы (например, X11, Wayland) можно использовать:- xlib: через Python можно применять библиотеку python-xlib для управления событиями X11.
- Для Wayland — изучить возможности использования wlroots или подобного стека через Python.
Возможности расширения на Windows
Для Windows можно дополнительно рассмотреть:
- PyWin32: предоставляет доступ к API Win32, включая управление окнами и отправку событий.
- pywinauto: для автоматизации взаимодействия с GUI на Windows.
Альтернативные решения
Для создания кросс-платформенных тестовых драйверов, handle сложные детали работы с subprocess, TTY и IPC можно использовать:
- Node.js и библиотека
child_process
: для запуска subprocess и взаимодействия с ними. - Nim с пакетами, такими как
osproc
, который обеспечивает управление subprocess с кросс-платформенной поддержкой сложной логики.
Заключение
Для успешного тестирования нативных программ на уровне процессов важно использовать правильные инструменты для управления subprocess и взаимодействия с графическими интерфейсами. Рассмотренные решения обеспечивают гибкость и масштабируемость, что позволяет эффективно тестировать cmdline и GUI программы. Opтимальная комбинация инструментов поможет построить систему тестирования, соответствующую вашим требованиям на Linux и, потенциально, Windows.