文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
测试 Click 应用程序
对于基本测试,Click 提供 click.testing
模块,它提供测试功能,帮助您调用命令行应用程序并检查其行为。
这些工具真的应该只用于测试,因为它们为了简单而改变了整个解释器的状态,并且不以任何方式是线程安全的!
基本测试
测试 Click 应用程序的基本功能是 CliRunner
它可以作为命令行脚本调用命令。这个 CliRunner.invoke()
方法单独运行命令行脚本,并将输出捕获为字节和二进制数据。
返回值为 Result
对象,其中附加了捕获的输出数据、退出代码和可选异常。
例子::
import click from click.testing import CliRunner def test_hello_world(): @click.command() @click.argument('name') def hello(name): click.echo('Hello %s!' % name) runner = CliRunner() result = runner.invoke(hello, ['Peter']) assert result.exit_code == 0 assert result.output == 'Hello Peter!\n'
对于子命令测试,必须在 args 参数 CliRunner.invoke()
方法。
例子::
import click from click.testing import CliRunner def test_sync(): @click.group() @click.option('--debug/--no-debug', default=False) def cli(debug): click.echo('Debug mode is %s' % ('on' if debug else 'off')) @cli.command() def sync(): click.echo('Syncing') runner = CliRunner() result = runner.invoke(cli, ['--debug', 'sync']) assert result.exit_code == 0 assert 'Debug mode is on' in result.output assert 'Syncing' in result.output
传递给的其他关键字参数 .invoke()
将用于构造初始上下文对象。例如,如果要针对固定的终端宽度运行测试,可以使用以下内容:
runner = CliRunner() result = runner.invoke(cli, ['--debug', 'sync'], terminal_width=60)
文件系统隔离
对于要与文件系统一起操作的基本命令行工具, CliRunner.isolated_filesystem()
方法非常有用,它设置一个空文件夹并将当前工作目录更改为。
例子::
import click from click.testing import CliRunner def test_cat(): @click.command() @click.argument('f', type=click.File()) def cat(f): click.echo(f.read()) runner = CliRunner() with runner.isolated_filesystem(): with open('hello.txt', 'w') as f: f.write('Hello World!') result = runner.invoke(cat, ['hello.txt']) assert result.exit_code == 0 assert result.output == 'Hello World!\n'
输入流
测试包装器还可以用于为输入流(stdin)提供输入数据。这对于测试提示非常有用,例如:
import click from click.testing import CliRunner def test_prompts(): @click.command() @click.option('--foo', prompt=True) def test(foo): click.echo('foo=%s' % foo) runner = CliRunner() result = runner.invoke(test, input='wau wau\n') assert not result.exception assert result.output == 'Foo: wau wau\nfoo=wau wau\n'
请注意,将模拟提示,以便它们也将输入数据写入输出流。如果需要隐藏输入,那么显然不会发生这种情况。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论