搭配实战细讲Pytest--为后续UI测试封装打基础--值得收藏

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

参数化

命名

扩展


命令行参数

=====

vs

先来看一个比较简单的示例,我们直接从示例入手:

import pytest

def test_01():

print(“第一条用例”)

class Testcase:

def test_02(self):

print(“第二条测试用例”)

注意看我的类名,首字母大写的!!!这里实际上是不会在控制台输出我们的打印信息的,所以我们还需要改改:

import pytest

def test_01():

print(“第一条用例”)

class Testcase:

def test_02(self):

print(“第二条测试用例”)

if name == ‘main’:

pytest.main([“-s”,“-v”,“running.py”])

-s是显示打印信息,-v显示详细的测试结果,这里你也可以写到一起去,也就是:

if name == ‘main’:

pytest.main([“running.py”,“-vs”])

除了写main方法可以输出结果之外,我们开始控制台直接码命令。

可能你会遇到no tests ran in 0.01s这样的情况,这种情况一般都是目录下找不到执行文件,这时候你就需要cd 切换到文件所在的文件目录就好了。执行命令也是大同小异。

pytest running.py -vs


maxfail


当maxfail=1的时候,用例里面出现一个错误用例停止运行

接下来我们多写几个用例:

def test_01():

print(“第一条用例”)

assert 0 > 1

def test_04():

print(“清安无别事”)

class Testcase:

def test_02(self):

print(“第二条测试用例”)

def test_03(self):

print(“第三条用例”)

我是在控制台码命令的,所以这里我就不写main方法去跑了。

pytest running.py -vs --maxfail=1


xdist


pip install --xdist

多线程,在用例少的情况下看不出太大的区别,多线程要比单线程少节省将近一半的时间,也就是说当xdist 为2时,启用两个线程,比直接pytest跑节省近一半时间。

def test_01():

print(“第一条用例”)

def test_04():

print(“清安无别事”)

class Testcase:

def test_02(self):

print(“第二条测试用例”)

def test_03(self):

print(“第三条用例”)

pytest running.py -vs --maxfail=1 -n 2,这里xdist有缩写,也就是-n,后面的2就是2个线程的意思。注意看下方截图的红色框框的位置,就是线程的名字。

reruns


pip install pytest-rerunfailures

重试运行,当运行出现错误的时候,也就是非预期结果的时候我们可以再次运行一次该用例

reruns为2时,重新运行两次

def test_01():

print(“第一条用例”)

assert 0>1

def test_04():

print(“清安无别事”)

class Testcase:

def test_02(self):

print(“第二条测试用例”)

def test_03(self):

print(“第三条用例”)

pytest running.py -vs - n 2 --reruns 2,看下方的截图,重复运行的两次。

测试报告


pytest框架自带了一个测试报告生成器。–html=路径/名称.html

def test_01():

print(“第一条用例”)

assert 0>1

def test_04():

print(“清安无别事”)

class Testcase:

def test_02(self):

print(“第二条测试用例”)

def test_03(self):

print(“第三条用例”)

如果我想将这四个用例生成测试报告:

pytest running.py -vs - n 2 --reruns 2 --html=report/report.html

在report文件夹下生成一个report.html报告,这个报告虽然很一般 ,也是不错了。当然我们也可以生成allure测试报告,美观一些。


allure

======

pip install allure-pytest下载好库。

pytest running.py -vs --alluredir …/report/xmll

allure generate --clean …/report/xmll -o ./result/html

仔细看你就会发现其实–clean后面接的是运行代码时-o后面的路径,因为运行pytest running.py -vs --alluredir …/report/xmll后,文件下会自行创建一个report文件,用例运行信息会存在xmll里面,我们生成报告就需要调用里面的信息。

因为我是控制台输出的所以需要这两行代码,输出完后就可以在result文件下看到一个index.html文件,就是测试报告了。如下图所示:

mark标签

======

什么是mark标签?mark标签分为内置标签与外置标签,可以用来对用例进行管理运行,我们直接看看例子:

def test002():

print(‘这是一条最优级别的用例’)

def test005():

print(“skip_reason”)

def test003():

print(‘这是一条严重级别的用例’)

def test006():

print(“006冒烟”)

def test004():

print(‘这是一条较严重级别的用例’)

上述例子的情况下,与正常情况下无异,这里需要注意:

pytest与unittest不一样,我test序列号写的很乱,如果是在unittest中的话肯定就是按数字的顺序来执行了,pytest中不分先后,05在04用例的前面,那么就得按这顺序来,先运行05用例再04用例。

那么我们给这里加上mark标签看看:

def test002():

print(‘这是一条最优级别的用例’)

def test005():

print(“005冒烟”)

@pytest.mark.qingan

def test003():

print(‘这是一条严重级别的用例’)

def test006():

print(“006冒烟”)

@pytest.mark.qinganan

def test004():

print(‘这是一条较严重级别的用例’)

猜猜这里运行几条用例?3条,没错。

注意:这里mark标签是外置标签,我自己命名的。看看运行结果:

