1、下载pytest,直接pycharm下载就行
2、pytest的运行方式
(1)、pytest命令不加路径时是运行当前路径,也可以指定了目录,可以单个目标文件,其实pytest也可以批量运行指定目录(如果不指定,就是当前目录)下的测试用例,为了搜索所有的测试代码,pytest会递归遍历每个目录及其子目录。
而你的测试代码,需要满足如下的命名规则:
测试文件应该用 test_ 开头或者 test 结尾
测试函数、测试方法应该以 test 开头
测试类应该以 Test 开头
(2)、运行某个文件的某个用例则需要冒号
pytest /Users/u0043159/Desktop/python_test/test_03.py::test02
(3)、运行模块中的指定方法——-pytest test_mod.py::TestClass::test_method
通过标记表达式执行——-pytest -m slow—这条命令会执行被装饰器 @pytest.mark.slow 装饰的所有测试用例
(4)、通过包执行测试—–pytest –pyargs pkg.testing—这条命令会自动导入包 pkg.testing,并使用该包所在的目录,执行下面的用例
3、pytest的断言
pytest的assert断言关键字支持使用python内置的assert表达式。可以理解为pytest的断言就是直接使用python自带的assert关键字。
Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
assert ‘a’ in ‘abc’
assert ‘a’ not in ‘bbc’
something = True
assert something
something = False
assert not something
assert 1==1
assert 1!=2
assert ‘a’ is ‘a’
assert ‘a’ is not ‘b’
assert 1 < 2
assert 2 > 1
assert 1
assert ‘c’ in (‘a’, ‘b’, 1), “{0}是否在{1}里”.format(‘c’, “(‘a’, ‘b’, 1)”)
这个可以将assert断言失败的时候,将备注信息输出到控制台,起到保错信息提示的作用
4、mark中的skip或者skipif(跳过)
场景:
1、调试时不想运行这个用例
2、标记无法在某平台上运行的测试功能(如appium的IOS和安卓不兼容的脚本)
3、当前的外部资源不可用时跳过(如果测试数据是从数据库中取到的,连接数据库的功能如果返回结果未成功就不执行跳过,因为执行也都报错)
4、在某些版本中执行,其他版本中跳过
解决:
@pytest.mark.skip跳过这个测试用例,@skip 或者skipif可以加在函数上,类上,类方法上,如果加在类上面,类里面的所有测试用例都不会执行
@pytest.mark.skipif(condition, reason=””)
作用:希望有条件地跳过某些测试用例
注意:condition需要返回True才会跳过,reason是必须传值当否则就算condition为True也不skip
举个🌰1
使用skip和skpif同理,区别就是skip无需condition且也不需要传reason
举个🌰2
可以将 pytest.mark.skip 和 pytest.mark.skipif 赋值给一个标记变量
在不同模块之间共享这个标记变量
若有多个模块的测试用例需要用到相同的 skip 或 skipif ,可以用一个单独的文件去管理这些通用标记,然后适用于整个测试用例集,公共管理,哪个用例需要就调用
这是一个skip.py的文件
这是一个要执行的test_05.py文件
执行结果是skip或skipif都使用成功了
举个🌰3
如果依赖哪些模块,不管是否找到模块或者模块版本不对则跳过用importorskip
- modname:模块名
- minversion:版本号
- reasone:跳过原因,默认不给也行
pexpect = pytest.importorskip("pexpect", minversion="0.3")
5、mark中的xfail(失败)
场景:
功能测试尚未实施或尚未修复的错误,当测试通过时尽管预计会失败(标记为pytest.mark.xfail),将在结果中显示失败,@pytest.mark.xfail标签,他的含义是期望测试用例是失败的,但是不会影响测试用例的的执行。如果测试用例执行失败的则结果是xfail(不会额外显示出错误信息);如果测试用例执行成功的则结果是xpass
举个🌰
运行结果是xfaild,如果将断言结果改成True则,运行结果为Xpass
6、使用自定义标记mark只执行部分用例
场景:只执行符合要求的某一部分用例
1:可以把一个项目划分多个模块,然后指定模块名称执行。
2:可以把用例区分级别,是否是关键用例执行,只执行关键用例
3:App自动化时,如果想Android和IOS公用一套代码时,也可以使用标记功能,标记哪些是IOS的用例,哪些是Android的,还有大部分是公共代码,如果想运行IOS代码时指定mark名称运行不执行Android就可以了,反之亦然
解决:
在测试用例方法上加@pytest.mark.标记名称
执行:
-s 参数:输出所有测试用的print信息
-m:执行自定义标记的相关用例
pytest -s test_mark.py -m 标记名称 #执行匹配标记名称的用例
pytest -s test_mark.py -m ‘not 标记名称’ #执行非标记的所有其他的用例
注册mark标记
首先在项目中根据目录创建一个文件pytest.ini(如何),这个是pytest的配置文件。然后在pytest.ini文件的markers中写入你的 mark 标记, 冒号 “:” 前面是标记名称,后面是 mark 标记的说明,可以是空字符串;注意:pytest.ini 文件中只能使用纯英文字符,绝对不能使用中文的字符(尤其是冒号和空格)!,在 pytest.ini 文件中添加参数 “addopts = –strict”,注意要另起一行,不要在 markers 中添加;添加该参数后,当使用未注册的 mark 标记时,pytest会直接报错:” ‘xxx’ not found in markers
configuration option “,方便查看报错。
注意:pytest.ini 配置文件不支持注释,不支持注释,不支持注释…
[pytest]
markers =
web : ‘marks tests as web’
app : ‘marks tests as app’
success : ‘marks tests as success’
failed : ‘marks tests as failed’
addopts = –strict-markers
命令: pytest ./ -m ‘app’——-可以是具体.py文件也可以是路径
结果为只执行了当前的目录下所有文件的app标记的模块用例
将命令置为:pytest ./test_2.py -m ‘not web’——-可以是具体.py文件也可以是路径
意思为不执行该标记,执行了该文件下其他两条用例
Pytest -fixture
Pytest提供了fixture机制,通过它可以在测试执行前后执行一些操作,类似setup和teardown
fixture优势
1.firture相对于setup和teardown来说应该有以下几点优势
命名方式灵活,不局限于setup和teardown这几个命名
conftest.py 配置里可以实现数据共享,不需要import就能自动找到配置
scope=”module” 可以实现在当前模块.py文件前后调用一次
scope=”session” 以实现多个.py跨文件使用一个session来完成多个用例
@pytest.fixture函数的scope
可能的取值有function,class,module,package 或 session。他们的具体含义如下:
function,表示fixture函数在测试方法执行前和执行后执行一次。
class,表示fixture函数在测试类执行前和执行后执行一次。
module,表示fixture函数在测试脚本执行前和执行后执行一次。
package,表示fixture函数在测试包(文件夹)中第一个测试用例执行前和最后一个测试用例执行后执行一次。
session,表示所有测试的最开始和测试结束后执行一次。
通常,数据库连接和断开、测试配置文件的读取等工作,是需要放到session级别的fixture函数中,因为这些操作针对整个测试活动只需要做一次。而针对测试数据的读取,通常是function级别或者class级别的,因为测试数据针对不同的测试方法或者测试类往往都不相同。
scope=function
定义一个pytest.fixture,在函数上加入@pytest.fixture(),没有传scope的值时,默认等于function,然后把fixture的名称,当做参数传进去,在执行该fixture的用例前,先执行fixture,yield前是前置,yield后是后置,如果传多个fixture时,按从左到右顺序执行
undefined
从执行结果可以分析:
1、当scope=function的值为,不传值时默认function,作用于函数,同样适用于class的方法
2、调用时在函数/类直接把定义的fixture的名称当作参数传进去,会直接执行这个方法,等用例结束后再后置yield后面的脚本,如果定义的的fixture有return返回值,在执行方法用例需要这个值时,直接把fixture的name当做变量直接作用在语句上
3、当传两个fixture时,执行顺序按传入顺序执行,可以参考图上执行结果
scope=class
每一个类调用一次(只限制了class,不限制.py文件),一个类中可以有多个方法
从 执行结果可以分析:
1:当定义fixture的scope=class时,函数调用时每个函数用例都会执行yield前置后置两个函数体,此时作用于函数用例时和scope=function区别不大
2:类里的方法,就算每个方法都调用fixture却只执行一次yield前后两个函数体,而且两个方法的用例都执行完了才执行结束,所以scope=class时:每一个类调用一次(只限制了class,不限制.py文件),一个类中可以有多个方法,一般在第一个用例方法调用,只有一个方法时则区别不大
scope=Module
Module:每一个.py文件调用一次(只限制.py文件),该文件内就算有多个function和class,最终只执行一次fixture的内容
从执行结果可以分析:
执行整个文件,从调用该fixture的方法/类开始进行前置,等该文件所有的用例都执行完后,再执行yield的后置
由此看出:每一个.py文件调用一次(只限制.py文件)**当.py文件有多个scope = module装饰的方法或者函数时,先执行先调用的前置,然后执行第二个调用的前置,然后执行用例等所有用例执行后,再执行第二个的后置,然后再执行第一个后置,如果有第三个依次类推
多个测试用例调用一个fixture功能 conftest.py
定义的fixture,作用于当前目录/所有子目录的用例,即调用fixture的测试用例,必须是当前目录或者是当前目录到项目的根目录的整个路径链路中, 所以想要整个项目全局都能用,就在根目录下搞个conftest.py,不可以跨目录调用,如/A/a目录的用例不能调用/A/B目录下面的conftest.py的fixture
学习路径:
《pytest测试实战》新手友好版——第一章 pytest入门_幼儿园二园长的博客-CSDN博客_pytest测试实战
pytest.fixture()基础使用实例_changxingang的博客-CSDN博客
Original: https://blog.csdn.net/weixin_57976803/article/details/124591118
Author: 米兜舞动代码
Title: pytest测试框架
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/773418/
转载文章受原作者版权保护。转载请注明原作者出处!