测试 Click 应用程序 — Click 文档

来自菜鸟教程
Click/docs/6.x/testing
跳转至:导航、​搜索

测试点击应用程序

对于基本测试,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'

对于子命令测试,必须在 CliRunner.invoke() 方法的 args 参数中指定子命令名称。

例子:

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

文件系统隔离

对于想要操作文件系统的基本命令行工具,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'

请注意,将模拟提示,以便它们也将输入数据写入输出流。 如果需要隐藏输入,那么这显然不会发生。