1

我正在尝试测试一个使用jline处理与用户交互的控制台应用程序。

我正在使用ProcessBuilder启动应用程序,这使我可以访问应用程序的:

我期待使用与此类似的工作流程:

  • 开始申请
  • 阅读输出,直到我看到应用程序的提示>
  • 为我的测试用例发送输入,例如login
  • 读取输出,直到我看到预期的响应,例如Username:
  • 等等

但是,测试只是冻结了。单步执行代码,似乎jline在 Windows 上对 _getch 的 JNI 调用时冻结了。我猜这个问题是因为我从 ProcessBuilder 运行 Java,它是无头的,所以没有控制台,这会混淆窗口。根据 Jline 文档进行设置-Djline.terminal=jline.UnsupportedTerminal也无济于事。

我找到了一个讨论Python pexpect以测试(非 java)readline 应用程序的线程。

问题:如何仅使用 java 工具测试基于 jline 的应用程序?

4

1 回答 1

0

我放弃了尝试仅使用 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 测试套件可以在这里找到。

于 2015-02-17T22:49:48.040 回答