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

Python中如何使用CliRunner()测试命令行应用

发布时间:2023-12-24 06:01:04

在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_coderesult.output属性来验证应用的行为是否符合预期。

在上述示例中,我们编写了几个测试函数来测试不同的操作和输入情况。例如,test_add()函数测试加法操作的正确性;test_invalid_operand()函数测试当输入的操作数不是合法的浮点数时,应用会返回错误信息。这些测试函数可以通过运行pytest来执行。

要运行测试,需要确保pytestclick库已经安装。可以使用以下命令安装这两个依赖:

pip install pytest click

然后,在终端中执行以下命令开始测试:

pytest test_calculator.py

测试将会运行,并输出结果,告诉你每个测试函数是通过还是失败。此外,如果使用了--cov参数,还会生成测试覆盖率报告,帮助你确定测试覆盖范围是否足够。

这就是使用CliRunner()测试命令行应用的基本步骤。你可以根据自己的需要编写更多的测试用例,并使用其他功能来完善你的测试。希望这个例子能帮助你开始使用CliRunner()进行命令行应用的测试。