最全Python自动化测试框架之Pytest教程(3),2024-2024华为软件测试面试真题

img
img
img

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

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

需要这份系统化的资料的朋友,可以戳这里获取

· pip install -U pytest

Pytest用例设计原则

· 测试类以Test开头,并且不能带有init方法

· 以test_开头的函数

· 以Test开头的类

· 所有的包pakege必须要有__init__.py文件

· 断言使用assert

运行Pytest的两种方式

· Pycharm里代码运行

pytest.main([“test.py”])

· 命令行运行方式

pytest test.py# 运行指定类下的指定方法pytest 文件名::类名::方法名

Pytest参数说明

· -v  说明:可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等

· -s  说明:输入我们用例中的调式信息,比如print的打印信息等

· -x:遇到错误的用例,立即退出执行,并输出结果

· -v:表示查看详细的报告内容

· -collect-only:表示把待执行的用例全部展示出来

· -lf:只执行上次失败的用例

· -vv :显示详细的测试结果

· -tb=no:不展示用例失败的错误详情

· -tb=line:展示用例失败的代码具体行数

· -tb=short:展示更加详细的错误信息

· -k  “关键字” 说明:执行用例包含“关键字”的用例

· -q  说明:简化控制台的输出,可以看出输出信息和上面的结果都不一样, 下图中有两个…点代替了pass结果

· -maxfail=num 当用例错误达到指定数量时,停止测试

· m  说明:执行特定的测试用例。我们再次修改一下我们的用例,并添加一个新的用例

# 如果要运行多个标识的话,用表达式,如下pytest -m “slow or faster” test_1.py  运行有slow标识或 faster标识用例pytest -m “slow and faster” test_1.py 运行有slow和faster标识的用例pytest -m “slow and not faster” test_1.py 运行有slow和没有faster标识的用例

注意:-m后面不能带’'号(单引号),只能带“”(双引号),不然识别不到

ini配置文件

· 创建pytest.ini文件(固定写法)

[pytest];固定写法;变量名不能错addopts=-vv -s ;多个参数中间空格testpaths=…/HC/huace ;多个目录中间空格python_files=test*.py ;python文件前缀,可自定义python_classes=huace ;指定类名python_functions=test* ;指定方法名,可自定义

跳过测试函数

· 跳过测试函数: 根据特定的条件,不执行标识的测试函数

-*- coding: utf-8 -*-import pytestclass Test():   def test(self):       print(“执行的是testcase的用例”)@pytest.mark.skipif(condition=1<2,reason=“1不大于2,所以不执行”)class huace():   def haha(self):       print(“执行的是haha方法里面的用例”)

Pytest之fixture

· unittest和nose都支持fixture的,但是fixture在pytest里使用更灵活。也算是pytest的一个闪光点吧

· 可以理解为一个跟setup和teardown这种前后置类似的东西。但是比它们要强大、灵活很多

fixtur当做参数传入

-*- coding: utf-8 -*-import pytest@pytest.fixture()def login():   print(‘登录系统’)# 直接使用函数名做为参数传入def test_01(login):   print(‘测试用例一’)def test_02():   print(‘测试用例2’)def test03():   print(‘测试用例3’)

运行结果

· 只有tes_01调用了login

· 遗留问题来了,如果我这里有10个方法或更多?是不是都需调用login方法?继续看下面的fixture参数

testcase.py::test_01 登录系统测试用例一PASSEDtestcase.py::test_02 测试用例2PASSEDtestcase.py::test03 测试用例3PASSED

fixture语法

scope有4个作用范围:function(不填则默认)、class、module、sessionfixture(scope=‘function’, params=None, autouse=False, ids=None, name=None)

参数说明

· scope:即作用域,function"

(默认),“class”,“module”,"session"四个

· params:可选参数列表,它将导致多个参数调用fixture函数和所有测试使用它。

· autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture

· ids:params测试ID的一部分。如果没有将从params自动生成.

· name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name。

· session的作用域:是整个测试会话,即开始执行pytest到结束测试scope参数作用范围控制fixture的作用范围:session>module>class>function

