Как протестировать консольное приложение на базе jline
Я пытаюсь протестировать консольное приложение, которое использует jline для обработки взаимодействия с пользователем.
Я запускаю приложение, используя ProcessBuilder, который дает мне доступ к приложениям:
Я ожидал использовать рабочий процесс, подобный этому:
- Запустить приложение
- Читайте вывод, пока не увижу подсказку приложения
>
- Отправить вход для моего теста, например
login
- Читайте вывод, пока не увижу ожидаемый ответ, например
Username:
- и так далее
Однако тест просто зависает. Проходя по коду, кажется, что jline зависает при вызовах JNI _getch в Windows. Я предполагаю, что проблема в том, что я запускаю Java из ProcessBuilder, который безголовый, поэтому нет консоли, и это сбивает с толку Windows. настройка -Djline.terminal=jline.UnsupportedTerminal
в соответствии с Jline документы тоже не помогают.
Я нашел поток, обсуждающий Python pexpect для тестирования (не Java) приложения readline.
Вопрос: как я могу протестировать приложение на базе jline, используя только инструменты Java?
1 ответ
Я перестал пытаться тестировать только с помощью инструментов Java и перешел к использованию библиотеки Python pexpect для запуска консольного приложения. Тесты были интегрированы в сборку maven, но для их запуска требовался хост *nix:
import unittest
import pexpect
import os
import signal
import subprocess
import urllib
import urllib2
import json
from wiremock import WiremockClient
class TestInteractive(unittest.TestCase):
cli_cmd = "java -jar " + os.environ["CLI_JAR"]
# ... code omitted for brevity
def test_interactive_mode_username_and_password_sent_to_server(self):
child = pexpect.spawn(TestInteractive.cli_cmd, timeout=10)
child.expect ('Username: ')
child.sendline ('1234')
child.expect ('Password: ')
child.sendline ('abcd')
child.expect ('Successfully authenticated')
child.expect ('stratos> ')
child.sendline ('exit')
child.expect (pexpect.EOF)
# CLI sends GET request to mock server url /stratos/admin/coookie
self.assertEqual(self.wiremock.get_cookie_auth_header(), "1234:abcd")
# ... code omitted for brevity
if __name__ == '__main__':
try:
unittest.main()
# handle CTRL-C
except KeyboardInterrupt:
# shut down wiremock
TestInteractive.wiremock.stop()
exit(1)
Полный набор тестов CLI для проекта, над которым я работал, можно найти здесь.