pytest介绍

pytest是python的第三方的单元测试框架。python自带的单元测试框架 unittest。
https://docs.pytest.org/en/6.2.x/

安装pytest

  1. pip install pytest

基本使用

修改上次接口代码
page/useraction.py 文件中修改user_register方法,添加 return返回值。

  1. class UserAction:
  2. def user_register(self):
  3. """
  4. 注册用户
  5. :return:
  6. """
  7. url = BaseConfig.BASEURL+"api/v1/user/register"
  8. body_data = {
  9. "loginName": BaseConfig.PHONE, # 通过调用函数 生成手机号码
  10. "password": "123456"
  11. }
  12. print(f'现在进行注册:用户名{BaseConfig.PHONE},密码为123456')
  13. # 发送 json 格式 post请求
  14. r = requests.post(url, json=body_data)
  15. # 状态码
  16. # print(r.status_code)
  17. # print(r.json())
  18. # 将结果返回出去
  19. return r

编写测试用例。
新建 testcases python包。所有的测试用例都放在 testcases 下

testcases/test_demo.py 编写测试注册的测试用例

  1. """
  2. 编写pytest相关的测试用例
  3. pytest单元测试用例 函数名必须以 test_ 开头
  4. """
  5. from page.useraction import UserAction
  6. def test_user_register():
  7. """
  8. 测试注册接口
  9. :return:
  10. """
  11. user = UserAction()
  12. # 拿到服务器返回的结果
  13. r = user.user_register()
  14. # 添加断言 预期结果
  15. # 状态码为200
  16. assert r.status_code == 200
  17. # 期望注册成功
  18. # 对服务器返回结果进行断言
  19. print(r.json())
  20. assert r.json()["resultCode"] == 200
  21. assert r.json()["message"] == "success"

在自动化测试用例中,每个用例都要添加对应的断言。断言相当于我们在手工测试过程中预期结果和实际结果的对比。

pytest的运行

在命令行模式下,执行

  1. pytest testcases\test_demo.py -s -v

image.png
注意在执行的时候 需要使用到相对路径。

  • -s 代码中有print() 的时候可以打印出来
  • -v 显示详细执行情况。

比如上面的代码中断言部分没有通过,就会报错。
image.png
pytest 会把具体的错误信息显示出来。

如果用例都通过。会显示执行的函数名
image.png


完善测试用例

修改文件
page/useraction.py

  1. """
  2. 用户相关的操作
  3. """
  4. from config.baseconfig import BaseConfig
  5. import requests
  6. import hashlib
  7. class UserAction:
  8. def user_register(self):
  9. """
  10. 注册用户
  11. :return:
  12. """
  13. url = BaseConfig.BASEURL+"api/v1/user/register"
  14. body_data = {
  15. "loginName": BaseConfig.PHONE, # 通过调用函数 生成手机号码
  16. "password": "123456"
  17. }
  18. # print(f'现在进行注册:用户名{BaseConfig.PHONE},密码为123456')
  19. # 发送 json 格式 post请求
  20. r = requests.post(url, json=body_data)
  21. # 状态码
  22. # print(r.status_code)
  23. # print(r.json())
  24. # 将结果返回出去
  25. return r
  26. def user_login(self):
  27. """
  28. 用户登录
  29. :return:
  30. """
  31. passwd = hashlib.md5('123456'.encode()).hexdigest()
  32. url = f"{BaseConfig.BASEURL}api/v1/user/login"
  33. body_data = {
  34. "loginName": BaseConfig.PHONE,
  35. "passwordMd5": passwd # 使用md5 加密之后的密文进行登录
  36. }
  37. # print(f'现在进行登录: 用户名为 {BaseConfig.PHONE},加密之后的密码 {passwd}')
  38. r = requests.post(url, json=body_data)
  39. # print(r.status_code)
  40. # print(r.json())
  41. # print("登录成功的token值:", r.json()["data"])
  42. # 将登录成功的token 值更新到类变量中
  43. BaseConfig.TOKEN = r.json()['data']
  44. return r
  45. def user_search(self):
  46. """
  47. 搜索商品
  48. :return:
  49. """
  50. url = "http://49.233.108.117:28019/api/v1/search"
  51. qury_data = {
  52. "keyword": "iphone"
  53. }
  54. header = {
  55. # 使用类变量 获取最新的token值
  56. "token": BaseConfig.TOKEN
  57. }
  58. print(f'现在搜索商品,使用信息头: {header}')
  59. r = requests.get(url, params=qury_data, headers=header)
  60. print('搜索结果', r.json())
  61. return r

编写测试用例
testcases/test_demo.py

  1. """
  2. 编写pytest相关的测试用例
  3. pytest单元测试用例 函数名必须以 test_ 开头
  4. """
  5. from page.useraction import UserAction
  6. user = UserAction()
  7. def test_user_register():
  8. """
  9. 测试注册接口
  10. :return:
  11. """
  12. # 拿到服务器返回的结果
  13. r = user.user_register()
  14. # 添加断言 预期结果
  15. # 状态码为200
  16. assert r.status_code == 200
  17. # 期望注册成功
  18. # 对服务器返回结果进行断言
  19. print(r.json())
  20. assert r.json()["resultCode"] == 200
  21. assert r.json()["message"] == "SUCCESS"
  22. def test_login():
  23. r = user.user_login()
  24. assert r.status_code == 200
  25. assert r.json()["resultCode"] == 200
  26. assert r.json()["message"] == "SUCCESS"

运行

  1. pytest testcases\test_demo.py -s -v

image.png

  • -s 显示代码中 print() 语句
  • -v 显示详细的日志级别。可以显示执行了哪个py文件中的那个测试用例。