pytest -m qingan test_speack.py -sv这里指定外置标签的标签名。不指定就会运行全部的用例,不指定怎么对用例进行管理。

这里还是可以看到只执行了两条,也就是标签的那两条用例。这里对指定用例进行标记运行。

mark标签会受外界的装饰器影响吗?我们来看看。

def func(function):

def fn(*args,**kwargs):

print("this is "+function.name)

return function(*args,**kwargs)

return fn

----------上面是自己写的装饰器--------------

@func

def test002():

print(‘这是一条最优级别的用例’)

@pytest.mark.skip

def test005():

print(“skip_reason”)

@pytest.mark.qingan

@func

def test003():

print(‘这是一条严重级别的用例’)

def test006():

print(“006冒烟”)

@pytest.mark.qingan

@func

def test004():

print(‘这是一条较严重级别的用例’)

是不会的,也是遵循pytest强大的执行顺序来的。

那么看了自定义标签,看看内置标签吧:

def func(function):

def fn(*args,**kwargs):

print("this is "+function.name)

return function(*args,**kwargs)

return fn

----------上面是自己写的装饰器--------------

@func

def test002():

print(‘这是一条最优级别的用例’)

@pytest.mark.skip

def test005():

print(“skip_reason”)

@pytest.mark.qingan

@func

def test003():

print(‘这是一条严重级别的用例’)

def test006():

print(“006冒烟”)

@pytest.mark.qingan

@func

def test004():

print(‘这是一条较严重级别的用例’)

我在05用例处添加了一个内置标签,这里需要注意的是,执行命令不一样:

pytest test_speack.py -s -rs或者pytest -k qingan test_speack.py -sv

05被跳过了,我们可以更改内置标签的提示信息

@pytest.mark.skip(reason=‘不运行’)

def test005():

print(“skip_reason”)

控制台就会有这样的一条信息可以看到。

这里可以看到自定义标签与内置标签处用的运行命令有所不同,不同之处在于一个用了-m一个用了-k。

使用-m的时候我们需要指定自定义标签,才能跑用例,否则跑不起来,如果用-k即使不指定也是可以跑起来,这样的一个好处,相信不说你也知道了,控制用例执行,可以更好的执行你想执行的用例。更好的是用于冒烟测试。

另外还有一个也就是内置标签判断,skipif。这是一个怎么样的标签呢?

看skip后面带的if就知道了,可以做一个判断!条件为真则跳过运行,条件为假则运行用例。

@func

def test002():

print(‘这是一条最优级别的用例’)

@pytest.mark.skipif(1>2,reason=‘不运行’)

def test005():

print(“skip_reason”)

@pytest.mark.qingan

@func

def test003():

print(‘这是一条严重级别的用例’)

def test006():

print(“006冒烟”)

@pytest.mark.qingan

@func

def test004():

print(‘这是一条较严重级别的用例’)

pytest -k test_speack.py -sv我在用例005处写了一个skipif的判断,1>2是FALSE,所以此处不跳过。

所以此处为真的条件就不举例了,此处直接告诉各位答案了。


前置后置

====

在unittest你肯定看到过setup这一类的函数,看下面的例子

class Testcasse():

“”“前置后置”“”

def setup(self):

print(“1每个用例的前置”)

def teardown(self):

print(“2每个用例的后置”)

def setup_class(self):

print(“3所有用例的前置”)

def teardown_class(self):

print(“4所有用例的后置”)

def test_004(self):

print(“004”)

def test_005(self):

print(“005”)

其中的顺序是怎么样的呢。是否跟之前说的全部无优先级呢?运行一下就知道了。

这里就很明显了,优先级是3124,这里别误会,我在print里面加了数字,说一 这里就这样简写了。下面两个用例004,005是用于分辨的,不然运行不起来。各位可以自己跑一跑。这与pytest本身的规则有关系。


fixture

=======

这里很容易弄错写成fixtrue,所以需要注意一些。怎么用呢?fixture可以实现我们在pytest的用例中调佣其他函数,可以发现我们使用fixture是在被调用函数之上添加我们的fixture。看例子:

@pytest.fixture

def login():

print(“login”)

return “运行用例”

def test_seacher():

print(login) # 返回的是一个地址

print(f"搜索用户名{login}")

def test_seacher1(login):

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
01253105.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5riF5a6J5peg5Yir5LqL,size_20,color_FFFFFF,t_70,g_se,x_16)

这里就很明显了,优先级是3124,这里别误会,我在print里面加了数字,说一 这里就这样简写了。下面两个用例004,005是用于分辨的,不然运行不起来。各位可以自己跑一跑。这与pytest本身的规则有关系。


fixture

=======

这里很容易弄错写成fixtrue,所以需要注意一些。怎么用呢?fixture可以实现我们在pytest的用例中调佣其他函数,可以发现我们使用fixture是在被调用函数之上添加我们的fixture。看例子:

@pytest.fixture

def login():

print(“login”)

return “运行用例”

def test_seacher():

print(login) # 返回的是一个地址

print(f"搜索用户名{login}")

def test_seacher1(login):

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-y5u5pZRM-1713560129314)]

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

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值