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

标签 java testing processbuilder jline

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

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

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

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

但是,测试只是卡住。单步执行代码,jline 似乎在 JNI 调用 _getch 时卡住在 Windows 上。我猜问题是因为我从 headless 的 ProcessBuilder 运行 Java,所以没有控制台,这使窗口困惑。根据 Jline 文档设置 -Djline.terminal=jline.UnsupportedTerminal 也无济于事。

我发现了一个讨论 Python pexpect 的话题用于测试(非 Java)readline 应用程序。

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

最佳答案

我放弃了仅使用 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 .

关于java - 如何测试基于 jline 的控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23456860/

相关文章:

android - 将 Android 应用程序分发给 Alpha 测试人员时如何跟踪错误?

Java和系统环境变量

java - 尝试使用 Netbeans ProgressBar 显示长时间运行的任务,但存在依赖项和库问题

java - System.out.println( number1 + "score"+ (number1 + number2) + number1 ) 结果解释(字符串与数字加法运算符)

testing - 我应该继续注册失败吗?

testing - 有没有非常困的分析器教程?

java - 从 Java 启动的子进程使用 waitFor 完成但流未终止

java - 如何在 java 中运行 sh 命令并分配选项

Java,时间,事件

java - HTTP Post 不工作?