В прошлой части мы сделали exp файл, который бы запускал наше интерактивное консольное приложение и взаимодействовал с ним.
В этой части мы напишем Go test, который будет при помощи cmd.Exec запускать exp файл, ждать ответа и делать какие-либо assertions.
Пример простого теста, который бы запускал наш expect файл и делал проверки ниже:
package main import ( "os/exec" "testing" "github.com/stretchr/testify/assert" ) func TestCliInteractive(t *testing.T) { output, err := exec.Command("./exp.sh").CombinedOutput() t.Logf("exp.sh output:\n----\n %s", string(output)) assert.NoError(t, err) }
При запуске теста мы получим примерно следующий вывод:
=== RUN TestCliInteractive main_test.go:12: exp.sh output: ---- spawn ./survey ? What is your name? ? What is your name? A? What is your name? A ? Choose a color: [Use arrows to move, type to filter] > red blue green ? Choose a color: red ? How old are you? ? How old are you? 2? How old are you? 21? How old are you? 21 A chose red. --- PASS: TestCliInteractive (0.04s) PASS
В тесте мы можем добавить дополнительные проверки, например проверить что наше приложение создало файл или сделало какое-то дополнительное действие.
Очень важно понимать что при обновлении приложения нам нужно также пересоздать expect файл, иначе expect тест никогда не завершится.
Также важно установить таймаут на выполнение таких интеграционных тестов, допустим при запуске теста:
go test -timeout 5s ./...
Тогда в случае превышения времени тайм аута наш тест аварийно завершится:
panic: test timed out after 5s goroutine 8 [running]: