Python中如何使用CliRunner()测试命令行应用
在Python中使用CliRunner()测试命令行应用可以方便地模拟用户输入和检查命令行输出,并能提供测试覆盖率报告。下面是一个示例,演示了如何使用CliRunner()进行命令行应用的测试。
假设我们的命令行应用是一个简单的计算器,可以执行加法、减法、乘法和除法操作。首先,我们创建一个名为calculator.py的文件,包含了我们的命令行应用代码。其内容如下:
import argparse
def add(x, y):
return x + y
def subtract(x, y):
return x - y
def multiply(x, y):
return x * y
def divide(x, y):
return x / y
def main():
parser = argparse.ArgumentParser(description='Simple calculator')
parser.add_argument('operation', choices=['add', 'subtract', 'multiply', 'divide'], help='operation to perform')
parser.add_argument('x', type=float, help='first operand')
parser.add_argument('y', type=float, help='second operand')
args = parser.parse_args()
if args.operation == 'add':
result = add(args.x, args.y)
elif args.operation == 'subtract':
result = subtract(args.x, args.y)
elif args.operation == 'multiply':
result = multiply(args.x, args.y)
elif args.operation == 'divide':
result = divide(args.x, args.y)
print(result)
if __name__ == '__main__':
main()
现在,我们使用CliRunner()测试这个命令行应用。创建一个名为test_calculator.py的文件,包含如下代码:
from click.testing import CliRunner
from calculator import main
def test_add():
runner = CliRunner()
result = runner.invoke(main, ['add', '3', '4'])
assert result.exit_code == 0
assert result.output.strip() == '7'
def test_subtract():
runner = CliRunner()
result = runner.invoke(main, ['subtract', '5', '2'])
assert result.exit_code == 0
assert result.output.strip() == '3'
def test_multiply():
runner = CliRunner()
result = runner.invoke(main, ['multiply', '2', '6'])
assert result.exit_code == 0
assert result.output.strip() == '12'
def test_divide():
runner = CliRunner()
result = runner.invoke(main, ['divide', '10', '2'])
assert result.exit_code == 0
assert result.output.strip() == '5.0'
def test_invalid_operation():
runner = CliRunner()
result = runner.invoke(main, ['invalid', '5', '2'])
assert result.exit_code != 0
assert 'invalid choice' in result.output.lower()
def test_invalid_operand():
runner = CliRunner()
result = runner.invoke(main, ['add', '5', 'a'])
assert result.exit_code != 0
assert 'invalid float value' in result.output.lower()
可以看到,我们通过创建一个CliRunner()对象来模拟命令行输入和验证输出。然后,我们使用runner.invoke(main, args)调用命令行应用,其中main是我们的命令行应用函数,args是一个包含命令行参数的列表。我们可以通过检查result.exit_code和result.output属性来验证应用的行为是否符合预期。
在上述示例中,我们编写了几个测试函数来测试不同的操作和输入情况。例如,test_add()函数测试加法操作的正确性;test_invalid_operand()函数测试当输入的操作数不是合法的浮点数时,应用会返回错误信息。这些测试函数可以通过运行pytest来执行。
要运行测试,需要确保pytest和click库已经安装。可以使用以下命令安装这两个依赖:
pip install pytest click
然后,在终端中执行以下命令开始测试:
pytest test_calculator.py
测试将会运行,并输出结果,告诉你每个测试函数是通过还是失败。此外,如果使用了--cov参数,还会生成测试覆盖率报告,帮助你确定测试覆盖范围是否足够。
这就是使用CliRunner()测试命令行应用的基本步骤。你可以根据自己的需要编写更多的测试用例,并使用其他功能来完善你的测试。希望这个例子能帮助你开始使用CliRunner()进行命令行应用的测试。
