CliRunner()的使用技巧和常见问题解答
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,我们可以方便地编写和运行命令行程序的测试用例,提高代码的质量和稳定性。
