【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]>

posted on 2021-11-12 11:16  hello_殷  阅读(400)  评论(0)    收藏  举报

导航

作者:hello.殷
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。