pytest 测试框架基础介绍
pytest是python测试框架,
常用测试框架还有unittest,robot framework(rf)
robot framework 使用的是关键字驱动的形式,包括:1.数据关键字;2.业务关键字
pytest安装
cmd中使用命令:pip install pytest
pytest命名规则
-
以test或test_开头编写模块,类,函数
-
以test或test_开头编写类,函数,
以test或_test结尾编写模块
执行测试用例
新建一个模块专门用来执行用例
所有的用例都放在该模块来执行
执行用例方法
-
pytest.main([])
pytest的main方法有2种参数,
第一种参数为要执行测试的模块,多个模块以逗号隔开
第二种参数为生成的测试报告类型,如:html报告,xml报告,allure报告,多个报告以逗号隔开
只有一种参数的main
执行结果:
这里只显示失败的用例,如上图
-
当使用pytest.main()时,会执行指定模块的所有用例,包括类中的用例,执行顺序是从上至下(不管你是类还是函数)
-
类中测试方法名字可以和测试函数名相同,不影响(它们属于不同命名空间)
生成测试报告
生成测试报告需要安装相应插件
pip install -U pytest-html
pip install -U allure-pytest
(xml测试报告不需要安装插件,pytest默认自带的)
生成html测试报告(有两种参数的main)
一种是用例路径,一种是报告路径
html格式的报告
生成allure测试报告
生成allure报告要麻烦点,
-
-
使用pytest.main([‘xxx.py’,’–alluredir=原始文件存放的目录’]),生成allure原始文件
-
用命令行也可以完成上述操作(html同样也可以用命令行执行)
pytest -v 测试用例路径 --allure=原始文件存放的目录
-
-
下载allure command tool工具并安装,
下载地址:https://github.com/allure-framework/allure2/releases
注意配置环境变量(方便使用命令),将allure的bin目录复制到环境变量中
使用命令allure --version,出现版本号说明安装成功
使用命令allure generate 原始文件路径 -o 生成的报告路径 --clean,利用原始文件生成报告
allure报告生成不同于html,xml,它需要这固定的两步,
查看allure测试报告:
数据驱动
使用装饰器@pytest.mark.parametrize()
注意:
-
该装饰器的第一个参数就是测试用例的参数,要一摸一样,第二个参数就是要传入的数据,
-
加了@pytest.mark.parametrize()装饰器的用例,会将数据依次传入用例执行,如上图有3个数据,那么测试用例会执行三次
-
@pytest.mark.parametrize()装饰器放在类上,表示类中所有用例都适用
-
传入的数据可以是列表,元组列表,字典列表
skip装饰器
@pytest.mark.skip(),()可写可不写
- 跳过装饰器,带有该装饰器的用例会被跳过不执行
用法:
-
(多个装饰器可同时用在一个用例上,顺序无所谓,如上图)
-
skip装饰器还有一个参数reason(可以不写),表示跳过之后会输出reason的内容
-
当skip装饰器作用在整个类上,那么类中所有用例会被跳过
-
skip装饰器还可以赋值给一个变量,之后可以用该变量代替skip装饰器
-
动态跳过
在函数或方法内使用pytest.skip()方法,可以使函数或方法直到遇到调用pytest.skip方法的时候被跳出
pytest.skip()可带参数也可不带,
带参数的时候里面可以写字符串,会在执行时输出
可以看到,你好{}被打印出来了,
说明pytest.skip()之前的过程都会执行,直到pytest.skip()用例才会被跳出
pytest.skip()方法有点像continue
-
skipif装饰器
条件跳过,两个参数
第一个参数是跳过的条件
第二个参数是当被跳过时输出的内容(只有被跳过时才会输出)
注意:
==表示当不满足条件时,会被跳过
!=表示当满足条件时,会被跳过
- skipif装饰器同skip,也可以赋值给一个变量
前置方法,后置方法
def setup_module():
pass
def teardown_module():
pass
整个模块运行前,后会执行一次
def setup_function():
pass
def teardown_function():
pass
每个函数(测试用例)被执行前,后都会执行一次
下面所有方法需写在类中
def setup_class():
pass
def teardown_class():
pass
表示整个测试类执行前,后会被运行一次
def setup_method():
pass
def teardown_method():
pass
表示类中的所有测试用例执行前,后都会被执行一次
def setup():
pass
def teardown():
pass
表示类中的所有测试用例执行前,后都会被执行一次,
如果同时存在setup_method方法,那么优先执行setup_method,再执行setup
如果同时存在teardown_method方法,那么优先执行teardown,再执行teardown_method
插入知识点(动静态方法)
@staticmethod是类的静态方法的装饰器,静态方法的括号里不要填写self
动态方法和静态方法的区别:
-
动态方法在使用时需要先创建实例才能调用实例方法
-
静态方法不需要创建实例,直接使用即可
固件函数
使用@pytest.fixture装饰的函数或方法,是更加灵活的setup,teardown
@pytest.fixture(),小括号可写可不写
其实固件函数说白了就是一个函数指针
用法:
1.直接作为其他函数参数
使用了@pytest.fixture装饰的函数就是一个固件函数,
固件函数可以作为另外一个用例的参数,当另外那个用例执行时,会先执行固件函数的内容,然后再执行自己的内容
观察发现上图,其实只有一个用例被执行,说明固件函数本身不会被执行,只是当被其他用例调用时才会执行
注意:
固件函数不要添加数据驱动,因为它本身是不执行的,是要靠其他用例调用才会执行
2.使用@pytest.mark.usefixtures
使用@pytest.mark.usefixtures装饰器的好处不言而喻,
它使其他用例可以自定义参数,如上图
3.改写默认参数autouse
改写固件函数的默认参数autouse=True,
改写之后表示该模块下所有用例会自动调用该固件函数,
@pytest.fixture(autouse=True)的优先级大于@pytest.fixture(),(@pytest.fixture()的参数autouse默认为False)
pytest标签
使用@pytest.mark.high,@pytest.mark.medium,@pytest.mark.low这3个装饰器,用在用例上,
相当与给用例加上不同的标签,
当我们执行用例时,可以选择性的执行
如上图,只执行了我们选择的high和low