【自动化测试】关键字驱动接口自动化测试
1. 概念:
在软件测试领域,"数据驱动"和"关键字驱动"是两种自动化测试的设计模式, 它们都旨在提高测试效率,减少重复劳动,但它们的实现方式和应用场景有所不同。
(1) 数据驱动(Data-Driven Testing, DDT):
**优点**
a. 可变数据:测试数据的输入和预期输出是从外部数据源获取(如数据库、表格)
b. 高度抽象:测试逻辑与数据分离,使得测试逻辑可以复用于不同的数据
c. 易于维护:测试数据的更改不需要修改测试脚本,便于非技术背景的测试人员操作。
**缺点**
d. 灵活性较低:如果测试逻辑复杂,可能需要编写复杂的脚本来处理不同的数据。
e. 维护成本:随着测试数据量的增加,数据的管理和维护较为频繁。
(2) 关键字驱动(Keyword-Driven Testing, KDT)
关键字驱动是数据驱动测试的扩展,它不仅将测试数据外部化,还将测试操作(关键字)外部化。在这种方法中,关键字代表了一系列的测试步骤或操作,这些关键字通常与具体的测试脚本或函数关联,有效提高了自动化测试的灵活性。
2. 关键字驱动结合实际应用场景的实现
(1) 数据源选用excel表格维护,上手门槛低,且可自定义增加外部开关或基础信息等配置,随时可改。
(2) 接口收集:实现快速生成接口自动化测试所需的数据源文件
(3) 关键字触发测试的颗粒度:一个关键字对应一个接口表格所有接口,类似数据驱动 (关键字与具体测试类关联)
一个关键字对应表格中的某一个接口动作,如:发券、核销等 (关键字与具体测试函数关联)
(4) 降低测试数据维护的成本, 借鉴Jmeter, excel中params支持使用内置变量,如:
${mobile} #随机生成一个11位手机号,不区分号段
${date} #当前日期,形如:2023-10-31
${time} #当前时间,形如:2023-10-31 16:05:53
(5) 支持失败重试机制:若某一个接口失败,则测试会话等待n秒后重试该接口
(6) 适配不同场景下的接口执行,统一处理认证信息(cookies,token)和请求方式(GET,POST,PUT,DELETE,PATCH)
(7) 断言方式:优先以数据源中填写的预期结果作为断言,若无则使用接口通用断言
(8) 通知:测试执行完成后封装测试报告,发送邮件或钉钉通知
(9) 测试框架选定pytest,利用@pytest.mark.{keyword}修饰器机制,以标记代表关键字
3. 【pytest】基础干货
(1) pytest中的脚本设计原则
* 文件名以 test_*.py 文件和*_test.py
* 以test_ 开头的函数
* 以Test开头的类,不能包含 __init__ 方法
* 以test_开头的类里面的方法
* 所有的包package必须要有__init__.py 文件
(2) pytest中的脚本运行指令语法
* pytest #运行当前目录下所有的测试用例
* pytest xx.py #运行xx.py脚本中的所有测试用例
* pytest xx.py::TestClass #运行xx.py脚本中某一个类的所有测试用例
* pytest xx.py::test_method #运行xx.py脚本中的某一个方法
* pytest xx.py::TestClass::test_method #运行xx.py脚本中某一个类中的某一个方法
* pytest -m login #运行用@pytest.mark.login 装饰器修饰的所有测试用例
(3) pytest-html生成html报告可能遇到的问题
Q1: pytest --html=report.html #将会在当前目录下生成名为report.html的测试报告,但是css是独立的,分享报告样式会丢如何处理?
A1:[推荐] pytest --html=test_report.html --self-contained-html #生成合并css样式后的html测试报告
Q2: 生成的report.html报告里中文乱码如何处理?
A2:utf-8改为GBK,修改python路径\Lib\site-packages\pytest_html内的html_report.py
head = html.head(html.meta(charset="utf-8"), html.title(self.title), html_css)
(4) pytest中如何使用logging记录测试日志到.log文件中?
借助pytest.ini配置日志的级别、日志格式、写入文件等信息
4. 框架逻辑图
5. 源码已上传gitee.com
6. 实际使用方式
- 指令触发, 命令样例:pytest -m {keyword}
- 结合Jenkins,以job形式触发, 将关键字放在参数化插件
- 在测试平台中封装触发指令,供页面调用
PS: excel表格中的数据修改的格式注意事项:
- url: 字符串格式,而不是超链接 (模板中URL设置为不自动转超链接形式)
- params: (待办)
1. java中的null换成python中的None
2. 添加参数是true和false首字母必须大写