1、pytest核心基本功能
非常容易上手,入门简单,具有丰富的资料文档,有很多实例可以进行参考
具有很多的第三方插件,并且可以自定义扩展功能
执行测试用例过程中可以将某些用例进行标记:跳过,指定顺序执行,标记失败,标记参数化等
支持标记参数化:用例脚本只需要编写一次,那么可以实现数据驱动测试完整整个模块的测试内容
支持重复执行失败用例
便捷管理用例,方便和持续集成工作完成集成任务,便于生成自动化测试报告
自动化测试框架的核心作用:
定位测试用例;
执行测试用例;
断言测试用例;
生成测试报告;
2、pytest常用的插件安装
测试框架
pytest
生成html测试报告
pytest-html
多线程运行
pytest-xdist
控制用例的执行顺序
pytest-ordering
失败用例重跑
pytest-rerunfailures
生成allure测试报告
allure-pytest
管理基础路径
pytest-base-url
如果需要单独安装插件内容可以使用命令:
pip install pytest
…
集体插件安装,把所有需要安装的插件放置requirements.txt
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
pytest-base-url
pip install -r requirements.txt
3、pytest用例执行规则
通过情况下项目中所有的用例会集成进行管理
创建testcases包
默认执行规则:
包名,以及模块名,用例名(函数,方法)符合以test开头或者test结尾
如果用例以方法的形式定义,那么类必须是以Test开头,而且不能有init构造方法
4、pytest用例执行方式
第一种执行方式:终端交互式执行
pytest:会执行所有符合默认规则的用例
pytest 执行用例的参数配置:
-s:会显示输出内容
-v:会显示用例的详细内容
-k:指定以什么开头用例执行
第二种执行方式:创建主函数执行
import pytest
if __name__ == '__main__':
pytest.main()
5、pytest标记跳过用例
标记的跳过功能用例有两种类型
无条件跳过:
@pytest.mark.skip(reason="错误用例直接跳过")
def test_b3():
print("用例b3开始执行")
print(1 / 0)
有条件跳过
# 当跳过的条件不成立,那么用例正常执行,反之不执行
@pytest.mark.skipif(2 > 1, reason="反例不执行")
def test_a2():
print("用例a2开始执行")
6、pytest控制用例顺序
用例执行顺序默认是按照模块名和用例名从上往下的执行顺序
需要改变默认执行方式,可以使用pytest-ordering插件来改变用例执行顺序
import pytest
def func():
print("这是一个普通的函数func")
def test_a():
print("用例a开始执行")
# 当跳过的条件不成立,那么用例正常执行,反之不执行
@pytest.mark.skipif(2 > 3, reason="反例不执行")
def test_a2():
print("用例a2开始执行")
@pytest.mark.run(order=2)
def test_b():
print("用例b开始执行")
@pytest.mark.run(order=1)
def test_b2():
print("用例b2开始执行")
@pytest.mark.skip(reason="错误用例直接跳过")
def test_b3():
print("用例b3开始执行")
print(1 / 0)
class Test_C:
@pytest.mark.run(order=0)
def test_c(self):
print("用例c开始执行")
如果传递了关键字参数order值越小,先开始执行,其他没有做装饰器执行顺序的标记那么按照原来的执行顺序
7、pytest标记失败用例
标记预期会出现异常或者失败的用例,只有出现异常才符合预期,不出现异常反而错误
用例出现异常执行结果
XFAIL
用例为出现异常执行结果
XPASS
8、pytest标记参数化
关于参数化的使用场景
对于相似的用例执行流程,但是使用不同的数据,那么就可以结合参数化实现数据驱动测试
# 实现参数化:读取不同的账号密码,进行注册测试
import pytest
@pytest.mark.parametrize(["username", "password"],
[("1d_", "123ad_"),
("1d_", "123ad_2"),
("123", "456"),
("a", "b"),
("c", "d"),
("666", "888"), ("1d_", "123ad_"),
("1d_", "123ad_2"),
("123", "456"),
("a", "b"),
("c", "d"),
("666", "888"),
("1d_", "123ad_"),
("1d_", "123ad_2"),
("123", "456"),
("a", "b"),
("c", "d"),
("666", "888")
])
def test_rg(username, password):
print(f"输入账号:{username}")
print(f"输入密码:{password}")
print("点击注册")
print("查看预期结果和实际结果")
参数化使用的形参和实参都可以是列表和元组,每一组数据为了做区分,列表中嵌套元组使用即可
通过读取csv文件内容结合参数化实现数据驱动测试
# 数据驱动获取Csv文件内容进行使用
def get_csv_data():
list1 = []
# csv文件读取
c1 = csv.reader(open(r"D:\Project234_web\data\后台登录数据内 容.csv", encoding="UTF-8"))
for i in c1:
list1.append(i)
else:
# print(list1)
return list1
9、pytest前后置处理
关于前后置的处理主要针对的是用例的前后操作
在用例执行之前和执行之后需要的处理内容,用于固定测试环境,以及清理回收资源
pytest中前后置也称为夹具分为四大类:
模块夹具、类夹具、方法夹具、函数夹具
import pytest
def func():
print("这是一个普通的函数func")
@pytest.mark.xfail(reason="a没有被定义")
def test_a():
# print(a)
print("用例a开始执行")
# 当跳过的条件不成立,那么用例正常执行,反之不执行
@pytest.mark.skipif(2 > 3, reason="反例不执行")
def test_a2():
print("用例a2开始执行")
@pytest.mark.run(order=2)
def test_b():
print("用例b开始执行")
@pytest.mark.run(order=1)
def test_b2():
print("用例b2开始执行")
@pytest.mark.skip(reason="错误用例直接跳过")
def test_b3():
print("用例b3开始执行")
print(1 / 0)
class Test_C:
# 类夹具
def setup_class(self):
print("类夹具开始执行")
def teardown_class(self):
print("类夹具结束执行")
# 方法夹具
def setup_method(self):
print("方法夹具开始执行")
def teardown_method(self):
print("方法夹具结束执行")
@pytest.mark.run(order=0)
def test_c(self):
print("用例c开始执行")
def test_c2(self):
print("用例c2开始执行")
# 函数的夹具
def setup_function():
print("函数夹具开始执行")
def teardown_function():
print("函数夹具结束执行")
# 模块夹具
def setup_module():
print("模块夹具开始执行")
def teardown_module():
print("模块夹具结束执行")
10、pytest中fixture固件
灵活调控固定环境
创建fixture完成前后置的操作
# 定义一个fixture进行前后置使用
# 用例在执行之前先链接数据库,执行之后关闭数据库
import pytest
# scope作用域:函数级别,类级别,方法级别,模块级别,会话级别
# autouse设置用例是否自动调用
@pytest.fixture(scope="function", autouse=True)
def exe_sql():
print("开始连接数据库")
print("连接成功")
print("提取参数")
yield
print("关闭数据库")
手动调用fixture方式:
# 手动使用fixture可以在函数的形参中直接写上fixture的名字即可调用前后置
def test_rg2(exe_sql):
print(f"输入账号")
print(f"输入密码")
print("点击注册")
print("查看预期结果和实际结果")
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
在每一个艰难的瞬间,都蕴藏着无限的可能性,只要你坚持不懈、勇往直前,就能超越自己,追逐梦想,创造出属于自己的辉煌人生。相信自己,奋斗无畏!
生命不止,奋斗不息。无论困境与挫折如何,坚持追求梦想的脚步。相信自己的力量,敢于挑战,勇往直前。只有不停努力,才能创造出属于自己的辉煌人生。
勇往直前,不畏艰难。披荆斩棘,超越极限。相信自己,追逐梦想。每一次努力都将成就辉煌,创造出属于自己的壮丽人生。奋斗不止,才能绽放光芒。