什么是脚手架

比如在测试用例运行之前 需要准备测试数据。类似JMeter中的 setUp 线程组,teardown线程组,分别表示用例执行之前 之后的操作。

pytest 内置一些方法可以支持用例运行之前,以及用例执行之后的相关操作,这些操作我们称为 “脚手架”。

使用脚手架

https://docs.pytest.org/en/7.1.x/how-to/fixtures.html

  1. import pytest
  2. @pytest.fixture(scope='function',autouse=True)
  3. def f():
  4. print("每个测试用例运行之前的操作f()")
  5. yield # 固定
  6. print("每个用例运行之后执行的代码f()")
  7. def test_a():
  8. print('现在开始执行 test_a')
  9. def test_b():
  10. print('现在开始执行 test_b')
  • @pytest.fixture(scope=’function’,autouse=True) 这个是pytest 内置的功能
    • scope=’function’ 表示是函数级别 可以控制每个测试函数执行之前以及执行之后的操作。
    • autouse = True 表示可以自动加载
  • 函数中定义 yield 是关键字
    • 执行之前的操作 都放在yield 关键字上面
    • 执行之后的操作 都放在yield 关键字下面。

执行可以看到对应的效果。
image.png

API 应用场景

在做新丰商城的 搜索接口测试过程中,前提条件是需要有个token, 在测试这个单接口的时候。 主要是针对搜索的字段进行测试。
pytest 脚手架 - 图2
这个接口测试的重点是 针对 搜索的关键字进行测试,前提用户已经成功登录并且有token,所以在做这个接口测试之前需要将 token值准备好。
这个场景中就可以使用到 pytest的脚手架功能
testcases/test_xf_each_api.py

  1. '''
  2. 新丰商城 单接口测试
  3. '''
  4. import pytest
  5. from common.utils import generate_phone
  6. import requests
  7. testdata={
  8. "token":""
  9. }
  10. base_url = "http://49.233.108.117:28019"
  11. # 注册,登录使用的是同一个手机号码 定义变量
  12. phone = generate_phone()
  13. #scope="module" 模块级别, 整个python文件运行之前和之后的操作 整个文件运行之前生成1个token
  14. @pytest.fixture(scope="module",autouse=True)
  15. def token():
  16. # 脚手架中注册并登录一个账号
  17. # 注册用户
  18. url = base_url+"/api/v1/user/register"
  19. body_data = {
  20. "loginName": phone,
  21. "password": "123456"
  22. }
  23. # 发送请求
  24. requests.post(url,json=body_data)
  25. # 登录用户
  26. url = base_url + "/api/v1/user/login"
  27. body_data = {
  28. "loginName": phone,
  29. "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
  30. }
  31. r = requests.post(url, json=body_data)
  32. # 设置 token
  33. # 提取变量值 token
  34. testdata["token"] = r.json()["data"]
  35. # 运行之前的所有操作
  36. print("已经成功获取一个token值",r.json()["data"])
  37. yield
  38. search_data=['iphone','小米','华为']
  39. @pytest.mark.parametrize("key",search_data)
  40. def test_search(key):
  41. url = base_url+'/api/v1/search'
  42. header={
  43. "token": testdata["token"]
  44. }
  45. query_data={
  46. "keyword":key
  47. }
  48. # 搜索条件为 iphone
  49. r = requests.get(url, params=query_data, headers=header)
  50. # 断言
  51. # 所有搜索结果中都包含iphone
  52. # 拿到所有的商品信息
  53. allgoods = r.json()["data"]["list"]
  54. # 循环所有商品的时候
  55. for good in allgoods:
  56. # 拿到每个商品的名称
  57. goodname = good["goodsName"]
  58. print('商品的名称', goodname) # 因为返回结果中有大小写字母混合的场景。使用字符串转换大写方法
  59. assert key.upper() in goodname.upper() # upper 将字符串转为大写

运行,可以看到 在这个py 运行之前获取到token值。
image.png
可以发现这个接口中搜索中文 结果匹配并不满意。

总结

pytest中主要支持5种脚手架

  • session 所有测试用例执行前后
  • package 每个包中测试用例执行前后
  • module 每个py文件 测试用例执行前后
  • class 每个类 测试用例执行前后
  • function 每个测试用例 测试用例执行前后

附件

代码
demo.zip

视频

python 参数化.mp4 (1.86GB)