

整理了一些软件测试方面的资料、面试资料(接口自动化、web自动化、app自动化、性能安全、测试开发等),有需要的小伙伴可以文末关注我的文末公众号,无套路自行领取~
在Pytest测试框架(一)详细地介绍了Pytest测试框架在参数化以及Fixture函数在API测试领域的实战案例以及具体的应用。本文章接着上个文章的内容继续阐述Pytest测试框架优秀的特性以及在自动化测试领域的实战。
conftest.py
在上一篇文章中阐述到Fixture函数的特性,第一是函数的返回值,第二是测试固件的特性。但是在实际的工作里面会有非常多的Fixture函数,那么怎么合理的安排更加友好呢?建议把公共的部分剥离出来统一的管理和调用,而非公共的部分就使用常规的函数来处理就可以了。在API自动化测试中公共的部分主要是认证授权的机制,也就是登录成功后返回的TOKEN在后续的请求中需要带上这个TOKEN才能够获取服务端的认可客户端才能够获取资源信息。在Pytest测试框架中可以把Fixture函数分离到conftest.py的文件中,这个文件它的特性具体如下。
它是一个模块,但是这个模块不需要导入就可以使用里面的Fixture函数
在目录结构的设计上,conftest.py文件建议在项目的第一层级目录结构中
conftest.py就是用来分离公共的Fixture函数
结合第一篇文章的案例,下来把登录认证授权代码分离到conftest.py文件中,这样测试模块使用的时候直接调用它就可以了,分离到conftest.py模块里面的代码如下。
#!/usr/bin/python3#coding:utf-8# author:无涯import pytestimport requestsimport json@pytest.fixture()def access_token():r=requests.post(url='http://47.95.142.233:8000/login/auth/',json={"username":"13484545195","password":"asd888"})return r.json().get('token',None)@pytest.fixture()def headers(access_token):return {'Authorization':'JWT {token}'.format(token=access_token)}
如上是把登录认证授权的代码分离到conftest.py的文件中,下来在测试模块里面直接调用就可以了,涉及到的测试模块的代码如下。
#! /usr/bin/env python# -*- coding:utf-8 -*-# author:无涯import pytestimport requestsimport jsondef writeID(prodctID):json.dump(str(prodctID),open('prodctID','w'))def getID():return int(json.load(open('prodctID')))def addProduct(headers):r=requests.post(url='http://47.95.142.233:8000/interface/product/',json={"name":"测试数据","product_type":"WEB","version":"1.0","master":"无涯","description":"测试"},headers=headers)writeID(prodctID=r.json()['id'])return rdef delProduct(headers):r=requests.delete(url='http://47.95.142.233:8000/interface/product/{productID}/'.format(productID=getID()),headers=headers)return r@pytest.fixture()def init(headers):addProduct(headers)yielddelProduct(headers)def test_so_product(init,headers):'''产品搜索验证'''r=requests.get(url='http://47.95.142.233:8000/interface/products?name=测试数据',headers=headers)
如上可以看到init()函数也是Fixture函数,但是并没有分离到conftest.py文件中,理由主要是init()函数它是基于业务需求而编写的Fixture函数但是并不是公共的Fixture函数,在后面随着编写测试用例越来越多的情况下,这种基于业务的Fixture函数会特别多。如上的代码执行后的结果信息如下图所示。

在企业级的API自动化测试框架中,完全的可以把conftest.py应用进去,特别是登录认证授权的这部分特性功能。
命令行解释器
在微服务架构的产品中存在一个特性就是使用不同的租户来登录系统,访问的业务形态都是一样的,但是在底层会针对数据做隔离。正因为如此,所以就会有众多的集群模式来满足底层的计算能力。那么这样在编写的测试用例上,就需要更多的灵活性,这个灵活性主要指的是不能把登录的账户和密码写死,要满足不同的集群验证模式,那么也就意味着登录的用户是可以自定义的,但是这个自定义的用户必须是系统已被订阅的租户。这样设计的优势就是可以满足不同集群验证产品的特性以及定时轮训检测不同集群的底层计算能力和系统的稳定性。使用这部分可以使用Pytest测试框架的命令行解释权完全能够解决这部分,下面针对之前的代码进行改造,把登录系统的账户与密码完全的自定义化,改造后的代码如下。
#!/usr/bin/python3#coding:utf-8# author:无涯import pytestimport requestsimport jsondef pytest_addoption(parser):'''添加pytest的自定义命令行参数'''parser.addoption('--username',action='store',default='13484545195',help='myoption: type1 or pyte2')parser.addoption('--password',action='store',default='asd888',help='myoption: type1 or pyte2')@pytest.fixture()def username(request):return request.config.getoption('--username')@pytest.fixture()def password(request):return request.config.getoption('--password')@pytest.fixture()def access_token(username,password):r=requests.post(url='http://47.95.142.233:8000/login/auth/',json={"username":username,"password":password})return r.json().get('token',None)@pytest.fixture()def headers(access_token):return {'Authorization':'JWT {token}'.format(token=access_token)}
在如上的代码中,完全的把登录的账户与密码分离了出来,这样就可以满足上面说的针对不同的集群以及集群规模化的验证模式,而且在上面也使用了默认的模式,也就是说执行的时候可以指定自定义的账户与密码,如下执行的方式是指定了账户与密码(自定义但是必须是指定的账户密码是系统的用户)
pytest -v -s test_login.py --username=13484545195 --password=asd888执行后的结果信息如下所示。

也可以执行的时候使用默认命令行指定的账户与密码,执行以及执行结果如图所示。

如上所示,使用Pytest的命令行解释器的特性,可以很轻松的解决了执行过程中随意的制定自定义的变量。
感谢您的阅读,下一篇文章介绍Pytest测试框架在测试领域的案例实战。如果您的系统的学习Pytest测试框架,
今天的分享就到此结束了, 如果文章对你有帮助,记得点赞,收藏,加关注。会不定期分享一些干货哦......
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!


可以在下方我的公众号免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
