Python 测试命令行实用程序

Python 测试命令行实用程序,python,language-agnostic,bash,testing,command-line,Python,Language Agnostic,Bash,Testing,Command Line,我正在寻找一种在用bash或任何其他语言编写的命令行实用程序上运行测试的方法 我想找到一个测试框架,其中包含如下语句 setup: command = 'do_awesome_thing' filename = 'testfile' args = ['--with', 'extra_win', '--file', filename] run_command command args test_output_was_correct assert_outpu

我正在寻找一种在用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,使它有效地不可知语言(或者它自己的语言,取决于你如何看待它);然而,这可能不太理想,因为我的测试技术通常涉及编写生成测试的代码

在谷歌上搜索这个有点困难,因为有很多关于运行测试的实用程序的信息,这和我正在寻找的正好相反


命令--help的输出中嵌入对doctest的支持将是一个额外的好处:)

好吧。。。我们通常做的(也是O.O.语言的奇迹之一)是在实际创建应用程序之前编写应用程序的所有组件。出于测试目的(通常是命令行),每个组件可能都有一种独立的执行方式,这也允许您将每个组件看作完整的程序,并在将来的项目中使用它们。如果您想测试现有程序的完整性。。。嗯,我认为最好的方法是深入了解它是如何工作的,或者更深入地了解:阅读源代码。或者更深入:开发一个机器人来强制测试它:3

对不起,这是我的东西。-.

退房:


它也是合理的doctest可用的。

除了可能存在的任何预打包测试框架之外,但我不知道,我只想指出,expect是一个很棒的工具,对于这种自动化来说,它还没有得到充分利用,特别是如果您想支持多阶段交互,也就是说,不只是发送命令并检查输出,而是用更多的输入响应输出。如果你最终建立了自己的系统,这是值得研究的


还有一个名为pexpect的expect的python重新实现。我不是一个python爱好者,所以我不能告诉你太多关于它们的信息。

我知道这个问题很老,但因为我一直在寻找答案,我想我会为身边的任何人添加我自己的问题

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

我遇到了一个非常类似的问题,结果我自己也遇到了。测试代码如下所示:

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()

这很好地解决了我的问题,但我知道它可能需要更多的工作来使它尽可能健壮(我想到了测试发现)。这可能会有帮助,而且我总是喜欢一个好的拉动请求。

当然。。这是一个很好的做事方式。我收集到您描述的将被称为“单元测试”,而我需要一个工具集来进行“验收测试”或“功能测试”或“集成测试”。这在一定程度上是为了提供一种额外的方法来验证可单元测试的代码,同时也允许对不可单元测试的代码进行某种测试:bash脚本(除非存在-shubder-bash单元测试框架);以不良记录方式运行的专有外部公用设施;或者在一个例程中混合了一系列方面的代码。另外:要使用您的术语,我想我要找的是“bot框架”。我知道您想做的是为使用CLI的程序找到一个通用测试仪?我发现这很难实现,因为一个如此糟糕的节目是不可预测的。如果你面对一个错误的软件,而它的源代码又不可用,那么最好的选择似乎是:尝试搜索类似的程序。或者为什么不呢?在论坛上发布你的问题:]这样可以吗,还是我错过了什么?如果我这样做了,试着更明确地说明你的个人情况。一个机器人,是关于对程序施加暴力的,它可能永远持续,也可能是危险的,因为你不知道它是如何工作的,也不知道它是做什么的。测试总比不测试好。你可能会从我问的一个关于单元测试shell脚本的问题中得到一些有用的信息:@gareth_bowles:cool,谢谢你的链接。如果shunit2与bash兼容,我可能会尝试使用它。
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()