Pytest测试实战
本文章主要详细地阐述下Pytest测试框架中Conftest.py特性。
Conftest.py实战
Fixture强大的特性在实际的工作中是非常有价值并且是实用的,这样可以根据需求,在对应的测试模块中编写Fixture函数来达到测试需求的目的。但是这样也产生了新的问题,如有三个测试模块,并且测试需求都是需要Fixture函数,那么也就意味着每个测试模块都需要编写对应的Fixture函数代码了。这样显然是很不合理的。但是这样的案例在企业里面也是非常常见的情况,如授权的Fixture函数,不管哪个测试模块都是需要这个Fixture函数的。既然存在问题,有没有好的解决思路呢?在Pytest测试框架中提供了conftest.py来专门解决这部分问题。 通过conftest.py可以共享Fixture, 再本质的说就是通过conftest.py⽂件来达到共享Fixture函数。根据这个特性可以把一个测试工程中有多个测试模块共同使用到的公共Fixture函数分离到conftest.py文件中。使用conftest.py文件需要注意的点是:conftest.py是一个模块文件,但是不能导入。第二是建议把conftest.py文件位置存放在测试工程的根目录下,如下所示。
在工程的根目录下不言而喻,它是能够针对工程下所有的测试模块里面符合执行的所有测试函数(测试方法)都是共享Fixture函数的。这里以登录授权为案例,演示下授权的Fixture函数分离到conftest.py文件后,如何在多个测试模块中达到共享的特性。在test包下创建测试模块。在conftest.py里面编写获取授权登录的TOKEN的Fixture函数,源码如下:
import pytest
import requests
@pytest.fixture()
def login():
r=requests.post(
url='http://0.0.0.0:8000/login/auth/',
json={"username":"13484545195","password":"asd888"},
headers={'content-type':'application/json'})
return r.json()['token']
@pytest.fixture()
def headers(login):
return {'Authorization':'JWT {token}'.format(token=login)}
在测试模块中分别调用conftest.py里面的Fixture函数headers,test_index.py模块源码如下。
import requests
def test_case_index(headers):
r=requests.get(url='http://0.0.0.0:8000/interface/index',headers=headers)
assert r.status_code==200
test_platform.py源码如下。
import requests
def test_case_query(headers):
r=requests.get(
url='http://0.0.0.0:8000/interface/products?name=XX课堂',
headers=headers)
assert r.status_code==200
整体目录结构如下所示。
在测试模块中都引用了conftest.py里面的Fixture函数headers,执行test包下所有的测试模块,执行后的结果信息如下。
如上所示可以看到执行结果都是通过的。
特别需要强调的是在一个测试工程下,不建议使用多个conftest.py的文件,这样会引起混乱,而且维护成本也高。不是所有的Fixture函数都是需要分离到conftest.py的,分离到conftest.py文件的Fixture函数一定是多个测试模块都共同需要共享这个Fixture函数,如果某个Fixture函数仅仅是某个测试模块中私有使用,这种情况其实完全就没分离的必要性。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!