我正在寻找一种在用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的东西会使它有效地与语言无关(或者它自己的语言,取决于你如何看待它);但是这可能不太理想,因为我的测试技术通常涉及编写生成测试的代码。
这对谷歌来说有点困难,因为有大量关于运行测试的实用程序的信息,这与我正在寻找的东西相反。
支持command --help
输出中嵌入的doctests将是额外的奖励:)
答案 0 :(得分: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 :(得分:1)
嗯......我们通常做的(以及O.O.语言的奇迹之一)是在实际创建应用程序之前编写应用程序的所有组件。为了测试目的(通常是命令行),每个组件可能都有一个独立的执行方式,这也允许您将它们视为每个组件的完整程序,并在将来的项目中使用它们。如果您想要的是测试现有程序的完整性......那么,我认为最好的方法是深入学习它是如何工作的,甚至更深入的:阅读源代码。甚至更深入:开发一个机器人来强制测试它:3
对不起,这就是我所拥有的.-。
答案 2 :(得分:1)
我知道这个问题已经过时了,但是既然我正在寻找答案,我想我会为其他发生的事情添加自己的答案。
完全免责声明:我提到的项目是我自己的,但它完全免费且开源。
我遇到了一个非常类似的问题,最后滚动了我自己的solution。测试代码如下所示:
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()
这足以让我完成我的问题,但我知道它可以使用更多的工作来使其尽可能健壮(考虑发现测试发现)。它可能会有所帮助,我总是喜欢一个很好的拉动请求。
答案 3 :(得分:0)
除了可能存在但我不知道的任何预先包装的测试框架之外,我只想指出,对于这种自动化来说,期望是一个非常棒且未充分利用的工具,特别是如果你想支持多阶段交互,那就是不仅仅是发送命令并检查输出,而是通过更多输入响应输出。如果你最终建立自己的系统,那值得研究。
还有一个python reimplementation of expect叫做pexpect。也可能有一些直接接口到expect库。我不是一个蟒蛇人,所以我不能告诉你很多关于他们的事。