一篇文章带你了解Python常用自动化测试框架——Pytest(2)

  • Python:通常使用UnitTest和Pytest来进行单元测试自动化,但Pytest已经成为主流
  • Java:通常使用Testng和Junit来进行单元测试自动化,但Testng已经成为主流

最后我们需要明白单元测试框架的主要功能:

  • 发现测试用例
  • 执行测试用例
  • 判断测试结果
  • 生成测试报告
框架基本介绍

下面我们来简单介绍Pytest框架:

  • pytest是一个非常成熟的单元测试框架,经过多版本的迭代,主要优点在于灵活和简单
  • pytest具有极强的兼容性和生态环境,它可以结合selenium,requests,appium完成各种不同的自动化
  • pytest具有更好的页面展示效果,它可以生成自定义allure报告以及和Jenkins持续集成

下面我们给出一些和Pytest框架可以很好聚合的框架类型:

  • pytestpytest-html:主要用来生成html报告的插件
  • pytest-xdist:主要用来进行多线程运行的插件
  • pytest-ordering:主要用来改变用例的执行顺序的插件
  • pytest-rerunfailres:主要用来失败用例重跑的插件
  • allure-pytest:主要用来生成美观自定义的allure报告

我们可以采用一种比较简便的方式来一次性下载这些框架:

首先我们需要将这些名称全部放入一个txt文件中,假设我们放在requestment.txt文件中

requestment.txt文件

pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures

我们只需要在pycharm的console中输入指令下载该文件夹中全部内容即可

pip install -r requirements.txt

Pytest基本使用

下面我们来介绍Pytest的基本使用

Pytest默认测试用例

下面我们首先讲解Pytest默认测试用例的格式:

首先我们的模块名(文件名)通常被统一存放在一个testcases文件夹中,然后需要保证模块名须以test_开头或者_test结尾

例如我们下面的模块名命名就是正确示例

test_demo1
demo2_test

然后我们需要注意我们模块中的测试类类名必须以Test开头,并且不能带有init方法

例如我们下面的类名命名就是正确示例

class TestDemo1:
class TestLogin:

最后我们需要注意我们测试类中的测试方法名(Case名)必须以test_开头

例如我们下面的模块名命名就是正确示例

test_demo1(self)
test_demo2(self)

我们给出一个测试用例例子:

文件名为test_demo1

class TestDemo:
def test_demo1(self):
print(“测试用例1”)

def test_demo2(self):
print(“测试用例2”)

当然我们上述的要求都不是必须相同的,在后续我们可以进行修改,我们将在下述讲解执行方法时讲解

然后我们再来讲解一下Pytest的测试用例该如何执行:

首先我们讲解一下全局配置文件pytest.ini

我们可以在pytest.ini中进行一些属性的配置来修改Pytest的默认属性,我们需要在项目的根目录下创建,名称必须是pytest.ini

1 [pytest]
2 #参数
3 addopts = ‐vs # 这里指当默认使用指令时的一些辅助参数,我们后面会讲解
4 testpaths = ./testcases # 这里指默认的执行路径,它会默认执行该文件夹下所有的满足条件的测试case
5 python_files = test_.py # 这里就是前面我们所说的文件命名规则
6 python_classes = Test
# 这里就是前面我们所说的类名命名规则
7 python_functions = test_* # 这里就是前面我们所说的Case命名规则
8 #标记
9 markers = # 这里是冒烟规则,我们后面会讲到
10 smoke:冒烟用例
11 product_manage:商品管理

然后我们首先来讲采用console命令行执行Pytest的方法

最简单的就是直接在console命令行输入pytest,如果存在pytest.ini,它会根据文件内容进行执行;如果没有就按照默认格式执行

但是我们可以通过一些参数来强化pytest参数指令

-vs: -v输出详细信息 -s输出调试信息

pytest -vs

-n: 多线程运行(前提安装插件:pytest-xdist)

pytest -vs -n=2

–reruns num: 失败重跑(前提安装插件:pytest-rerunfailres)

pytest -vs --reruns=2

-x: 出现一个用例失败则停止测试

pytest -vs -x

–maxfail: 出现几个失败才终止

pytest -vs --maxfail=2

–html: 生成html的测试报告,后面 需要跟上所创建的文件位置及文件名称(前提安装插件:pytest-html)

pytest -vs --html ./reports/result.html

-k: 运行测试用例名称中包含某个字符串的测试用例,我们可以采用or表示或者,采用and表示都

采用or就表示:我们的运行用例名称中包含or两侧的其中一个数据即可

采用and就表示:我们的运行用例名称中包含and两侧的所有数据才满足条件

pytest -vs -k “qiuluo”
pytest -vs -k “qiuluo or weiliang”
pytest -vs -k “qiuluo and weiliang”

-m:冒烟用例执行,后面需要跟一个冒烟名称

我们在这里简单介绍一下冒烟用例的执行方法,我们这里其实就是一个分组执行的方法

例如我们的用例划分为user_manage用户管理测试和product_manage商品管理测试,我们只希望执行其中一组测试

首先我们需要在他们的不同方法上进行@mark划分,具体操作如下:

class TestDemo:

我们在Case上采用@pytest.mark. + 分组名称,就相当于该方法被划分为该分组中

注意:一个分组可以有多个方法,一个方法也可以被划分到多个分组中

@pytest.mark.user_manage
def test_demo1(self):
print(“user_manage_test1”)

@pytest.mark.product_manage
def test_demo2(self):
print(“product_manage_test1”)

@pytest.mark.user_manage
@pytest.mark.product_manage
def test_demo3(self):
print(“manage_test1”)

