文章目录
前言
本篇文章主要记录pytest的学习历程,其中包括pytest的语法、用法、实战等。
一、pytest单元测试框架
单元测试是指在软件开发中针对软件的最小单位(函数、方法)进行正确性的检查测试。
单元测试框架:
java:junit和testng(可以看看我之前的文章)。
python:unittest和pytest。
单元测试框架主要做:
(1)测试发现:从多个文件里面去找到测试用例;
(2)测试执行:按照一定的顺序和规则去执行,并生成结果;
(3)测试判断:通过断言判断预期结果和实际结果的差异;
(4)测试报告:统计测试进度、耗时、通过率,生成测试报告。
1.单元测试框架和自动化测试框架的关系
(1)什么是自动化测试框架:封装自动化的基础模块、管理模块、统计模块。
(2)作用
1)提高测试效率,降低维护成本;
2)减少人工干预,提高测试的准确性,增加代码的重用性;
3)核心思想是让不懂代码的人也能够通过这个框架去实现自动化测试。
(3)pytest单元测试框架和自动化测试框架的关系
单元测试框架:只是自动化测试框架中的组成部分之一。
pom设计模式:只是自动化测试框架中的组成部分之一,
数据驱动、关键字驱动、全局配置文件的封装、日志监控、selenium、requests、断言、报告邮件…
2.pytest简介
(1)pytest是一个非常成熟的python的单元框架,比unit test更灵活,容易上手。
(2)pytest可以和selenium、requests、appium结合实现web自动化、接口自动化、app自动化。
(3)pytest可以实现测试用例的跳过以及reruns 失败用例重试。
(4)pytest可以和allure生成美观的测试报告。
(5)pytest可以和Jenkins持续集成。
(6)pytest有很多非常强大的插件,这些插件能够实现很多的使用操作。
pytest-html:生成html格式的自动化测试报告。
pytest-xdist:测试用例分布式执行,多CPU分发。
pytest-ordering:用于改变测试用例的执行顺序。
pytest-rerunfailures:用例失败后重跑。
allure-pytest:用于生成美观的测试报告。
二、pytest使用
1.使用规则
(1)模块名必须以test_开头或 _test结尾。
(2)测试类必须以Test开头,并且不能有init方法。
(3)测试方法必须以test开头。
2.运行方式
(1)主函数模式。
运行所有:
pytest.main()
带参数运行:
pytest.main(['-s'])
pytest.main(['-v'])
pytest.main(['-vs'])
指定模块运行:
pytest.main(['-vs', 'test_login.py'])
指定目录:
pytest.main(['-vs', './interface_testcase'])
通过nodeid
pytest.main(['-vs', './interface_testcase/test_interface.py::test_04_func'])
(2)命令行模式。
运行所有:pytest
带参数执行:pytest -s
指定模块运行:pytest -vs test_login.py
指定目录:pytest.main -vs ./interface_testcase
(3)通过读取pytest.ini配置文件运行。
pytest.ini这个文件是pytest单元测试框架的核心配置文件。
位置:一般放在项目的根目录。
编码:必须是ANSI,可以使用notepad++修改编码格式。
作用:改变pytest默认的行为。
运行的规则:不管是主函数的模式运行,命令行模式运行,都会读取该文件。
格式:
[pytest]
# 命令行参数,用空格分割
addopts = -vs
# 测试用例文件夹,可自己配置,../pytestproject为上一层的pytestproject文件夹
testpaths = ../testcase
# 配置测试搜索的模块文件名称
python_files = test*.py
# 配置测试搜索的测试类名
python_classes = Test*
# 配置测试搜索的测试函数名
python_functions = test
参数详解
-s:表示输出调试信息,包括print打印。
-v:显示更详细的信息。
-vs:两个参数可以一起用。
-n:支持多线程或者分布式运行测试用例(如:pytest -vs ./testcase/test_login.py -n 2)
–reruns NUM:失败用例重跑。
-x:表示只要有一个用例失败,测试停止。
–maxfail=2:出现两个用例失败停止。
-k:根据测试用例的部分字符串指定测试用例(如:pytest -vs ./testcase -k “bai”)
3.运行顺序
(1)unittest:ascII的大小绝对的执行的顺序。
(2)pytest:默认从上到下。
pytest改变默认的执行顺序:使用mark标记,如下所示:
@pytest.mark.run(order=1)
4.分组执行(冒烟、分模块执行、分接口和web执行)
smoke:冒烟用例,分布在各个模块里
在pytest.ini中加入:
markers =
smoke: 冒烟用例
usermanage: 用户管理模块
productmanage:商品管理模块
函数块加上分组:
@pytest.mark.smoke
@pytest.mark.usermanage
命令行输入:
pytest -vs -m “smoke”
pytest -vs -m “smoke or usermanage or productmanage”
5.pytest跳过测试用例
(1)无条件跳过
@pytest.mark.skip(reason="不合适")
(2)有条件跳过
@pytest.mark.skipif(age>=18,reason="已成年")
生成报告文件:
addopts = -vs --html ./report/report.html
6.使用@pytest.fixture()实现部分测试用例的前后置(固件、夹具)
(1)setup/teardown,setup_class/teardown_class
def setup(self):
print('\n在执行测试用例之前执行的代码:代开浏览器,加载网页')
def setup_class(self):
print('在每个类执行前的初始化工作:比如:创建日志对象、创建数据')
def test_01_baidu(self):
print('\n测试百度')
def test_02_bilibili(self):
print('\n测试哔哩哔哩')
def teardown(self):
print('\n在执行测试用例之后:关闭浏览器')
def teardown_class(self):
print('\n在每个类执行后的扫尾的工作:比如:销毁日志对象,销毁数据库的连接,销毁接口的请求对象')
(2)使用fixture()装饰器来实现部分用例的前后置
@pytest.fixture(scope="", params="", autouse="", ids="", name="")
scope:表示的是被@pytest.fixture标记的方法的作用域,function、class、module、package/session。
params:参数化(支持:列表[]、元祖()、字典列表[{},{},{}]、字典元祖({},{},{}))。
autouse=True:自动执行,默认False。
ids:当使用params参数化时,给每一个值设置一个变量名。
name:给表示的是被@pytest.fixture标记的方法取一个别名。
import pytest
# @pytest.fixture(scope='function', params="", autouse="", ids="", name="")
@pytest.fixture(scope='function', params=['小明', '小王', '小红'], ids=['a', 'b', 'c'], name='aaa')
def my_fixture(request):
# print('这是前后置的方法,可以实现部分以及全部用例的前后置')
# yield
# print('这是后置的方法')
# print('前置')
# yield
# print('后置')
return request.param
class TestBeforeAfter:
# def setup(self):
# print('\n在执行测试用例之前执行的代码:代开浏览器,加载网页')
#
# def setup_class(self):
# print('在每个类执行前的初始化工作:比如:创建日志对象、创建数据')
def test_01_baidu(self):
print('测试百度')
def test_02_bilibili(self, aaa):
print('测试哔哩哔哩')
# print('-----------' + str(my_fixture))
print('-----------' + str(aaa))
# def teardown(self):
# print('\n在执行测试用例之后:关闭浏览器')
#
# def teardown_class(self):
# print('\n在每个类执行后的扫尾的工作:比如:销毁日志对象,销毁数据库的连接,销毁接口的请求对象')
if __name__ == '__main__':
pytest.main()
7.通过conftest.py和@pytest.fixture()结合实现全局的前置应用(如:项目的全局登录、模块的全局处理)
(1)conftest.py文件是单独存放的一个夹具配置文件,名称不能更改。
(2)用处可以在不用的py文件中使用同一个fixture函数。
(3)conftest.py需要和运行的用例放到统一层,并且不需要做任何的import导入的操作。
setup/teardown,setup_class/teardown_class:作用于所有用例或者所有的类。
@pytest.fixture():既可以作用于部分又可以作用于全部的前后置。
conftest.py和@pytest.fixture()结合使用,作用于全局的前后置。
8.断言
(1)assert
assert 1==2
9.生成allure测试报告
插件下载:allure-pytest。
(1)pytest-html
(2)allure-pytest
三、pytest实战
1.yaml接口自动化实战
(1)断言的封装
(2)allure报告的定制
(3)关键字驱动和数据驱动结合实现
(4)python的反射
通过对象的到类对象,再通过类对象调用方法。
(5)Jenkins的持续集成和allure报告集成,并根据自动化报告的错误率发送邮件。