计算测试示例

在前面的例子中,我们只对测试步骤做了【加法计算】这一种处理,

在实际项目中,测试步骤的类型往往有多种,不同的步骤类型,需要不同的方式去执行。

接下来我们实现支持加、减、乘、除这4种类型的的计算测试,来模拟演示不同步骤类型的实现方式

设计用例

这一次,在测试步骤中多了一个层级,用以表示步骤的类型

name: 计算测试
steps:
  - add:  # 加
      num1: 111
      num2: 222
      expected_results: 333

  - subtract: # 减
      num1: 111
      num2: 222
      expected_results: -111

  - multiply : # 乘
      num1: 111
      num2: 222
      expected_results: 222

  - divide: # 除
      num1: 111
      num2: 222
      expected_results: 0.5

为了保持简单,本例不同的步骤类型中内容格式是相同的,但这不是强制要求,你可以为不同的步骤类型定义不同的内容格式、不同的处理方式

实现钩子

由于测试步骤发生了变化,钩子必须更新才正确处理。

在新的钩子实现中,我们需要做到2点:

  1. 判断具体的步骤类型

  2. 根据不同的步骤类型,做出不同的测试动作

def pytest_yaml_run_step(item):
    step = item.current_step  # 从参数值中取出字典格式的测试步骤

    step_type = list(step.keys())[0]  # 从字典的key即为类型
    step_data = list(step.values())[0]  # 从字典的value即为步骤内容

    if set(step_data.keys()) != {'num1', 'num2', 'expected_results'}:
        raise ValueError('用例格式不正确')

    match step_type:  # 根据不同的步骤类型,匹配不同的测试动作
        case 'add':  # 加
            actual_results = step_data['num1'] + step_data['num2']
        case 'subtract':  # 减
            actual_results = step_data['num1'] - step_data['num2']
        case 'multiply':  # 乘
            actual_results = step_data['num1'] * step_data['num2']
        case 'divide':  # 除
            actual_results = step_data['num1'] / step_data['num2']

        case _:
            raise ValueError('无法识别的步骤类型')

    # 对步骤的执行结果进行断言
    assert actual_results == step_data['expected_results']

    return True

执行结果如下:

(.venv) C:\demo\pytest-yaml-demo>pytest
=========================== test session starts ============================

platform win32 -- Python 3.12.0, pytest-8.3.4, pluggy-1.5.0
cachedir: .pytest_cache
rootdir: C:\demo\pytest-yaml-demo
configfile: pytest.ini
plugins: yaml-1.1.0
collected 1 item

test_case.yaml::计算测试 FAILED
================================= FAILURES =================================
_________________________________ 计算测试 ___________________________________

:
Step no: 2
Step Content:
--------------------
multiply:
  num1: 111
  num2: 222
  expected_results: 222
--------------------

C:\demo\pytest-yaml-demo\conftest.py:22: AssertionError
assert 24642 == 222
========================= short test summary info ==========================
FAILED test_case.yaml::计算测试
============================ 1 failed in 0.02s =============================

很明显,这个用例 执行失败了 ,但是失败原因却不直观

这是因为断言写的太过简洁,可以为 assert 提供第二个参数进行断言描述,比如这样:

msg = f'测试步骤: {item.current_step_no},测试类型: {step_type}, 预期结果与实际结果不一致'
assert actual_results == step_data['expected_results'], msg

修改后的执行结果如下:

(.venv) C:\demo\pytest-yaml-demo>pytest
=========================== test session starts ============================
platform win32 -- Python 3.12.0, pytest-8.3.4, pluggy-1.5.0
cachedir: .pytest_cache
rootdir: C:\demo\pytest-yaml-demo
configfile: pytest.ini
plugins: yaml-1.1.0
collected 1 item

test_case.yaml::计算测试 FAILED
================================= FAILURES =================================
_________________________________ 计算测试 ___________________________________

:
Step no: 2
Step Content:
--------------------
multiply:
  num1: 111
  num2: 222
  expected_results: 222
--------------------

C:\demo\pytest-yaml-demo\conftest.py:24: AssertionError
测试步骤: 2,测试类型: multiply, 预期结果与实际结果不一致
assert 24642 == 222
========================= short test summary info ==========================
FAILED test_case.yaml::计算测试
============================ 1 failed in 0.02s =============================

在结果中可以看到更详细的说明“ 测试步骤: 2,测试类型: multiply, 预期结果与实际结果不一致”

小结

至此,便实现了四种不同步骤类型的yaml计算测试,根据需要,你还可以再定义更多的步骤类型 在符合yaml用例基本格式的前提下,steps中的步骤可以写任意内容,只需要钩子函数对其进行处理即可。

简而言之:

  • yaml记录步骤内容

  • 钩子执行步骤内容