本篇已上传到 GitHub
注意:读写操作时需分开进行,不能用同一个实例,否则会重复写入之前配置文件中存在的内容。
case_id | case_num | title | url | method | body | headers | assert | status | token |
---|---|---|---|---|---|---|---|---|---|
测试用例ID | 测试用例编号 | 测试用例标题 | 接口资源地址 | 接口请求方法 | 接口参数 | 请求头 | 断言 | 接口状态码 | 存放cookies |
@logger.catch()
:捕获运行中的异常写入error日志文件
auto_request()
:需要传入url、method、body,函数会根据method方法判断接口请求方式
注意:
url
根据配置文件主机地址加上资源路径,所以auto_request()
函数url只需传入资源路径
@logger.catch()
def auto_request(url, method, body=None, headers=None, files=None, allow_redirects=True, timeout=5):
all_url = str(url_head) + str(url)
global get_response
global post_response
try:
logger.info('开始请求接口:{all_url}', all_url=all_url)
if method == 'GET':
get_response = requests.get(url=all_url, headers=headers, params=body, files=files, allow_redirects=allow_redirects, timeout=timeout)
logger.success('接口请求成功,等待返回数据。请求URL:{get_response_url}', get_response_url=get_response.url)
elif method == 'POST':
post_response = requests.post(url=all_url, headers=headers, data=body, files=files, allow_redirects=allow_redirects, timeout=timeout)
logger.success('接口请求成功,等待返回数据。请求URL:{post_response_url}', post_response_url=post_response.url)
else:
logger.warning('接口method方法错误,请检查后重试')
raise Exception('接口请求方法错误,暂无' + str(method) + '方法')
except BaseException as e:
logger.error('接口请求时发生异常:{all_url},异常:{e}', all_url=all_url, e=e)
else:
if method == 'GET':
logger.success('接口请求执行成功,返回数据成功')
# logger.success('接口请求执行成功,返回数据:{get_response}', get_response=get_response.content)
return get_response.text
elif method == 'POST':
logger.success('接口请求执行成功,返回数据成功')
# logger.success('接口请求执行成功,返回数据:{post_response}', post_response=post_response.json())
return post_response.json()
finally:
logger.info('接口执行完毕')
select_one()
:需要传入表名、字段、值,函数会返回在数据库查询到的数据
select_all()
:传入表名,函数会返回在数据库表的所有数据
def select_one(self, table_name=None, field_name=None, value_name=None):
cursors = self.creat_connect()
sql = 'select * from %s where %s = "%s"' % (table_name, field_name, value_name)
try:
cursors.execute(sql)
logger.success('执行查询SQL语句:{sql}', sql=sql)
except BaseException as e:
logger.warning('SQL语句执行异常,请检查SQL语句:{sql},异常:{e}', sql=sql, e=e)
else:
result = cursors.fetchall()
logger.success('数据库返回查询数据:{result}', result=result)
return result
finally:
cursors.close()
self.close_base()
def select_all(self, table_name=None):
cursors = self.creat_connect()
sql = 'select * from %s' % table_name
try:
cursors.execute(sql)
logger.success('执行查询SQL语句:{sql}', sql=sql)
except BaseException as e:
logger.warning('SQL语句执行异常,请检查SQL语句:{sql},异常:{e}', sql=sql, e=e)
else:
all_result = cursors.fetchall()
logger.success('数据库返回查询数据:{all_result}', all_result=all_result)
return all_result
finally:
cursors.close()
self.close_base()
debug_logs_path
:传入日志路径
filter
:设置日志等级
enqueue
:支持异步写入
rotation
:每天0点日志写入新文件
retention
:日志保留时间
logger.add(debug_logs_path,
filter=lambda x: x['level'].name == 'DEBUG',
enqueue=True,
rotation='00:00',
encoding='utf-8',
retention='30 days'
)
用例模板:
从数据库取数据
取出的数据传入auto_request
断言响应数据和断言是否一致
注意:数据库取出来的断言数据类型是否和响应数据类型一致,否则会断言失败
sql = SQL().select_all(table_name='testcase_cjxm')
def test_ZCJK(self):
url = sql[0]['url']
method = sql[0]['method']
body = eval(sql[0]['body'])
assertion = eval(sql[0]['assert'])
result = auto_request(url=url, method=method, body=body)
self.assertEqual(result['error_code'], assertion[0]['error_code'] or assertion[1]['error_code'])
output
:测试报告存放路径
stream
:测试报告文件流
report_title
:测试报告标题
descriptions
:测试报告描述
if __name__ == '__main__':
one_file_path = report_path + '\\' + file_name
fp = open(one_file_path, 'a', encoding='utf-8')
one_run = HTMLTestRunner(output=report_path, stream=fp, report_title='测试报告', descriptions='用例执行情况')
one_run.run(one_test_case)
fp.close()
unittest
框架select_one()
、select_all()
方法查询数据库数据,请求auto_request()
传入数据库查询的数据