学习笔记——python测试框架
pip依赖管理与虚拟环境
pip是python3.6以后自带的包管理工具,pypi
创建虚拟环境
- python -m venv new_env
- python -m virtualenv new_env
- conda create -n new_env
python unittest测试框架
单元测试概述
- 什么是单元测试
- 单元测试就是开发者编写的一小段代码,用于检测北侧代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件下某个特定函数的行为。
- 单元测试一般由开发人员进行测试
- 单元测试的时候一个大的前提就是需要清楚的知道,自己要测试的程序块所预期的输入和输出,然后根据这个预期和程序逻辑来书写case。这里的预期结果一定要针对需求/设计的逻辑去写,而不是针对程序的实现来写,否则单元测试就失去了意义,照着错误的实现设计出的case也很可能是错误的。
- python中常见测试框架
- unittest:python内置的标准类库,他的API跟java的junit、.net的NUnit、C++的CppUnit很相似。
- Pytest:丰富、灵活的测试框架,语法简单,可以结合allure生成一个炫酷的测试报告。
- Nose:Nose是对unittest的扩展,使得python的测试更加简单。
- Mock:unittest.mock是用来测试python的库。这是一个标准库。
- 单元测试覆盖率
- 代码覆盖率也被用于自动化测试和手工测试来度量测试是否全面的指标之一,应用覆盖率的思想增强测试用例的设计。
- 单元测试覆盖类型:语句覆盖、条件覆盖、判断覆盖、路径覆盖。
unittest 测试框架
- unittest
- unittest执行测试用例
- 测试用例执行过程
unittest实战
- unittest 结合 htnltestrunner 生成测试报告
pytest测试框架
pytest 介绍
- pytest是一个非常成熟的全功能的python测试框架
- 简单灵活,容易上手
- 支持参数化
- 测试用例的skip和xfail,自动失败重试等处理;
- 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
- pytest具有很多第三方插件、并且可以自定义扩展,比较好用的比如pytest-allure(html测试报告生成),pytest-xdist(多cpu分发)等;
- 可以很好的和jenkins集成;
- 文档;
- pip install pytest;
测试用例的识别与运行
- 测试文件
- test_*.py
- *_test.py
- 用例识别
- Test*类包含的所有test_*的方法(测试类不能带有__init__方法)
- 不在class中的所有test_*方法
- pytest也可以执行unittest框架写的用例和方法
参数化用例
- @pytest.mark.parameterize(argname,argvalue)
- 使用yaml实现数据参数化
数据驱动
- 简介:数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化实现数据驱动,数据量大的时候建议使用一种结构化的文件(例如json、yaml等)来对数据进行存储,然后在测试用例中读取这些数据。
- 应用场景
- APP、Web、接口自动化测试
- 测试步骤的数据驱动
- 测试数据的数据驱动
- 配置的数据驱动
- APP、Web、接口自动化测试
测试报告美化与定制
- pytest + allure 生成测试报告
- allure 介绍
- allure 是一个轻量级,灵活的,支持多语言的测试报告工具。
- 多平台的,奢华的report框架
- 可以为 dev/qa 提供详尽的测试报告、测试步骤、log;
- 也可以为管理层提供 high level 统计报告;
- java 语言开发的,支持 pytest、JavaScript、php、ruby等;
- 可以集成到jenkins
- allure 官方文档
- 安装 allure-pytest 插件
- pip install allure-pytest
- 运行
- 在测试执行期间收集结果
- pytest [测试文件] -s -q --allluredir=./result/(–alluredir这个选项用于指定存储测试结果的路径)
- 查看测试报告
- 方式一:测试完成后查看实际报告,在线看报告,会直接打开默认浏览器展示当前报告( allure serve ./result/)
- 方式二:从结果生成报告,这是一个启动tomcat的服务,需要两个步骤:生成报告、打开报告。
- 生成报告:allure generate ./result/ -o ./report/ --clean (–clean 用于覆盖)
- 打开报告:allure open -h 127.0.0.1 -p 8883 ./report/
- 在测试执行期间收集结果
- allure 常用特性
- 场景
- 希望在报告中看到测试功能,子功能或场景、测试步骤、包括测试附加信息;
- 解决
- @Feature
- @Story
- @step
- @attach
- 步骤
- import allure
- 功能上加 @allure.feature(“功能名称”)
- 子功能上加@allure.story(“子功能名称”)
- 步骤上加@allure.step(“步骤细节”)
- @allure.attach(“具体文本信息”)。需要附加的信息,可以是文本,图片,视频,网页。
- 如果只测试登录功能运行的时候可以加限制过滤:
- pytest 文件名 --allure-feature “购物车功能” --allure-stories “加入购物车”
- 场景
- allure 特性 feature/story
- 注解 @allure.feature 与 @allure.story 的关系
- feature 相当于一个功能,一个大的模块,将case分类到某个feature中,报告中behaviore中显示,相当于testsuite。
- story 相当于对应这个功能或者模块下的不同场景、分支功能,属于feature之下的结构,报告在feature中显示,相当于testcase。
- feature 与 story 类似与父子关系。
- 注解 @allure.feature 与 @allure.story 的关系
- allure 特性 step
- 测试过程中每个步骤,一般放在具体逻辑方法中。
- 可以放在关键步骤中,在报告中显示。
- 在app,web 自动化测试中,建议每切换到一个新的页面当作一个step。
- 用法:
- @allure.step() 只能以装饰器的形式放在类或者方法上面
- with allure.step(): 可以放在测试用例方法里面,但测试步骤的代码需要被该语句包含。
- allure 特性
- 关联测试用例(可以直接给测试用例的地址链接)
- 例子:
- TEST_CASE_LINK=“https://example.com/path/to/case”
- @allure.testcase(TEST_CASE_LINK,”test case title“)
- def test_with_testcase_link():
- pass
- 按重要性级别进行一定范围测试
- 场景
- 通常测试有P0、冒烟测试、验证上线测试。按重要性级别来分别执行的,比如上线要把主流程和重要模块都跑一遍 - 解决:
- 通过附加 pytest.mark 标记,
- 通过 allure.feature,allure.story
- 也可以通过 allure.severity 来附加标记
- 级别:Tribial:不重要、Minor:不太重要、Nomal:正常问题、Critical:严重、Blocker:阻塞。
- 级别:Tribial:不重要、Minor:不太重要、Nomal:正常问题、Critical:严重、Blocker:阻塞。
- 步骤:
- 在方法,函数和类上面添加
- @allure.severity(allure.severity_level.TRIVIAL)
- 执行时
- pytest -s -v 文件名 --allure-severities normal,critical
- 在方法,函数和类上面添加
- 场景
- allure 运行不同测试用例
- 按 feature 运行测试用例
- pytest -alluredir=log/report/xml --allure-features=测试登录功能,测试我的自选 testcase/alluredemo
- 按 story 运行测试用例
- pytest --alluredir=log/report/xml --allure-stories=测试已登录的场景 testcase/alluredemo
- 按 severity运行测试用例
- pytest --alluredir=log/report/xml --allure-severities=blocker testcase/alluredemo
- 按 feature 运行测试用例
- 前端自动化测试——截图
- 场景:
- 前端自动化测试经常需要附加图片或者html,在适当的地方,在适当的时机截图。
- 解决
- @allure.attach 显示许多不同类型的提供的附件,可以补充测试步骤或结果。
- 步骤:
- 在测试报告里附加网页:
- allure.attach(body,name,attachment_type,extension);
- allure.attach(‘首页’,‘这是错误页的结果信息’,allure.attachment_type.HTML)
- 在测试报告里附加图片:
- allure.attach.file(source,name,attachment_type,extension);
- allure.attach.file("./result/b.png",attachment_type=allure.attachment_type.PNG)
- 在测试报告里附加网页:
- 场景: