conftest.py 是一个专门存放fixture的配置文件,文件名称不能改,然后里面的函数名称不用加test,要和pytest的测试用例区分开
重点:如果有在项目里实践过接口自动化测试的大佬刚好看到我这边文章,可以评论指点一下,实际项目里大家都是用什么框架,用例是写在哪里,感谢
app.py
BASE_URL='http:XXXXX'
md5.py
md5加密处理
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import hashlib
class StrUtil(object):
def to_md5(self, text):
md = hashlib.md5()
md.update(text.encode('utf-8'))
md5Str = md.hexdigest()
return md5Str
conftest.py
fixture设置session,实现跨文件调用token
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import pytest
import requests
from excel.md5 import StrUtil
from excel.app import BASE_URL
@pytest.fixture(scope='session', autouse=True)
def login():
url = '/admin/login'
method = 'post'
data = {
'username': '张三',
'password': '123456'
}
data['password'] = StrUtil().to_md5(data['password'])
res = requests.request(method=method,
url=BASE_URL + url,
json = data
)
token = res.json()['data']['token']
return token
run_requests.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import requests
import os
#from excel.app import BASE_URL
class RequestsUtil:
ses = requests.session()
def send_requests(self, method, url, datas=None, **kwargs):
method = str(method).lower()
if method == 'get':
res = RequestsUtil.ses.request(
method=method,
url=url,
params=datas,
**kwargs
)
elif method == 'post':
res = RequestsUtil.ses.request(
method=method,
url=url,
json=datas,
**kwargs
)
else:
pass
return res
handleExcel.py
import xlrd # 读表格用的
from xlutils.copy import copy # 写入表格用的
def read_data(file_path, i, j, point): # 从文件获取数据 i从哪列开始取,j到哪列结束,point是功能,也就是把“创建成本”传过来
my_file = xlrd.open_workbook(file_path) # 打开表格
table = my_file.sheets()[0] # 取到第一张sheet
rowcount = table.nrows # 获得行数
li = []
for row in range(1, rowcount): # 遍历所有行
for col in range(i, j): # 遍历参数所在列,定位好行号列号以后,就可以取出参数了
if table.cell(row, 0).value == point: # 这就是判断每一行的第二列的值,是不是等于“创建成本”
li.append(table.cell(row, col).value) # 如果是创建成本功能的用例,则把取出来得值存成list
return (li)
test_apiCase.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from excel_02.handleExcel02 import *
import pytest
from excel_02.run_requests02 import RequestsUtil
class TestApicase(object):
def test_creat(self,login):
data_path = '../data/test01.xlsx'
moudle= '成本创建'
urls = read_data(data_path, 2, 3, moudle) #找到测试用例文档对应的url所在列,我的是在第三列,从0开始,所以范围是(2,3),只取2,3是开口,取不到
paras = read_data(data_path, 4, 5, moudle) #取参数
methods = read_data(data_path, 3, 4, moudle) #取方法
expectCodes = read_data(data_path, 5, 6, moudle) #取响应状态
expects = read_data(data_path, 6, 7, moudle) #取响应数据
for i in range(0, len(paras)): # 循环调用接口,因为取出来的数据不止一条,也就是需要多次调用同一个接口
url = urls[0]
method = methods[0]
expectCode = expectCodes[i] # 把预期结果取出来一个
para = eval(paras[i])
res = RequestsUtil().send_requests(method,
url,
headers={"token": login},
datas=para)
resJson = res.json()
code = resJson.get('code') # 取出来返回值里的状态码,用来跟预期结果对比
if code == expectCode:
print('pass')
else:
print('fail')
if __name__ == '__main__':
pytest.main(['-vs','test_apiCase.py'])