今天整理了一下之前搭建的接口自动化框架,本项目是由python+requests+excel+pytest+allure框架构成的,针对于工作中项目搭建的。
提示:本项目通过excel编写接口测试用例,使用openpyxl库获取excel数据,封装请求方式,通过requests库发送http协议请求,使用pytest管理测试用例,生成allure报告,通过jenkins构建并定时执行脚本。
提示:以下是本篇文章正文内容,下面案例可供参考
Common层:
1、封装requests请求方法
2、读取excel
3、封装日志
4、封装数据库
5、数据处理
6、读取配置文件
7、获取路径
conf层
1、将一些数据写入配置文件中
Output层
1、输出测试报告和日志
Test_case层
1、conftest.py文件
2、测试用例
Test_data层
1、测试数据
main
执行
pytest.ini
1、pytest.ini配置文件
代码如下(示例):
def send_request(method,url,datas=None):
if method == "post" or method == "POST":
res=requests.post(url,params=data,headers=header)
elif method == "get" or method == "GET":
res=requests.get(url,params=data,headers=header)
elif method == "put" or method == "PUT":
res=requests.put(url,params=data,headers=header)
elif method == "delete" or method == "DELETE":
res=requests.delete(url,params=data)
else:
res=None
return res
代码如下(示例):
class Handel_logger(logging.Logger):
def __init__(self, filename=None):
'''
先设置收集器,读取日志级别
:param filename: 输出渠道--文件
'''
#设置收集器
log_name=conf.get("log","log_name")
# 设置日志级别
log_level = conf.get("log", "log_level")
super().__init__(log_name,log_level)
#设置输出格式:
fmt=' %(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d: %(message)s'
formatter=logging.Formatter(fmt)
# 设置输出渠道---控制台
console = logging.StreamHandler()
#将日志格式绑定到输出渠道中
console.setFormatter(formatter)
#将输出渠道添加到日志收集器中
self.addHandler(console)
#判断是否要将日志输出到日志文件
if filename:
# 设置输出渠道---控制台
output_file = logging.FileHandler(filename,encoding="utf-8")
output_file.setFormatter(formatter)
self.addHandler(output_file)
[log]
log_name = loggers.log
log_level = INFO
log_file = xxx
[case_data]
url = http://xxx/
mobile = xxx
password = xxx
[mysql]
host = xxx
port = xxx
user = xxx
password = xxx
database = xxx
charset = utf8
class Handle_db:
def __init__(self):
'''
初始化:连接数据库
步骤:1、连接数据库
2、创建游标
3、获取数据库数据
4、关闭数据库
host:
port:
user:
password:
databases:
charset:
cursorclass:
'''
self.conn=pymysql.connect(
host=conf.get("xxx","xxx"),
port=conf.get("xxx","xxx"),
user=conf.get("xxx","xxx"),
password=conf.get("xxx","xxx"),
database=conf.get("xxx","xxx"),
charset=conf.get("xxx","xxx"),
cursorclass=pymysql.cursors.DictCursor
)
#创建数据库游标
self.cur=self.conn.cursor()
#获取结果次数
def get_count(self,sql):
self.conn.commit()
count=self.cur.execute(sql)
return count
#获取一条结果
def get_onedata(self,sql):
self.conn.commit()
self.cur.execute(sql)
return self.cur.fetchone()
#获取所有结果
def get_alldata(self,sql):
self.conn.commit()
self.cur.execute(sql)
return self.cur.fetchall()
#更新数据库
def updata(self,sql):
try:
self.cur.execute(sql)
self.conn.commit()
except Exception as e:
self.conn.rollback()
raise
#关闭数据库
def close_db(self):
self.cur.close()
self.conn.close()
@pytest.mark.usefixtures("init")
class Test_login:
@pytest.mark.parametrize("case",cases)
def test_login(self,case):
res=send_request(case["method"],case["url"],case["request_data"])
expect=json.loads(case["expect"])
logger.info("响应结果为:{}".format(res.json()))
logger.info("期望结果为:{}".format(expect))
if case["expect"]:
try:
assert res.json()["code"]==expect["code"]
assert res.json()["msg"] == expect["msg"]
except Exception as e:
logger.info("断言失败")
raise
return res
import pytest
pytest.main(["-s",
"-v",
"-m","sign",
"--html=pyreports.html",
"--alluredir=allure_dir",
"--reruns","2","--reruns-delay","5"])
提示:其余内容涉及项目暂不展示