测试 Click 应用程序 — Click 文档
来自菜鸟教程
Click/docs/7.x/testing
测试点击应用程序
对于基本测试,Click 提供了 click.testing
模块,该模块提供了帮助您调用命令行应用程序并检查其行为的测试功能。
这些工具真的应该只用于测试,因为为了简单起见,它们改变了整个解释器的状态,并且在任何情况下都不是线程安全的!
基本测试
测试 Click 应用程序的基本功能是 CliRunner,它可以将命令作为命令行脚本调用。 CliRunner.invoke() 方法单独运行命令行脚本,并将输出捕获为字节和二进制数据。
返回值是一个 Result 对象,其中包含捕获的输出数据、退出代码和可选的异常:
import click
@click.command()
@click.argument('name')
def hello(name):
click.echo('Hello %s!' % name)
from click.testing import CliRunner
from hello import hello
def test_hello_world():
runner = CliRunner()
result = runner.invoke(hello, ['Peter'])
assert result.exit_code == 0
assert result.output == 'Hello Peter!\n'
对于子命令测试,必须在 CliRunner.invoke() 方法的 args 参数中指定子命令名称:
import click
@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')
from click.testing import CliRunner
from sync import cli
def test_sync():
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()
的其他关键字参数将用于构造初始 Context 对象。 例如,如果您想针对固定的终端宽度运行您的测试,您可以使用以下命令:
runner = CliRunner()
result = runner.invoke(cli, ['--debug', 'sync'], terminal_width=60)
文件系统隔离
对于具有文件系统操作的基本命令行工具,CliRunner.isolated_filesystem() 方法可用于将当前工作目录设置为新的空文件夹。
import click
@click.command()
@click.argument('f', type=click.File())
def cat(f):
click.echo(f.read())
from click.testing import CliRunner
from cat import cat
def test_cat():
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
@click.command()
@click.option('--foo', prompt=True)
def prompt(foo):
click.echo('foo=%s' % foo)
from click.testing import CliRunner
from prompt import prompt
def test_prompts():
runner = CliRunner()
result = runner.invoke(prompt, input='wau wau\n')
assert not result.exception
assert result.output == 'Foo: wau wau\nfoo=wau wau\n'
请注意,将模拟提示,以便它们也将输入数据写入输出流。 如果需要隐藏输入,那么这显然不会发生。