如何测试使用外部命令行工具的软件

时间:2009-05-26 03:38:13

标签: ruby tdd

我正在试图弄清楚如何测试驱动软件启动外部进程,这些进程将文件路径作为输入并在经过漫长的处理后写入输出到stdout或某个文件?在这种情况下编写测试有一些共同的模式吗?很难创建快速执行的测试,可以验证外部工具的正确使用,而无需在测试中启动实际工具并检查结果。

5 个答案:

答案 0 :(得分:5)

您可以记住(http://en.wikipedia.org/wiki/Memoization)外部流程。在Ruby中编写一个包装器,它计算输入文件的md5总和,并根据已知校验和的数据库进行检查。如果匹配1,则复制右侧输出;否则,正常调用该工具。

答案 1 :(得分:3)

直接测试你的界限。在您的情况下,边界是您为了调用外部程序而构造的命令行(您可以通过猴子修补捕获它)。如果你正在将自己粘贴到该程序的标准输出(或通过读取文件处理其结果)这是另一个边界。测试是您的程序是否可以处理“输入”。

答案 2 :(得分:3)

90%的答案是模拟外部命令行工具并验证正确的输入是否在两者之间的分界面处传递给它们。这有助于快速保持测试套件。此外,您不必引入命令行工具,因为它们不是“您正在测试的代码” - 它会导致单元测试因代码更改或命令行为发生某些变化而失败的可能性线路效用。

但似乎你在定义'正确的输入'时遇到了麻烦 - 在这种情况下,使用像Memoization这样的优化(正如Dave建议的那样)可能会给你两全其美。

答案 3 :(得分:2)

假设外部程序经过了充分测试,您应该只测试您的程序是否将正确的数据传递给它们。

答案 4 :(得分:1)

我认为您在单元测试中遇到了一个常见问题,因为正确性取决于集成是否有效,那么单元测试如何帮助您呢?

基本答案是单元测试测试您打算传递给命令行工具的参数实际上是以这种方式传递的,并且您预期返回的结果实际上是按照您打算处理它们的方式处理的

然后有第二级测试,可能会也可能不会自动化(最好是它们,但它确实取决于它是否实用),它们处于调用真实实用程序的功能级别,以便您可以看到你打算传递的内容以及你预期的回归与实际发生的情况相符。

一组测试可以“测试”外部工具(可能运行在不同的时间表上,或者只有在升级这些工具时)才能确定您的假设,传入原始输入并断言你得到了原始输出。这样,如果您升级该工具,您可以捕获可能影响您的任何行为更改。

你必须决定最后一组测试是否值得。这在很大程度上取决于所涉及的工具。