我们在执行中只需要采用前面我们所说的-m + 分组名称即可

pytest -vs -m user_manage

这里插一句,我们在运行过程中可以采用抛出异常的方式来模拟测试失败:raise Exception() 抛出异常

最后我们也可以采用main方法来执行pytest,同样我们也可以使用参数来进行调节

if name == ‘main’:
pytest.main()

if name == ‘main’:
pytest.main([“‐vs”])

最后我们插入一个简单的案例跳过方法:

pytest的跳过案例方法其实和unittest是完全相同的

我们只需要采用skip或skipif方法来指定参数并贴在方法上即可跳过

@pytest.mark.skip(跳过原因)

@pytest.mark.skipif(跳过条件,跳过原因)

我们给出一个示例

class TestDemo:

workage2 = 5
workage3 = 20

@pytest.mark.skip(reason=“无理由跳过”)
def test_demo1(self):
print(“我被跳过了”)

@pytest.mark.skipif(workage2<10,reason=“工作经验少于10年跳过”)
def test_demo2(self):
print(“由于经验不足,我被跳过了”)

@pytest.mark.skipif(workage3<10,reason=“工作经验少于10年跳过”)
def test_demo3(self):
print(“由于经验过关,我被执行了”)

def test_demo3(self):
print(“我没有跳过条件,所以我被执行了”)

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

Pytest前后置方法

首先我们需要先了解前后置是什么:

  • 前后置就是针对不同层级方法执行前和执行后所需要执行的步骤进行封装并执行
  • 这个层级通常被划分为:文件层,类层,方法层

首先我们先来介绍Pytest通过固件来实现前后置的方法:

我们通常采用前后置来做一些方法前后的操作

如果我们采用方法层的前后置,那么它会在每个方法执行前后去执行该内容

如果我们采用类层的前后置,那么它会在调用这个类内所有方法的前后去执行该内容,但是无论该类的方法执行多少次,它只会调用一次

例如我们做login测试时,我们只需要在开始测试时打开一次浏览器,然后在测试结束时关闭一次浏览器,那么我们就采用类的前后置

我们做login测试时,为了保证前置操作不对后续Case有影响,所以我们在执行方法前打开该网页,执行方法后关闭该网页,采用方法的前后置

Pytest的固件前后置其实和unittest是基本相同的

首先是方法级别的固件前后置

它是在每个测试方法(用例代码) 执行前后都会自动调用的结构

方法执行之前

def setUp(self):
每个测试方法执行之前都会执行
pass

方法执行之后

def tearDown(self):
每个测试方法执行之后都会执行
pass

然后是针对类级别的固件前后置

它是在每个测试类中所有方法执行前后 都会自动调用的结构(在整个类中执行之前或之后执行一次)

需要注意:类级别的固件前后置, 是一个类方法

类中所有方法之前

@classmethod
def setUpClass(cls):
pass

类中所有方法之后

@classmethod
def tearDownClass(cls):
pass

最后是针对模块级别的固件前后置

在每个代码文件执行前后执行的代码结构

需要注意:模块级别的需要写在类的外边直接定义函数即可

代码文件之前

def setUpModule():
pass

代码文件之后

def tearDownModule():
pass

下面我们采用一个用户账户登录的用例来简单展示一下固件前后置

import unittest

class TestLogin(unittest.TestCase):

在执行该类前所需要调用的方法

@classmethod
def setUpClass(cls) -> None:
print(‘------打开浏览器’)

在执行该类后所需要调用的方法

@classmethod
def tearDownClass(cls) -> None:
print(‘------关闭浏览器’)

每个测试方法执行之前都会先调用的方法

def setUp(self):
print(‘输入网址…’)

每个测试方法执行之后都会调用的方法

def tearDown(self) -> None:
print(‘关闭当前页面…’)

测试Case1

def test_1(self):
print(‘输入正确用户名密码验证码,点击登录 1’)

测试Case2

def test_2(self):
print(‘输入错误用户名密码验证码,点击登录 2’)

然后我们还需要讲解一下Fixtrue实现前后置的方法:

首先我们需要知道Fixtrue所实现的功能基本和固件所实现的功能是一样的,但是会更加方便

首先我们给出Fixture的完整格式,然后我们再分开介绍各个参数

@pytest.fixture(scope=None,autouse=False,params=None,ids=None ,name=None)

scope:作用范围

参数主要有三种:function函数,class类,package/session包

function:在函数层面上执行前后置

我们通常采用yield进行前后置划分,yield前是前置,yield后是后置

@pytest.fixture(scope=“function”)
def exe_database_sql():
print(“执行SQL查询”)
yield
print(“关闭数据库连接”)

我们还可以通过yield或return去返回一些参数在方法中使用

但是需要注意,yield返回参数后后置仍旧可以执行,但是return返回参数后后置操作无法执行

@pytest.fixture(scope=“function”)
def exe_database_sql():
print(“执行SQL查询”)
yield “success”

return “success” 执行后无法执行后置操作

print(“关闭数据库连接”)

我们的方法在调用时,可以直接使用exe_database_sql表示返回信息进行输出

def test_2(self,exe_database_sql):
print(exe_database_sql)

class:在类之前和之后执行

@pytest.fixture(scope=“class”)
def exe_database_sql():
print(“执行SQL查询”)
yield
print(“关闭数据库连接”)

package/session:在整个项目会话之前和之后执行

@pytest.fixture(scope=“session”)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

…(img-sOZLxkj6-1712737068025)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-2HJfY0K4-1712737068025)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值