一、pytest框架约束
1.1、 python的命名规则
1)py文件全部小写,多个英文用_隔开
2)class名首字母大写,驼峰:TestADD_*
3)函数和方法名小写,多个英文用_隔开:test_add
4)全局变量,前面要加global
5)常量字母必须全大写,如:AGE_OF_NICK
1.2、 pytest的命名规则
1)模块名(py文件)必须是以test_开头或者_test结尾
2)测试类(class)必须以Test开头,并且不能带init方法,类里的方法必须以test_开头
3)测试用例(函数)必须以test_开头
二、pytest的运行方式
2.1、主函数运行
import pytest
if __name__ == '__main__':
pytest.main()
#指定文件
pytest.main(["./testcase/product/test_add_product.py"])
#指定目录
pytest.main(["./testcase/product"])
#运行指定py的测试类用例
pytest.main(["./testcase/product/test_add_product.py::TestProduct"])
#运行指定py的测试类中的用例
pytest.main(["./testcase/product/test_add_product.py::TestProduct::test_add_01"])
#匹配包含关键词的用例(匹配目录名、模块名、类名、用例名),-k pan表示匹配包含pan的用例;可以使用and,or
pytest.main(['-k','pan'])
#-v显示详细信息,输出调试信息
pytest.main(['-v', 'testcase/test_one.py', 'testcase/test_two.py'])
#-s 输出更详细的信息,如:文件名、用例名
pytest.main(['-vs','testcase/test_one.py', 'testcase/test_two.py'])
#-x 只要有一个用例执行失败,就停止执行测试
pytest.main(['-vsx', 'testcase/test_one.py'])
#– maxfail -出现N个测试用例失败,就停止测试
pytest.main(['-vs', '--maxfail=3','testcase/test_one.py'])
#–html=report.html 生成html格式的报告
pytest.main(['-vsx','--html=./report/report.html', 'testcase/test_one.py'])
三、pytest中conftest.py文件
3.1、conftest.py的特点
pytest 会默认读取 conftest.py里面的所有 fixture
conftest.py 文件名称是固定的,不能改动
conftest.py 越近越优先,先从同目录的package 找,没有再往上一级找
不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py
测试用例文件中不需要手动 import conftest.py,pytest 会自动查找
可以跨 package导入,类、函数、参数,避免维护多个conftest
3.2、conftest.py的示例目录
最顶层的 conftest,一般写全局的 fixture
四、Pytest fixture
fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似unittest中setup/teardown,但是比它们要强大、灵活很多,它的优势是可以跨文件共享
4.1.pytest fixture几个关键特性
有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活
按模块化的方式实现,每个fixture都可以互相调用
fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题
fixture的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture和测试用例进行参数化
4.2.Pytest fixture定义
定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是test_开头的命名;
fixture装饰器里的scope有四个级别的参数:function(不写默认这个)、class、module、session;
fixture可以有返回值,如果没有return,默认会是None;用例调用fixture的返回值,就是直接把fixture的函数名称作为参数传入;
fixture可以返回一个元组、列表或字典;
测试用例可传单个、多个fixture参数;
fixture与fixture间可相互调用;
4.3.Pytest fixture用法
1)用法一:作为参数使用
fixture的名字直接作为测试用例的参数,用例调用fixture的返回值,直接将fixture的函数名称当做变量名称;如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据。
2)用法二:提供灵活的类似setup和teardown功能
Pytest的fixture另一个强大的功能就是在函数执行前后增加操作,类似setup和teardown操作,但是比setup和teardown的操作更加灵活;具体使用方式是同样定义一个函数,然后用装饰器标记为fixture,然后在此函数中使用一个yield语句,yield语句之前的就会在测试用例之前使用,yield之后的语句就会在测试用例执行完成之后再执行。@pytest.fixture可以用在selenium中测试用例执行前后打开、关闭浏览器的操作
3)用法三:利用pytest.mark.usefixtures叠加调用多个fixture
如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixtures()进行叠加。注意叠加顺序,① 与直接传入fixture不同的是,@pytest.mark.usefixtures无法获取到被fixture装饰的函数的返回值;
② @pytest.mark.usefixtures的使用场景是:被测试函数需要多个fixture做前后置工作时使用;
4)用法四:fixture自动使用autouse=True
5)用法四:搭配yield
4.5Pytest fixture参数用法
fixture(scope='function',params=None,autouse=False,ids=None,name=None)
常用参数
- scope: 被
@pytest.fixture
标记为方法的的作用域,默认是function, 还可以是class、module、package、session等,(简而言之 就是在需要前置后置后置的函数) function:每一个函数或方法都会调用、 class:每一个类调用一次,一个类中可以有多个方、module:每一个.py文件调用一次,该文件内又有多个function和class、session:多个文件调用一次,可以跨.py文件调用(通常这个级别会结合conftest.py文件使用) - params: 用于给fixture传参,可实现数据基于fixture的数据驱动,接收一个可以迭代的对象, 比如:列表[], 元组[], 字典列表{[],[],[]}、字典元组{(),(),()},提供参数数据供调用fixture的用例使用; 传进去的参数,可以用request.param调用,根据参数值遍历次数,有3个值则遍历3次
- ids: 用例标识id,每一个ids 和 params 一一对应,如果没有id,将从params自动产生;就像字典序号和值
1)params、ids入参参数化,根据数据遍历次数
2).autouse: 是否自动运行,是一个bool值,默认为false; 当为True时, 作用域内的测试用例都会自动调用该fixture,不输入函数
3).name: 给被@pytest.fixture
标记的方法取一个别名,这个参数的作用是为 fixture 显式命名,使得在测试报告中能够更清晰地识别和显示这个 fixture 的名称。而原本的fixture的名字会失效
五.Pytest mark用法
Mark 是 pytest 提供的一种标记功能,用于对测试用例进行标记和分组。通过使用 mark,我们可以对测试用例进行分类和组织,以便更好地管理和运行测试。Mark 可以用于单个测试用例或一组测试用例。
-
usefixtures - 为测试函数或者测试类知名使用那些fixture
-
filterwarnings - 为一个测试函数过滤一个指定的告警
-
skip - 跳过一个测试函数
-
skipif - 如果满足条件就跳过测试函数
-
xfail - 标记用例失败
-
parametrize - 参数化
@pytest.mark.parametrize("param1,param2",[("1","11"),("2","22")])
def test_run_9(param1,param2): print(param1,param2)
六.Pytest pytest-html简易报告
安装:pip install pytest-html
pytest.ini中配置 addopts = --html=report.html
运行后生成文件report.html,使用浏览器打开
七.Pytest Allure绚丽报告
安装 pip install allure-pytest
pytest.ini中配置addopts =--alluredir=./report/
运行py后在report生成报告文件,执行allure serve report 自动打开网页
7.1、定制化后的效果展示
7.2、allure的特性, @allure.epic()、@allure.feature()、@allure.story() 、@allure.step()、allure.attach的详细使用,的详细使用
-
@allure.epic:表示一个大型的主题或目标,通常是一个项目或一个较大的功能,往下是 feature;
-
@allure.feature:表示某个具体的功能点或模块,通常是史诗中的一个子功能,理解成模块往下是 story
-
@allure.story:表示一个具体的用户故事,通常是用户在使用某个子功能,例如:注册,往下是 title
-
@allure.step
- allure报告最重要的一点是,它允许对每个测试用例进行非常详细的步骤说明
- 通过 @allure.step() 装饰器,可以让测试用例在allure报告中显示更详细的测试过程
-
allure.attach
-
作用:allure报告还支持显示许多不同类型的附件,可以补充测试结果