测试命令行实用工具

11

我正在寻找一种在命令行上运行Bash或任何其他语言编写的实用程序的测试方法。

我想找到一个测试框架,具有像以下这样的语句

setup:
    command = 'do_awesome_thing'
    filename = 'testfile'
    args = ['--with', 'extra_win', '--file', filename]
    run_command command args

test_output_was_correct
    assert_output_was 'Creating awesome file "' + filename + '" with extra win.'

test_file_contains_extra_win
    assert_file_contains filename 'extra win'

假定基础测试用例将设置一个临时目录来运行这些命令,并在拆卸时删除该目录。

我更喜欢使用Python,因为我比其他可能的编程语言更熟悉它。

我想象中可能有一些使用DSL的东西,使其有效地与任何编程语言无关(或者根据您的看法是自己的语言); 然而,这可能不是最理想的,因为我的测试技术通常涉及编写生成测试的代码。

这有点难以在Google上搜索,因为有很多关于运行测试的实用程序的信息,这有点相反于我要找的。

支持嵌入在 command --help 输出中的 doctest 将是额外的奖励 :)


1
你可能会从我在单元测试shell脚本方面提出的问题中获得一些有用的信息:https://dev59.com/fXNA5IYBdhLWcg3wa9Gp - gareth_bowles
@gareth_bowles:酷,感谢链接。如果它与Bash兼容的话,我可能会尝试使用shunit2。 - intuited
4个回答

13

看看ScriptTest

from scripttest import TestFileEnvironment

env = TestFileEnvironment('./scratch')

def test_script():
    env.reset()
    result = env.run('do_awesome_thing testfile --with extra_win --file %s' % filename)
    # or use a list like ['do_awesome_thing', 'testfile', ...]
    assert result.stdout.startswith('Creating awesome file')
    assert filename in result.files_created

它也相当适用于doctest。


1

我知道这个问题很旧,但因为我正在寻找答案,所以我想为任何其他遇到相同问题的人添加我的答案。

完整声明:我提到的项目是我自己的,但它完全免费且开源。

我遇到了一个非常类似的问题,最终决定自己编写解决方案。测试代码将如下所示:

from CLITest import CLITest, TestSuite
from subprocess import CalledProcessError


class TestEchoPrintsToScreen(CLITest):
    '''Tests whether the string passed in is the string
    passed out'''

    def test_output_contains_input(self):
        self.assertNotIsInstance(self.output, CalledProcessError)
        self.assertIn("test", self.output)

    def test_ouput_equals_input(self):
        self.assertNotIsInstance(self.output, CalledProcessError)
        self.assertEqual("test", self.output)

suite = TestSuite()

suite.add_test(TestEchoPrintsToScreen("echo test"))

suite.run_tests()

这对我解决问题很有帮助,但我知道它还需要进一步改进以使其尽可能健壮(测试发现是个问题)。这可能会有所帮助,而且我总是喜欢一个好的拉取请求。

1

嗯...我们通常做的事情(也是面向对象语言的奇妙之一)是在实际制作应用程序之前编写所有组件。每个组件都可能有独立的执行方式,供测试目的使用(通常是命令行),这也使您可以将它们视为单独的完整程序,并在未来的项目中使用它们。如果您想测试现有程序的完整性...嗯,我认为最好的方法是深入了解其工作原理,甚至更深入:阅读源代码。或者更深入:开发一个机器人来强制测试它 :3

抱歉,这就是我所拥有的.-.


当然,那是一个很好的做事方式。我了解你所描述的可能被称为“单元测试”,而我想要一个工具集来进行“验收测试”、“功能测试”或“集成测试”。这部分是为了提供一种额外的验证可进行单元测试的代码的手段,也为了允许对不可进行单元测试的代码进行某种形式的测试:bash脚本(除非存在——令人发抖的——bash单元测试框架);行为文档不良的专有外部实用程序;或者将各种方面混合在单个例程中的代码。 - intuited
另外,为了与您的术语保持一致,我想我正在寻找一个“机器人框架”。 - intuited
我理解你想做的是找一个通用的CLI程序测试工具?我觉得这很难实现,因为文档不好的程序是不可预测的。如果你遇到了一个足够糟糕的软件,而且它的源代码也不可用,最好的选择似乎是:尝试寻找类似的程序。或者为什么不在论坛上发布你的问题呢?如果我有所遗漏,请详细说明你的个人情况。 - Daniel Rodriguez MSFT
一个机器人,就是通过对程序进行暴力破解来实现的,这可能会持续很长时间,并且也可能很危险,因为你不确定它是如何工作或者它确切地做了什么。 - Daniel Rodriguez MSFT
测试总比没有测试好。 - Ian Bicking

0

除了我不知道的任何预打包的测试框架之外,我只想指出 expect 对于这种自动化工具非常棒且被低估,特别是如果你想要支持多阶段交互。这意味着不仅仅发送命令并检查输出,还需要根据输出做出更多输入响应。如果你最终要构建自己的系统,这个工具值得一试。

还有一个称为 pexpect 的 Python 实现版本。可能也有一些直接接口可用于 expect 库。我不是 Python 方面的专家,所以对它们的情况了解有限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接