Тестирование TUI

Все пример! Можете посоветовать решение для тестирование TUI приложения? Проект написан Go с использованием gocui (https://github.com/jroimartin/gocui), и проверять только функции на мой взгляд не имеет смысла, необходимо проверить работоспособность самого интерфейса на разных архитектурах.


Ответы (1 шт):

Автор решения: Lifailon

Получилось найти решение, использовать 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)
→ Ссылка