返回介绍

测试 Click 应用程序

发布于 2025-05-06 21:24:12 字数 2561 浏览 0 评论 0 收藏

对于基本测试,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。