史上最细,Pytest自动化测试框架全面解析,看这篇就够了...


前言

1、pytest核心基本功能

非常容易上手,入门简单,具有丰富的资料文档,有很多实例可以进行参考
具有很多的第三方插件,并且可以自定义扩展功能

执行测试用例过程中可以将某些用例进行标记:跳过,指定顺序执行,标记失败,标记参数化等

支持标记参数化:用例脚本只需要编写一次,那么可以实现数据驱动测试完整整个模块的测试内容

支持重复执行失败用例
便捷管理用例,方便和持续集成工作完成集成任务,便于生成自动化测试报告

自动化测试框架的核心作用:
定位测试用例;
执行测试用例;
断言测试用例;
生成测试报告;

2、pytest常用的插件安装

测试框架

pytest

生成html测试报告

扫描二维码关注公众号,回复: 17317131 查看本文章
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年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

在每一个艰难的瞬间,都蕴藏着无限的可能性,只要你坚持不懈、勇往直前,就能超越自己,追逐梦想,创造出属于自己的辉煌人生。相信自己,奋斗无畏!

生命不止,奋斗不息。无论困境与挫折如何,坚持追求梦想的脚步。相信自己的力量,敢于挑战,勇往直前。只有不停努力,才能创造出属于自己的辉煌人生。

勇往直前,不畏艰难。披荆斩棘,超越极限。相信自己,追逐梦想。每一次努力都将成就辉煌,创造出属于自己的壮丽人生。奋斗不止,才能绽放光芒。

猜你喜欢

转载自blog.csdn.net/csdnchengxi/article/details/135152689