【Python接口自动化测试】(18)增加log功能
增加log功能
1、新建config.py
代码实现:
# -*- coding:GBK -*- import logging logging.basicConfig(level=logging.DEBUG, # log level日志级别 format='[%(asctime)s] %(levelname)s [%(funcName)s: %(filename)s, %(lineno)d] %(message)s', # 日志格式 datefmt='%Y-%m-%d %H:%M:%S', # 日志格式 filename='log.txt', # 日志输出文件 filemode='a') # 追加模式 if __name__ == "__main__": logging.info("hello.yin")
运行后在当前目录下生成log.txt,内容如下:
[2021-11-11 17:28:16] INFO [<module>: config.py, 11] hello.yin
1.1 Log Level:
- CRITICAL: 用于输出严重错误信息
- ERROR: 用于输出错误信息
- WARNING: 用于输出警示信息
- INFO: 用于输出一些提升信息
- DEBUG: 用于输出一些调试信息
优先级 CRITICAL > ERROR > WARNING > INFO > DEBUG 指定level = logging.DEBUG所有等级大于等于DEBUG的信息都会输出 若指定level = logging.ERROR
WARNING,INFO,DEBUG小于设置级别的信息不会输出
1.2 日志格式:
- %(levelno)s: 打印日志级别的数值
- %(levelname)s: 打印日志级别名称
- %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
- %(filename)s: 打印当前执行程序名
- %(funcName)s: 打印日志的当前函数
- %(lineno)d: 打印日志的当前行号
- %(asctime)s: 打印日志的时间
- %(thread)d: 打印线程ID
- %(threadName)s: 打印线程名称
- %(process)d: 打印进程ID
- %(message)s: 打印日志信息
1.3 项目使用log 将所有print改为log,如db.py 部分
import pymysql from config import * # 封装数据库查询操作 def query_db(sql): conn = get_db_conn() cur = conn.cursor() logging.debug(sql) # 输出执行的sql cur.execute(sql) conn.commit() result = cur.fetchall() logging.debug(result) # 输出查询结果 cur.close() conn.close() return result # 封装更改数据库操作 def change_db(sql): conn = get_db_conn() cur = conn.cursor() logging.debug(sql) # 输出执行的sql try: cur.execute(sql) conn.commit() except Exception as e: conn.rollback() logging.error(str(e)) # 输出错误信息 finally: cur.close() conn.close()
1.3 用例中使用
新建read_excel_log.py
代码实现:
# -*- coding:utf-8 -*- import unittest import requests import json from read_excel import * # 导入read_excel中的方法 from config import * class TestUserLogin(unittest.TestCase): @classmethod def setUpClass(cls): cls.datalist = excel_to_list("test_user_data.xlsx", "TestUserLogin") # 读取该测试类所有用例数据 # cls.data_list 同 self.data_list 都是该类的公共属性 def test_user_login_normal(self): case_data = get_test_data(self.datalist, "test_user_login_normal") # 从数据列表中查找到该用例数据 if not case_data: # 有可能为None logging.error("用例数据不存在") url = case_data.get('url') # excel中的标题也必须是小写url print(url) data = case_data.get('data') # 注意字符串格式,需要用json.loads()转化为字典格式 print(data) expect_res = case_data.get('expect_res') # 期望数值 print(expect_res) res = requests.post(url=url, json=json.dumps(data)) # 表单请求,数据转换为字典格式 logging.info("测试用例:{}".format("test_user_login_normal")) logging.info("url:{}".format(url)) logging.info("请求参数:{}".format(data)) logging.info("期望结果:{}".format(expect_res)) logging.info("实际结果:{}".format(res.text)) self.assertEqual(json.loads(res.text), expect_res) # 断言 if __name__ == "__main__": unittest.main(verbosity=2)
项目下log.txt输出结果:
[2021-11-12 10:38:57] DEBUG [_new_conn: connectionpool.py, 231] Starting new HTTP connection (1): 127.0.0.1:5000 [2021-11-12 10:38:57] DEBUG [_make_request: connectionpool.py, 461] http://127.0.0.1:5000 "POST /api/user/login/ HTTP/1.1" 200 36 [2021-11-12 10:38:57] INFO [test_user_login_normal: read_excel_log.py, 27] 测试用例:test_user_login_normal [2021-11-12 10:38:57] INFO [test_user_login_normal: read_excel_log.py, 28] url:http://127.0.0.1:5000/api/user/login/ [2021-11-12 10:38:57] INFO [test_user_login_normal: read_excel_log.py, 29] 请求参数:{"name": "张 三", "password": "123456"} [2021-11-12 10:38:57] INFO [test_user_login_normal: read_excel_log.py, 30] 期望结果:<h1>登录成功</h1> [2021-11-12 10:38:57] INFO [test_user_login_normal: read_excel_log.py, 31] 实际结果:"<h1>\u767b\u5f55\u6210\u529f</h1>"
因为每个用例都要输出很多log信息,我们封装一个case_log的函数 项目下新建case_log.py
# -*- coding:utf-8 -*- from config import * import json def log_case_info(case_name, url, data, expect_res, res_text): if isinstance(data, dict): data = json.dumps(data, ensure_ascii=False) # 如果data是字典格式,转化为字符串 logging.info("测试用例:{}".format(case_name)) logging.info("url:{}".format(url)) logging.info("请求参数:{}".format(data)) logging.info("期望结果:{}".format(expect_res)) logging.info("实际结果:{}".format(res_text))
简化后的用例log输出
1 # -*- coding:utf-8 -*- 2 import unittest 3 import json 4 import requests 5 from config import * 6 from read_excel import * 7 from case_log import log_case_info # 导入方法 8 9 10 class TestUserLogin(unittest.TestCase): 11 @classmethod 12 def setUpClass(cls): 13 cls.data_list = excel_to_list("test_user_data.xlsx", "TestUserLogin") 14 15 def test_user_login_normal(self): 16 case_data = get_test_data(self.data_list, "test_user_login_normal") 17 if not case_data: 18 logging.error("用例数据不存在") 19 url = case_data.get("url") 20 print(url) 21 data = case_data.get("data") 22 print(data) 23 expect_res = case_data.get("expect_res") 24 print(expect_res) 25 26 res = requests.post(url=url, json=json.dumps(data)) 27 log_case_info("test_user_login_normal", url, data, expect_res, res_text=res) 28 self.assertEqual(json.loads(res.text), expect_res) 29 30 31 if __name__ == "__main__": 32 unittest.main(verbosity=2)
执行输出:
Testing started at 11:14 ... C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe "C:\Program Files\JetBrains\PyCharm 2018.2\helpers\pycharm\_jb_unittest_runner.py" --path D:/00test/apiTestFramework/log/read_excel_log2.py Launching unittests with arguments python -m unittest D:/00test/apiTestFramework/log/read_excel_log2.py in D:\00test\apiTestFramework\log http://127.0.0.1:5000/api/user/login/ {"name": "张 三", "password": "123456"} <h1>登录成功</h1> Ran 1 test in 0.017s
日志记录:
[2021-11-12 11:14:05] DEBUG [_new_conn: connectionpool.py, 231] Starting new HTTP connection (1): 127.0.0.1:5000 [2021-11-12 11:14:05] DEBUG [_make_request: connectionpool.py, 461] http://127.0.0.1:5000 "POST /api/user/login/ HTTP/1.1" 200 78 [2021-11-12 11:14:05] INFO [log_case_info: case_log.py, 9] 测试用例:test_user_login_normal [2021-11-12 11:14:05] INFO [log_case_info: case_log.py, 10] url:http://127.0.0.1:5000/api/user/login/ [2021-11-12 11:14:05] INFO [log_case_info: case_log.py, 11] 请求参数:{"name": "张 三", "password": "123456"} [2021-11-12 11:14:05] INFO [log_case_info: case_log.py, 12] 期望结果:<h1>登录成功</h1> [2021-11-12 11:14:05] INFO [log_case_info: case_log.py, 13] 实际结果:<Response [200]> [2021-11-12 11:14:15] DEBUG [_new_conn: connectionpool.py, 231] Starting new HTTP connection (1): 127.0.0.1:5000 [2021-11-12 11:14:15] DEBUG [_make_request: connectionpool.py, 461] http://127.0.0.1:5000 "POST /api/user/login/ HTTP/1.1" 200 36 [2021-11-12 11:14:15] INFO [log_case_info: case_log.py, 9] 测试用例:test_user_login_normal [2021-11-12 11:14:15] INFO [log_case_info: case_log.py, 10] url:http://127.0.0.1:5000/api/user/login/ [2021-11-12 11:14:15] INFO [log_case_info: case_log.py, 11] 请求参数:{"name": "张 三", "password": "123456"} [2021-11-12 11:14:15] INFO [log_case_info: case_log.py, 12] 期望结果:<h1>登录成功</h1> [2021-11-12 11:14:15] INFO [log_case_info: case_log.py, 13] 实际结果:<Response [200]>
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
本文来自博客园,作者:hello_殷,转载请注明原文链接:https://www.cnblogs.com/yinzuopu/p/15541013.html
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。