欢迎访问宙启技术站
智能推送

CliRunner()的使用技巧和常见问题解答

发布时间:2023-12-24 10:40:19

CliRunner 是 Click 库为了方便测试命令行程序而提供的一个工具类。它用于模拟用户的输入和捕获命令行程序的输出,方便编写测试用例进行自动化测试。

CliRunner 提供了以下常用方法:

1. invoke(command, input=None, env=None, mix_stderr=False, catch_exceptions=True):模拟执行命令行程序。

- command:要执行的命令行程序,可以是一个 Click 命令函数或者一个字符串(与命令行中输入的一样)。

- input:要传递给命令行程序的输入,可以是一个字符串。

- env:模拟的环境变量。

- mix_stderr:是否将标准错误输出合并到标准输出中。

- catch_exceptions:是否捕获命令行程序抛出的异常,并将其作为返回值。

2. invoke_app(app, args=None, input=None, env=None, mix_stderr=False, catch_exceptions=True):模拟执行 Click 的命令行应用。

- app:Click 的命令行应用对象。

- args:命令行参数,可以是一个列表。

- input:要传递给命令行程序的输入,可以是一个字符串。

- env:模拟的环境变量。

- mix_stderr:是否将标准错误输出合并到标准输出中。

- catch_exceptions:是否捕获命令行程序抛出的异常,并将其作为返回值。

3. run(command, input=None, env=None, stdout_capture=False, stderr_capture=False, mix_stderr=False, catch_exceptions=True):同 invoke() 方法,只是多了 stdout_capture 和 stderr_capture 两个参数,用于捕获标准输出和标准错误输出。

下面通过几个例子,演示 CliRunner 的使用技巧和常见问题解答:

### 使用 invoke() 方法执行命令行程序

import click
from click.testing import CliRunner

@click.command()
@click.argument("name")
def hello(name):
    click.echo("Hello, " + name + "!")

runner = CliRunner()
result = runner.invoke(hello, ["Alice"])
print(result.output)  # 输出:Hello, Alice!

result = runner.invoke(hello, ["Bob"], input="Alice
")
print(result.output)  # 输出:Hello, Alice!

### 使用 invoke_app() 方法执行 Click 的命令行应用

import click
from click.testing import CliRunner

@click.command()
@click.argument("name")
def hello(name):
    click.echo("Hello, " + name + "!")

app = click.CommandCollection(sources=[hello])

runner = CliRunner()
result = runner.invoke_app(app, ["hello", "Alice"])
print(result.output)  # 输出:Hello, Alice!

result = runner.invoke_app(app, ["hello", "Bob"], input="Alice
")
print(result.output)  # 输出:Hello, Alice!

### 捕获标准输出和标准错误输出

import click
from click.testing import CliRunner

@click.command()
@click.argument("name")
def hello(name):
    click.echo("Hello, " + name + "!")
    click.echo("This is an error message!", err=True)

runner = CliRunner()
result = runner.run(hello, ["Alice"], stdout_capture=True, stderr_capture=True)
print(result.output)  # 输出:Hello, Alice!

print(result.stderr)  # 输出:This is an error message!

result = runner.run(hello, ["Bob"], mix_stderr=True)
print(result.output)  # 输出:Hello, Bob!
This is an error message!

### 捕获异常

import click
from click.testing import CliRunner

@click.command()
@click.argument("name")
def hello(name):
    if name == "Alice":
        raise click.ClickException("Name cannot be Alice!")

runner = CliRunner()
result = runner.invoke(hello, ["Bob"], catch_exceptions=False)
print(result.exit_code)  # 输出:0
print(result.exception)  # 输出:None

result = runner.invoke(hello, ["Alice"], catch_exceptions=False)
print(result.exit_code)  # 输出:1
print(result.exception)  # 输出:ClickException("Name cannot be Alice!")

这些例子展示了 CliRunner 的使用技巧和常见问题解答,并给出了对应的例子。通过 CliRunner,我们可以方便地编写和运行命令行程序的测试用例,提高代码的质量和稳定性。