autouse

· 参数置默认为False,则需要手动去调用装饰器

-*- coding: utf-8 -*-import pytest# 当前就算定义了装饰器,也不会调用Login@pytest.fixture()def login():   print(“打开浏览器”)def test1():   print(“test1里的用例”)def test2():   print(“test2里的用例”)

调用方式1

-*- coding: utf-8 -*-import pytest@pytest.fixture()def login():   print(“打开浏览器”)# 直接传入函数名def test1(login):   print(“test1里的用例”)   def test2(login):   print(“test2里的用例”)

调用方式2

-*- coding: utf-8 -*-import pytest# autouse设为True,就能自动调用login的装饰器@pytest.fixture(autouse=True)def login():   print(“打开浏览器”)# 直接传入函数名def test1():   print(“test1里的用例”)def test2():   print(“test2里的用例”)

function

· function:作用域为函数

· 所有的方法都调用了login

-*- coding: utf-8 -*-import pytest@pytest.fixture(scope=‘function’, autouse=True)def login():   print(‘登录系统’)def test_01():   print(‘测试用例一’)def test_02():   print(‘测试用例2’)def test03():   print(‘测试用例3’)

运行结果

· 符合用例名设计的都会调用装饰器

· login不符合所以不会调用

testcase.py::test_01 登录系统测试用例一PASSEDtestcase.py::test_02 登录系统测试用例2PASSEDtestcase.py::test03 登录系统测试用例3PASSED

class

· class:作用域为类

· 所以TestCase1和TestCase2这两个类都会执行login

-*- coding: utf-8 -*-# @Time : 2021/1/14 21:05# @Author : 程序员阿沐import pytest@pytest.fixture(scope=‘class’, autouse=True)def login():   print(‘登录系统’)def test_01():   print(‘这个是类外面的用例’)class TestCase1:   def test_02(self):       print(‘测试用例2’)   def test03(self):       print(‘测试用例3’)class TestCase2:   def test_04(self):       print(‘测试用例4’)   def test05(self):       print(‘测试用例5’)

运行结果

· 类里面的方法只会调用一次

· pytest机制,因为方法是以test开头,所以也会调用

testcase.py::test_01 登录系统这个是类外面的用例PASSEDtestcase.py::TestCase1::test_02 登录系统测试用例2PASSEDtestcase.py::TestCase1::test03 测试用例3PASSEDtestcase.py::TestCase2::test_04 登录系统测试用例4PASSEDtestcase.py::TestCase2::test05 测试用例5PASSED

module

· module:在当前.py脚本里面所有用例开始前只执行一次

· 只要符合用例的设计要求,不管是类里和外边的都会调用

-*- coding: utf-8 -*-import pytest@pytest.fixture(scope=‘class’, autouse=True)def open():   print(“打开浏览器,并且打开百度首页”)def test_s1():   print(“用例1:搜索python-1”)class TestCase():   def test_s2(self):       print(“用例2:搜索python-2”)   def test_s3(self):       print(“用例3:搜索python-3”)

运行结果

· 当前文件里的用例都调用了装饰器

· 如果类名不是为Test开头你试试看是否还会调用装饰器?

testcase.py::test_s1 打开浏览器,并且打开百度首页用例1:搜索python-1PASSEDtestcase.py::TestCase::test_s2 打开浏览器,并且打开百度首页用例2:搜索python-2PASSEDtestcase.py::TestCase::test_s3 用例3:搜索python-3PASSED

session

· fixture为session级别是可以跨.py模块调用的

· 当我们有多个.py文件的用例时候,如果多个用例只需调用一次fixture,那就可以设置为scope=“session”,并写到conftest.py文件里

· conftest.py文件名称是固定的,pytest会自动识别该文件。放到工程的根目录下,就可以全局调用了

· 如果放到某个package包下,那就只在该package内有效

img
img

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

需要这份系统化的资料的朋友,可以戳这里获取

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

g-WbYnBMGa-1715386182440)]

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

需要这份系统化的资料的朋友,可以戳这里获取

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

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值