Тестирование TUI
Все пример! Можете посоветовать решение для тестирование TUI приложения? Проект написан Go с использованием gocui (https://github.com/jroimartin/gocui), и проверять только функции на мой взгляд не имеет смысла, необходимо проверить работоспособность самого интерфейса на разных архитектурах.
Ответы (1 шт):
Получилось найти решение, использовать tmux и bash. Вполне себе рабочая схема для проверки запуска и базовых функций, но не для покрытия кода и тем более производительности.
Сразу могу посоветовать expect
в связке с языком TCL
, больше подходит для таких задач и способен завершать тест как только находит соответствия или выходить с ошибкой по timeout. Но заметил одну проблему, он не способен находить несколько слов разделенных пробелом построчно, а если уж считывать весь вывод, то лучше использовать bash.
Приведу пример:
#!/usr/bin/expect
set timeout 5
spawn go run main.go
after 2000
send "lastlog"
send "\t\t"
send "\r"
after 2000
expect {
-re ".*root\s.*" {
puts "Test Passed"
exp_exit 0
}
timeout {
puts "Test Failed"
exp_exit 1
}
}
expect eof
Это решается в bash
так:
#!/bin/bash
tmux new-session -d -s test-session "go run main.go"
sleep 5
tmux send-keys -t test-session "lastlog" # передаем текст
tmux send-keys -t test-session "$(echo -e '\t\t')" # передаем "Tab" x2
tmux send-keys -t test-session "$(echo -e '\x1b[C')" # передаем нажатие "right"
sleep 5
tmux send-keys -t test-session "$(echo -e '\r')" # передаем "Enter"
sleep 5
output=$(tmux capture-pane -p) # читаем вывод терминала
# Проверяем вывод:
if echo "$output" | grep -q "First line" && echo "$output" | grep -q "Second line"; then
echo "✔ Test read file: Passed"
else
echo "❌ Test read file: Failed"
exitCode=2
fi
tmux kill-session -t test-session # завершаем сессию, лучше через trap (like finally)