项目结构
1.common 存放公用方法
login.py 前置条件类
public.py 获取文件指定目录类`
复制代码
2. base 存放底层方法类
method.py
复制代码
3. data 存放数据
data.xls
复制代码
4. tests 存放用例类 pytest
test_excel.py
5. utils存放工具类
operationExcel.py
复制代码
代码编写
- 底层request封装(base)
#封装requests方法
import requests
class ApiRequest(object):
def send_requests(self, method, url, data=None, params=None, headers=None, cookies=None, json=None,
files=None, auth=None, timeout=None, proxies=None, verify=None, cert=None):
self.r = requests.request(method=method, url=url, data=data, params=params, headers=headers, cookies=cookies, json=json,
files=files, auth=auth, timeout=timeout, proxies=proxies, verify=verify, cert=cert)
return self.r
复制代码
- 获取指定目录下案例集(common)
os.path.dirname(__file__) #获取当前目录
os.path.dirname(os.path.dirname(__file__)) #获取当前目录的上一级目录
#获取指定的目录
def fileDir(data):
base_path=os.path.dirname(os.path.dirname(__file__))
return os.path.join(base_path,data) #将获取到的目录返回 ##返回通过指定字符连接序列中元素后生成的新字符串。str.join(元祖)
# 获取路径下的文件,调用需要传递两个参数替换,否则使用默认的参数
def filePath(fileDir="data", fileName="data.xls"):
"""
:param fileDir: 目录
:param fileName: 文件名称
:return: 返回
"""
return os.path.join(os.path.dirname(os.path.dirname(__file__)), fileDir, fileName)
复制代码
总结: 1. os.path用法 2. join用法
- 编写测试案例(data)data.xls
- 自动化tests(pytest)
import pytest
import json
from utils.operationExcel import OperationExcel
from common.login import login_token
from base.method import ApiRequest
class Test_gwyc_api():
# def testApi(self):
# data = OperationExcel().getExcelData()
# for i in data:
# assert i == 1
#
# assert 1==2
@pytest.mark.parametrize('data', OperationExcel().getExcelData()) #装饰器进行封装用例
def test_excel(self, data, login_token):
#拿到token
assert login_token != None
# 对请求头做为空处理并添加token
headers = data[OperationExcel().case_headers]
if len(str(headers).split()) == 0:
headers = None
elif len(str(headers)) >= 0:
headers = json.loads(headers) #转换为字典
headers['X-AUTH-TOKEN'] = login_token
headers = headers
# 对请求参数做为空处理
params = data[OperationExcel().case_data]
if len(str(params).split()) == 0:
params = None
elif len(str(params)) == 0:
params = params
#断言封装
case_code = int(data[OperationExcel().case_code])
def case_result_assert(r):
assert int(r.json()['code']) == case_code #状态码
# TODO 响应值
#期望值 字典与字典的比较
# case_result = json.dumps(data[OperationExcel().case_result].strip())
# r_result = json.dumps(r.json(), ensure_ascii=False)
# assert data[OperationExcel().case_result] in json.dumps(r.json(), ensure_ascii=False) #响应数据
#执行用例
if data[OperationExcel().case_method] == 'get':
r = ApiRequest().send_requests(
method='get',
url=data[OperationExcel().case_url],
data=params,
headers=headers)
case_result_assert(r=r)
elif data[OperationExcel().case_method] == 'post':
r = ApiRequest().send_requests(
method='post',
url=data[OperationExcel().case_url],
data=params,
headers=headers)
case_result_assert(r=r)
if __name__ == '__main__':
pytest.main(['-m', 'test_gwyc_api_all.py'])
复制代码
总结: pytest 用例类Test,首字母一定要大写
- pytest.mark.parametrize是pytest自带的ddt
- 装饰器的使用
- 内部类的使用,内部类与装饰器有什么不同
- 期望值 todo 还没想好怎么断言比较好
- login.py 前置条件类(common)
import pytest
import requests
@pytest.fixture(scope='module') #fixture整个模块运行一次里面的方法
def login_token():
url = "http://****/sso-login"
headers = {"Content-Type":"application/json"}
data = {"name":(None, "usename"),"password":(None, "11111")}
r = requests.post(url=url, files=data)
return str(r.json()["data"]["X-AUTH-TOKEN"])
最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】