使用日志记录或 return 值而不是打印来测试点击
Testing click with logging or return values instead of print
当我测试点击时,我了解到基本设置如下所示:
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'
但是,如果我使用日志记录而不是打印,我无法捕获输出或检查命令的 return 值。例如:
import click
import logging as log
@click.command()
@click.argument('name')
def hello(name):
log.info('Hello %s!' % name)
return name
我无法在不打印或 click.echo
的情况下检查 return 值是否正确。
有没有一种方法可以检查 return 值或检查使用点击记录的输出?
您可以使用 pytest 中的 caplog
fixture 来捕获日志输出,如下所示:
def test_hello_world(caplog):
runner = CliRunner()
result = runner.invoke(hello, ['Peter'])
assert result.exit_code == 0
assert result.output == ''
assert caplog.messages == ['Hello Peter!']
至于要检查命令处理程序的“return”值,Click 装饰命令不会 return 常规意义上的任何内容。该命令本身使用系统 return 值,该值正在 result.exit_code
.
上进行测试
如果您真的认为需要使用命令处理程序中的 return 值,您可以设置 stand_alone
flag.
当我测试点击时,我了解到基本设置如下所示:
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'
但是,如果我使用日志记录而不是打印,我无法捕获输出或检查命令的 return 值。例如:
import click
import logging as log
@click.command()
@click.argument('name')
def hello(name):
log.info('Hello %s!' % name)
return name
我无法在不打印或 click.echo
的情况下检查 return 值是否正确。
有没有一种方法可以检查 return 值或检查使用点击记录的输出?
您可以使用 pytest 中的 caplog
fixture 来捕获日志输出,如下所示:
def test_hello_world(caplog):
runner = CliRunner()
result = runner.invoke(hello, ['Peter'])
assert result.exit_code == 0
assert result.output == ''
assert caplog.messages == ['Hello Peter!']
至于要检查命令处理程序的“return”值,Click 装饰命令不会 return 常规意义上的任何内容。该命令本身使用系统 return 值,该值正在 result.exit_code
.
如果您真的认为需要使用命令处理程序中的 return 值,您可以设置 stand_alone
flag.