pytest

一、Pytest框架
pytest是python语言中一个第三方单元测试框架,类似于UnitTest,比UniTest框架易用性更强。
为什么使用pytest框架?

1.非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
2.支持简单的单元测试和复杂的功能测试
3.支持参数化
4.执行测试过程中可以将某些测试跳过,或者对某些预期失败的Case标记成失败
5.支持重复执行失败的Case
6.支持运行由Nose , Unittest编写的测试Case
7.具有很多第三方插件,并且可以自定义扩展
8.方便的和持续集成工具集成


执行测试用例的框架,而非自动化测试框架。
pytest安装:pip install pytest


2.3 注意事项:
1. 通过右键调试运行,建议必须指定参数如:pytest.main("-s test01.py")
2. 通过命令运行,必须进入模块所在目录,并且 指定 -s 及要运行的模块名称 如:pytest -s test01.py
3. 类名定义默认必须以Test字母开头
4. 函数名默认必须以test字母开头

类级别:
setup_class
机制:类运行之前首先会被执行
teardown_class
机制:类运行之后会被执行
函数级别:
setup
机制:测试函数运行之前首先被执行
teardown
机制:函数运行之后被执行

注意事项:
1. pytest框架对于特殊函数,区分大小写
2. 写法(setup/teardown setup_class/teardown_class)

四、配置文件
4.1 为什么使用配置文件
1. 批量执行模块,不适用配置文件无法做到
2. 指定字母开头类、方法名,运行。默认情况只能使用 类:Test开头 方法:test开头
3. 指定运行类中的其中方法
4.2 什么是配置文件
1. 以pytest.ini命名的文件,pytest框架可以解析其内配置参数
2. pytest运行之前首先会检测pytest.ini文件

4.3 配置文件
# 声明配置文件类型
[pytest]
# 指定添加参数 多个参数之间使用空格分隔

# -s:输出程序运行信息

addopts= -s

# addopts=-s  --alluredir=./report -p no:warnings

# 指定测试目录
testpaths= ./Scripts
# 指定测试文件 *代表任意字符
python_files= test*.py
# 指定字母开头的类名
python_classes=Test*
# 指定字母开头的函数名
python_functions=test*
4.4 注意事项:
1. 配置文件位置:只能放到根目录
2. 配置文件名称:pytest.ini
3. 执行时,当前目录必须为pytest.ini文件所在目录
4. 执行命令 pytest

 

插件列表网址:https://plugincompat.herokuapp.com
包含很多插件包,可依据工作需求选择使用

五、pytest常用插件
常用插件  例:

测试报告插件
1. 安装:pip install pytest-html
2. 配置:pytest.ini配置文件内 addopts= --html=目录/名称.html

控制函数执行顺序
1. 安装:pip install pytest-ordering
2. 使用:@pytest.mark.run(order=x)
x:优先级的数值
1. 全为正数或负数 值越小优先级越高。
2. 一部分被标记负数,一部分没有被标记,没被标记的优先级高
3. 一部分被标记正数,一部分没有被标记,被标记正数的优先级高


3. 失败重试
1. 安装: pip install pytest-rerunfailures
2. 配置:在pytest.ini文件 addopts参数选项内 --reruns n
(n:为失败重试的次数)
3. 注意:
只有断言失败,才能生效。
assert 0 、assert False 、assert 1>2
5.4 注意事项
1. 第三方工具使用必须下载并且配置。
2. --html=目录/文件.html;
--html:固定参数不可改变
=:等号前后不能有空格

六、fixture

fixture修饰器来标记固定的工厂函数,在其他函数,模块,类或整个工程调用它时会被激活并优先执行,
通常会被用于完成预置处理和重复操作。

1) fixture就是setup/teardown的升级版;
2) 被fixture修饰的函数我们成为工厂函数

6.1 如何将一个普通函数修饰成工厂函数
@pytest.fixture()

6.2 工厂函数如何被调用
1. 通过参数
直接在测试函数内,将工厂函数作为参数传入
2. 通过函数
@pytest.mark.usefixtures("工厂函数名")
3. 设置自动运行
使用工厂函数自带参数:@pytest.fixture(autouse=True)

6.3 pytest常用参数
1. scope:作用域 默认为函数级别;
1). class 类级别
2. autouse:是否自动运行工厂函数 默认不自动运行
autouse=True 为自动运行
3. params:参数
结果列表:parasm=[1,2,3]

@pytest.fixture(params=[1,2,3])
def before(request):
    return request.param
注意:
1. request 参数为固定格式
2. reqeust.param也为固定格式。
·
七、高阶用法二
1. 跳过函数
语法:@pytest.mark.skipif(条件,原因)
2. 标记预期失败
语法:@pytest.mark.xfail(条件,原因)
3. 参数化[重点]
语法:@pytest.mark.parametrize("参数名",[参数值])

参数名:无论多少个必须为一个字符串
1). 单个参数:参数名必须为字符串
2). 多个参数:首先必须为一个字符串,参数名之间使用逗号分隔 如:"username,password..."
参数值:值的格式必须为列表-无论多少个参数多个值
1). 单个参数值:直接为列表即可,如果有多个值,使用逗号分隔;
2). 多个参数值:首先指的格式为列表,列表嵌套元祖,如:[("第一轮参数1的值","第一轮参数2的值"),("第二轮参数1的值","第二轮参数2的值")]

注意:
1. 条件、原因都为必填参数,条件如果不填默认为True
2. 原因参数为必填

# @pytest.fixture()
# @pytest.mark.usefixtures("test_03")
# @pytest.fixture(autouse=True)
# @pytest.fixture(scope="class", autouse=True)
# @pytest.fixture(params=[1, 2, 3])
@pytest.mark.run(order=-1)
@pytest.mark.skipif(1 > 0, reason="跳过-5")
# @pytest.mark.xfail(1 > 0, reason="标记失败")
@pytest.mark.parametrize("username, pwd, sex", [("li", "111", "F"), ("wang", "222", "M"), ("ang", "333", "F")])
def test_05(self, username, pwd, sex):
print(username, pwd, sex)

# --- 以yaml读取
@pytest.mark.parametrize("username, pwd, expect_resoult, expect_toast", get_yaml_data())

# 以txt读取
# @pytest.mark.parametrize("username, pwd, expect_resoult, expect_toast", get_txt_data())


pytest执行时,当前目录是ini,
读取数据:s.getcwd()+os.sep+"Data"+os.sep+"login_data.yaml",scripts:sys.path.append(os.getcwd())
posted @ 2021-11-28 22:10  zxy_ang  阅读(261)  评论(0)    收藏  举报