【发布时间】:2016-05-18 17:02:56
【问题描述】:
我正在致力于在 bash 中自动化一个交互式命令行 Java 程序,以验证该程序是否为输入生成正确的输出(基本上是 bash 中的穷人单元测试)。
例如,如果我有一个 java 程序要求用户输入他们的全名,然后只输出他们的名字,它应该如下所示:
Enter your name: John Doe
John
用户输入“John Doe”的位置。
运行它的简单 bash 命令可能如下所示:
OUTPUT=`echo "John Doe" | java NameReader`
或
OUTPUT=`java NameReader <<< "John Doe"`
这两者的问题在于 $OUTPUT 现在包含以下内容:
Enter your name: John
因为发送到标准输入的文本(及其伴随的换行符)没有像我们在控制台中看到的那样在程序的输出中重现。
理想情况下,$OUTPUT 将包含以下内容:
Enter your name: John Doe
John
但我可以忍受这个:
Enter your name:
John
(输入被完全省略,但输出在新的一行,正如预期的那样)
在 bash 中是否有一种方法(不改变底层的 java 程序)来获取正在通过管道传输到标准输入的文本,以便在 java 程序读取它的“时间”时也通过管道传输到标准输出,所以完整的交互式会话是抓到了吗?
(还有一点注意:一些搜索表明 spawn/expect 命令可能会有所帮助,但运行该命令的系统似乎没有它们可用)
【问题讨论】:
-
那么当你说
echo "John Doe" | java NameReader(没有反引号)时,你在控制台上看到了什么? -
@n.m.,我看到了同样的结果:
Enter your name: John(都在一行上) -
您希望您的脚本向您展示其他内容,但具体基于什么?它应该如何知道在哪里插入换行符?
-
我希望输出与我以交互方式使用程序时所看到的完全相同,其中包括我在控制台上输入的内容(当我点击“输入”时,其中包括一个换行符)。
-
交互式?好的。您以交互方式启动程序。你怎么知道它问了你一个问题,是时候开始输入你的答案了?您希望脚本复制该逻辑,对吗?现在回答同样的问题,但假设程序每分钟打印一个字符。