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

Ruby 如何测试使用外部命令行工具的软件,ruby,tdd,Ruby,Tdd,我试图弄明白如何测试驱动软件,该软件启动以文件路径作为输入的外部进程,并在长时间处理stdout或某个文件后写入输出?在这种情况下,写作测试是否有一些共同的模式?如果不在测试中启动实际工具并检查结果,就很难创建能够验证外部工具正确使用的快速执行测试。假设外部程序经过良好测试,您应该测试您的程序是否向其传递了正确的数据。假设外部程序经过良好测试,您应该测试您的程序是否正在向他们传递正确的数据。您可以记忆()外部进程。用Ruby编写一个包装器,计算输入文件的md5和,并对照已知校验和的数据库进行检查

我试图弄明白如何测试驱动软件,该软件启动以文件路径作为输入的外部进程,并在长时间处理stdout或某个文件后写入输出?在这种情况下,写作测试是否有一些共同的模式?如果不在测试中启动实际工具并检查结果,就很难创建能够验证外部工具正确使用的快速执行测试。

假设外部程序经过良好测试,您应该测试您的程序是否向其传递了正确的数据。

假设外部程序经过良好测试,您应该测试您的程序是否正在向他们传递正确的数据。

您可以记忆()外部进程。用Ruby编写一个包装器,计算输入文件的md5和,并对照已知校验和的数据库进行检查。如果它与一个匹配,则复制右输出;否则,请正常调用该工具。

您可以记忆()外部进程。用Ruby编写一个包装器,计算输入文件的md5和,并对照已知校验和的数据库进行检查。如果它与一个匹配,则复制右输出;否则,请正常调用该工具。

测试到您的边界。在您的例子中,边界是您构造用来调用外部程序的命令行(您可以通过monkey补丁捕获)。如果你把自己粘在程序的标准输出上(或者通过读取文件来处理结果),那就是另一个界限。测试是你的程序是否能处理“输入”

测试到您的边界。在您的例子中,边界是您构造用来调用外部程序的命令行(您可以通过monkey补丁捕获)。如果你把自己粘在程序的标准输出上(或者通过读取文件来处理结果),那就是另一个界限。测试是你的程序是否能处理“输入”

我认为您正陷入单元测试的一个常见问题,因为正确性实际上取决于集成是否有效,那么单元测试如何帮助您呢

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

然后是第二级测试,它可能是自动化的,也可能不是自动化的(最好是自动化的,但这取决于它是否可行),这是在功能级别上调用真正的实用程序,以便您可以看到您打算通过的测试和您预期返回的测试与实际发生的测试相匹配

一组测试“测试”外部工具(可能按照不同的时间表运行,或者仅在升级这些工具时运行)也没有什么错,这些工具建立了您的假设,传递了原始输入并断言您得到了原始输出。这样,如果您升级该工具,您可以捕获任何可能影响您的行为更改


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

我认为您正陷入单元测试的一个常见问题,因为正确性实际上取决于集成是否有效,那么单元测试如何帮助您

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

然后是第二级测试,它可能是自动化的,也可能不是自动化的(最好是自动化的,但这取决于它是否可行),这是在功能级别上调用真正的实用程序,以便您可以看到您打算通过的测试和您预期返回的测试与实际发生的测试相匹配

一组测试“测试”外部工具(可能按照不同的时间表运行,或者仅在升级这些工具时运行)也没有什么错,这些工具建立了您的假设,传递了原始输入并断言您得到了原始输出。这样,如果您升级该工具,您可以捕获任何可能影响您的行为更改


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

90%的案例答案是模拟外部命令行工具,并验证是否在两者之间的划分接口处向它们传递了正确的输入。这有助于保持测试套件的快速性。此外,您不必引入命令行工具,因为它们不是“您的待测代码”——这可能会导致单元测试失败,原因可能是代码更改或命令行实用程序中的某些行为更改


但似乎您在定义“正确的输入”时遇到了问题——在这种情况下,使用诸如memorization之类的优化(如Dave所建议的)这两个方面都可能给您带来好处。

90%的案例答案是模拟外部命令行工具,并验证是否在两者之间的划分界面上向它们传递了正确的输入。这有助于保持测试套件的快速性。此外,您不必引入命令行工具,因为它们不是“您的待测代码”——这可能会导致单元测试失败,原因可能是代码更改或命令行实用程序中的某些行为更改


但是,似乎您在定义“正确的输入”时遇到了问题——在这种情况下,使用诸如Memorization(如Dave所建议的)之类的优化可能会让您两全其美。

如果不从工具本身获取数据的结果,就很难确保数据是正确的。对于使用相关工具的相同输入,结果总是相同的,因此检查传递的是什么数据