如何测试基于jline的控制台应用程序

时间:2014-05-04 13:32:34

标签: java testing processbuilder jline

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

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

我原本希望使用与此类似的工作流程:

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

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

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

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

1 个答案:

答案 0 :(得分: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测试套件可以找到here