Pytest自动化测试框架
pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持非常丰富的插件,同时兼容 unittest 框架。
一. 安装 Pytest
首先,你需要在你的 Python 环境中安装 Pytest。这可以通过 pip(Python 的包管理器)来完成:
pip install pytest
二.编写
函数的名字通常以 test_
开头或者以 _test
结尾,或者包含 test_
字符串
- .py 测试文件必须以test_开头(或者以_test结尾)
- 测试类必须以Test开头,并且不能有 init 方法
- 测试方法必须以test_开头
- 断言必须使用 assert
通常pytest运行时,会搜索指定目录下以test_开头的测试文件 ,同时在用例中也是搜索以Test开头的类或者以test_开头的方法进行运行 。pytest会将这些标识当做测试用例去运行 ,没有标识的将不被视为测试用例 ,故在运行时会被丢弃掉 。所以 ,编写测试用例通常就的按照这种规则编写我们的测试用例 。
三. 运行测试用例
Pytest
pytest test_example.py
allure生成测试报告
直接执行allureDemo项目下的所有测试用例,并将测试报告文件夹allure_reports放在项目根目录下
D:\_Automation\allureDemo>pytest -s -v --alluredir=./allure_results
运行完成后,打开 allure 报告
allure serve allure_reports
allure serve ./allure_results
Allure 测试报告一览
四.参数
当用例量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。多cpu分布。主要用来进行多线程运行的插件
在做测试时, 短时的网络波动会导致用例运行失败, , 此时就可通过重试运行用例的方式来解决问题。主要用来失败用例重跑的插件。
3、pytest-html
是一个pytest用于生成XML/HTML测试报告的插件。(HTML测试报告)
Pytest中可用assert断言, 但一个失败后面的断言将不再执行;pytest-assume可以实现对多个断言多重校验的。
比较预期结果和实际结果的值是否相等 ,在pytest中使用的是assert这个关键值进行比对的 。
测试过程中会出现一些偶现的bug, 对于这种问题我们会针对此用例反复执行多次, 最终复现出问题来; pytest-repeat插件就能起到这个作用: 重复执行测试用例
6、pytest-ordering
主要用来改变用例的执行顺序的插件
pytest默认按字母顺序去执行的(小写英文--->大写英文--->0-9数字)
用例之间的顺序是文件之间按照ASCLL码排序,文件内的用例按照从上往下执行
setup_module->setup_claas->setup_function->testcase->teardown_function->teardown_claas->teardown_module
但可以通过第三方插件pytest-ordering实现自定义用例执行顺序。
7、allure-pytest:主要用来生成美观自定义的allure报告
7、使用 Fixtures
Fixtures 是 Pytest 中的一个重要功能,它允许你定义一些在测试之间共享的状态或资源。Fixtures 可以使用 @pytest.fixture
装饰器来定义,然后在测试函数中使用它们作为参数。
Pytest 允许你使用参数化测试来测试多个输入和期望的输出。这可以通过 @pytest.mark.parametrize
装饰器来实现。
- 数据参数化 :具有相同操作步骤但是不同数据的用例进行循环执行 ,比如登录步骤一样,但是登录的数据可以每次都不同
- setup(): 初始化函数 ,在每条测试用例执行前要执行的一个函数,主要为测试用例做初始化数据 。
- teardown(): 清除函数 ,在每条测试用例执行后要执行的一个函数 ,主要是为测试用例执行后生成的数据做清除,做恢复操作 。比如注册后在数据库用户表中记录了一条数据 ,为了下次继续能执行 ,在这里写一个删除这条记录的操作就可以循环运行 。
- setup_class(): 类初始化函数 ,在一个类中只运行一次,而且是最先被运行 ,一般用于只初始化一次的操作,比如创建对象 。
- tearDown_class(): 类初始化函数 ,在一个类中只运行一次,而且是最后被运行 ,一般用于恢复一次的操作,比如关闭连接对象 。
五.测试用例
pip install pytest pytest-cov pytest-html
生成HTML测试报告
pytest --html=report.html
pip install allure-pytest
pytest -m baidu -s -v --alluredir=./allure_results
执行成功后,通过如下命令打开测试报告:
allure serve allure_reports
pytest -k “string” :匹配文件名、类名、函数名包含string的,并且可以使用逻辑操作符(and , or ,not)进行匹配 。
pytest -m string : 需要在代码中编写装饰器@pytest.mark.标记符 ,然后通过命令行去匹配这些用例 。
- 如果想运行用例级别为p2的用例 :pytest test01_login.py -m p2
pytest -s : 将测试用例中的打印信息输出到控制台 。
pytest -v : 输出更加详细的信息到控制台
pytest -q : 输出最简化的信息 。
pytest -x : 遇到错误的时停止运行。
pytest --pdb : 这个也可以打断点 ,关键是这个可以进行交互,比如让其输出变量等 。
pytest -runxfail : 将标记为失败的用例正常情况下是不运行 ,但是加上此参数 ,继续会运行 。
pytest --lf : 只跑上次测试失败的用例 ,这就意味着至少要跑两次 。
pytest --ff : 先跑上次测试失败的用例 ,再把其他用例再执行一遍 。
pytest -n number : 需要安装pytest-xdisk模块,同时运行多个线程 ,在用例量大的情况下,可以使用这个参数 。
pytest --html 需要安装pytest-html模块 ,可以直接生成html的测试报告 。
- 如果想要直接生成html测试报告到当前路径下,报告名为report.html :pytest --html=report.html
设置测试用例的运行顺序: 需要安装模块pytest-ordering ,如果运行的测试用例希望给它控制顺序 ,尤其是流程性用例 ,一般都会有顺序的 。这个直接通过装饰器给用例设置就可以了 。
pytest支持的初始化和清除函数
六.pytest支持的初始化和清除函数
举个例子:
比如你要做web自动化测试 ,通常的操作是:
- 打开浏览器
- 运行一条测试用例
- 关闭浏览器
- 重复上面的3个步骤 ,只到所有测试用例运行完毕 。
打开浏览器的操作 ,它本身不属于测试用例 ,但是又是一个必须要做的操作。
将打开浏览器操作放在setup_method()或者setup函数 ,同样关闭浏览器放在teardown_method()或teardown()中。
- 做初始化操作
- 执行测试用例
- 进行清除操作
对应的:
- 初始化函数:setUp()
- 参数化的测试用例 :test_case()
- 清除函数:tearDown()
1、fixture
- 可以进行参数化
- 可以解决初始化和清除的操作,在上一小节中介绍的那10个函数 ,都可以通过这个fixture来实现 。
fixture(scope,autouse,params,ids,name):
scope :在什么层级下运行 ,它的值只有 :session ,package ,module ,class ,function(默认值)
autouse : 代表的是否自动执行 ,若此参数不加或者设置为False的话,代表不会自动运行 ,设置为True自动执行,无需调用
params : 进行的数据参数化 ,参数化的数据就是通过此参数传入到测试用例中。
ids : 它是给生成的结果的fixture进行重命名 ,主要是为了好理解 ,前提是必须要有参数params
name : 对fixture的函数名起别名, 或者叫重命名 ,没啥大用处 。
参数名 :scope ,它有5个值,分别是 :
session :如果等于此值 ,那么这个fixture在整个项目下只运行一次 ,这个特别适合于登录 ,登录在项目中只需要登录一次。
package :如果设置为此值 ,那么这个fixture在这个包下只运行一次 。
module : 如果设置为此值 ,那么这个fixture在这个文件中只运行一次 ,文件中可能既有函数又有类 。
class : 如果设置为此值 ,那么这个fixture在这个类中只运行一次
function:它是这个函数的默认值,如果为此值,那么这个fixture在每个测试函数前运行一次
Allure 测试报告除了涵盖测试运行的全面信息外,还提供各种维度的分析图,包括如下几个部分。
项目总览(OverView)
项目总览显示了总体测试运行的一系列统计信息。
按缺陷种类分析(Categories)
缺陷种类分析显示了所有不同原因引起的失败,并分类展示。
按测试套件分析(Suites)
测试套件分析显示了按照套件和类划分的所有的测试执行情况。
图表模块(Graphs)
图表模块,包括按照不同维度分析的各种图表(例如测试状态表分析,测试用例等级分析表,测试执行时间分析表等等)。
按执行时间分析(Timeline)
按执行时间分析模块,详细列出了各个测试用例的执行时间,你可以筛选出那些运行时间最长的测试用例进行优化。
针对 BDD 驱动的测试用例进行分析(Behaviors)
这里主要是根据 Epic、Feature 和 Story 标签对测试结果进行分组。
按照 Package 进行分析(Packages)
Package 模块列出了按照 Package 维度进行分析的详细图表。