zoukankan      html  css  js  c++  java
  • python 接口测试1 --如何创建和打印日志文件

    python自带的logging实在是不好用,推荐使用logbook

    思路如下:

    1.创建path.py文件,获取工程根路径

    2.创建log.py文件,在工程根路径下创建日志文件(文件名称按日期命名),并设置log输出等级

    3.执行测试用例,调用log文件

    具体实现如下:

    1.  path.py文件如下:   获取项目的根路径    

    os.path.abspath(path)       返回path规范化的绝对路径

    os.path.dirname(__file__)    获取当前运行脚本的绝对路径  

    因为os.path.dirname(__file__)返回脚本的路径,存在的问题:

    1)必须是实际存在的.py文件,如果在命令行执行,则会引发异常NameError: name '__file__' is not defined

    2)在运行的时候如果输入完整的执行的路径,则返回.py文件的全路径如:

    Python c:/test/test.py 则返回路径 c:/test ,如果是python test.py 则返回空

    所以 结合os.path.abspath用,效果会好

    os.path.dirname(os.path.abspath(__file__)),os.path.abspath(__file__)返回的是.py文件的绝对路径

    这就是os.path.dirname(__file__)的用法,其主要总结起来有:
    1)不要已命令行的形式来进行os.path.dirname(__file__)这种形式来使用这个函数

    2)结合os.path.abspath()使用

    import os
    
    
    def file_path():
        root_path = os.path.dirname(os.path.abspath(__file__)) 
        project_path = root_path[:root_path.rfind("requests") + len("requests")]  
        return project_path

    2.log.py文件如下:

    os.path.join(path, 'log')   是指将path和 log字符串组合成文件目录,比如最终结果为 F:
    equestslog

    import logbook
    import os
    from logbook.more import ColorizedStderrHandler
    from tools.path import file_path
    
    path = file_path()
    LOG_DIR = os.path.join(path, 'log')
    if not os.path.exists(LOG_DIR):
        os.makedirs(LOG_DIR)   #  如果log不存在,在当前路径下创建一个log文件夹,
    
    
    def get_logger(name='Test', file_log=True, level=''):
        logbook.set_datetime_format('local')
    
        ColorizedStderrHandler(bubble=False, level=level).push_thread()
        if file_log:
            logbook.TimedRotatingFileHandler(os.path.join(LOG_DIR, '%s.log' % name),
                                             date_format='%Y-%m-%d-%H', bubble=True, encoding='utf-8').push_thread()
        return logbook.Logger(name)
    LOG = get_logger(file_log=True, level='INFO')
    
    
    if __name__ == "__main__":
        LOG.error('Log-info')

    3.   接口用例执行中调用log文件

    此处先说一个接口调用,有两种类库,urllib2  和requests

    urllib2 处理编码太麻烦,比起来还是选择简洁明快的requests 

     Requests 使用的是 urllib3,继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自 动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。

     Requests的使用相当简单,直接用requests.post(url,data),可见下面的例子

    import requests
    
    def  old_login():
    
    # 登陆接口
        url = "https://*****/api/login"
        params = {
            "cc": "86",
            "phone": "1771019****",
            "password": "12345678"
        }
        res = requests.post(url, data=params)
        print(res.text)
    
    # 登陆后查看账号信息
        url2 = "https://*****/api/account"
        r = requests.get(url2)
        print("账号信息是:", r.text)
    
    old_login()
    # 返回结果如下:{"code":0,"msg":null,"data":{"uid":"5adf5c6a267f40448bb5b0022db94af7","name":"王元元","type":"NORMAL"}}
    # 账号信息是: {"code":-4001,"msg":"登录token无效","data":null}
    # 第二条因为没有获取到session,登陆态,导致报错

    可以看到,当第二条请求的接口需要登录态,但是无法获取,此时requests有个特别棒的功能是  可以直接使用 

    requests.session() 保存登录态

    具体可见下面:

    import requests
    from tools import log
    
    
    class Msg:
        def __init__(self):
            self.Log = log.LOG
            self.session = requests.session()
    
        def msg_get(self,url):
            get_msg = self.session.get(url=url)
            self.Log.info("code:"+str(get_msg.status_code))
            self.Log.info("time:"+str(get_msg.elapsed.microseconds/1000)+"ms")          #  获取接口响应的时间
            self.Log.info(get_msg.text)
    
        def msg_post(self, url, data):
            post_msg = self.session.post(url=url, data=data)
            self.Log.info("code:"+str(post_msg.status_code))
            self.Log.info("time:"+str(post_msg.elapsed.microseconds/1000)+"ms")
            self.Log.info(post_msg.text)
    
    msg = Msg()
    data = {
            "cc": "86",
            "phone": "1771019***",
            "password": "1q2"
        }
    msg.msg_post(url= "https://*****/api/login",data=data )
    msg.msg_get(url="https://****/api/account")

    以上,over ~

  • 相关阅读:
    java项目中常用的定时任务实现方法
    mysql8.0只能本地连接解决方法
    自定义Mybatis Plus代码生成器(增加Vo类的生成)
    VMware的安装
    HDU 1728 逃离迷宫
    HDU2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    HDU1059 Dividing
    HDU1114 Piggy-Bank
    HDU4508 湫湫系列故事——减肥记I
    HDU 2602 Bone Collector
  • 原文地址:https://www.cnblogs.com/alwayswyy/p/7360292.html
Copyright © 2011-2022 走看看