1.pytest自动化测试框架需要有
config/: 配置文件
database/: 测试用例模板文件即数据库和邮箱发送配置
db_fixture/:初始化接口测试模板
lib/:程序公用模板 包含excel读写、发送邮件、发送请求、生成最新的测试报告文件
report/: 生成接口自动化测试报告
testcase/: 测试用例
run.py 执行所有接口测试用例的主程序
接口自动化测试用例的维护方法:1.Excel 2.yaml 3.db数据库 4.代码
以db和代码维护的是精细化场景。用Excel和yaml维护的用例通常用于回归和冒烟为主
用例加在testcase中。请求 URL:http://121.41.14.39:9097/api/loginS 前面的维护在配置文件中
2.配置文件要有环境设置
2.1envSettings.py,测试环境、预生产环境、正式环境不同环境的URL不同。环境维护在一个字典里
-- coding:utf-8 --
环境字典,用来维护所有的环境地址
env_dict = {
"test": "http://324234:899", # 测试环境的地址(我乱写的,实际不存在
"uat": "http://4324234:6868", # 预生产环境的地址(我乱写的,实际不存在
"pro": "http://121.41.14.49:9097" # 这个地址同学们可以访问
}
指向当前环境
current_env = "pro"
请求地址
current_url = env_dict[current_env]
2.2配置文件中关于路径文件pathSettings.py--------
--- coding:utf-8 ---
维护路径相关的文件
import os
动态获取项目根路径,
os.path.dirname(file)作用:无论在哪个电脑上都能取得pathSettings.py绝对路径,向上两层就是项目根路径
base_dir = os.path.dirname(os.path.dirname(file))
测试用例所在文件夹路径
test_case_dir = os.path.join(base_dir, "testcase")
if name =='main':
print(base_dir)
print(test_case_dir)
3.lib中要有public.py文件---------
-- coding:utf-8 --
import hashlib
def get_md5(pwd):
"""
处理数据,返回md5加密后的结果
:param pwd: 需要加密的内容
:return: 加密后的结果
"""
# 实例化一个 MD5对象
md5 = hashlib.md5()
# 调用加密方法进行加密
md5.update(pwd.encode("utf8"))
return md5.hexdigest() # 返回十六进制的加密结果
if name == 'main':
print(get_md5("123abc"))
4.testcase中有case.xlsx,如下图--------
需要一个test_login_case.py文件来执行用例如下。
--- coding:utf-8 ---
import os
import json
import pytest
import requests
import pandas as pd # 处理excel的模块
from config.envSettings import current_url # 项目环境地址
from lib.public import get_md5 # 加密密码
from config.pathSettings import test_case_dir
读取excel
def read_case(path, sheet_name):
# 从Excel中指定的sheet页读出数据
df = pd.read_excel(path, sheet_name=sheet_name)
# 处理空单元格的 固定用法
df.fillna("", inplace=True)
# 处理掉空单元格,得到的还是一行一行数据,转为字典格式,有4个字典用列表维护,把字典依次存储在一个列表中
# 1-初始化一个空列表
df_list = []
# 2-循环处理Excel中的数据
for i in df.index.values:
# 得到的i是一行数据,组成字典需要读一下.
df_line = df.loc[i, ["用例编号", "用例名称", "用例说明", "接口地址路径",
"请求方式", "请求头", "请求参数", "预期结果",
"预期返回数据", "实际返回数据", "测试结果"]].to_dict()
用中括号读出的标题“用例编号 "用例名称"...”做为字典的key,每个表格中做为value
将每一行转换成字典的数据,添加进列表
df_list.append(df_line)
#返回列表中数据
return df_list
pytest 数据驱动--参数化执行测试用例
以下代码,会从case.xlsx中读出所以的测试赛用例数据,一次带入test login函数执行
@pytest.mark.parametrize("case_data", read_case(os.path.join(test_case_dir, "case.xlsx"), "1-登录模块"))
装饰器:在不修改原函数代码的情况下为函数添加新的功能
在不修改测试环境登录接口的函数,为函数增加两个循环
def test_login_case(case_data):
1--构造接口请求的url
url = "".join([current_url, case_data["接口地址路径"]]) #字符串的内置方法
print("\n****步骤一****")
print("接口请求的地址是", url)
2--构造接口请求参数
将请求参数读出,并将字符串转换为字典;;json.dumps()函数可将字典转换为字符串
payload = json.loads(case_data["请求参数"])
# -将密码明文加密
payload["password"] = get_md5(payload["password"]) #字典中键值对的重新赋值
print("\n****步骤二****")
print("接口参数是", payload)
3--发送请求并获取请求结果
req = requests.post(url=url, json=payload)
print("\n****步骤一****")
print("请求结果是", req)
4--断言
assert req.status_code == 200 #接口是通的,正常工作
#assert req.json()["token"] is not None
if name == 'main':
pytest.main(["-s", "--alluredir=./report"])
--运行test_login_case.py后会在testcase下生成report,
在cmd者pycharm终端输入;allure serve ./testcase/report 可打开测试报告。如下图
excel只能执行结果为通过的用例。