布道师玄柯的测试江湖 《Python 测试开发技术栈—巴哥职场进化记》—一道作业题

布道师玄柯 · 2020年08月15日 · 最后由 布道师玄柯 回复于 2020年08月19日 · 2244 次阅读

上文《Python 测试开发技术栈—巴哥职场进化记》—软件测试工程师 “兵器库”我们讲到了软件测试工程师常用的一些工具,巴哥被软件测试工具的广而全所折服。今天我们来看看巴哥会经历哪些事情,故事还在继续……

01 一道作业题

早上开过站会后,华哥来到巴哥工位上,神秘的笑着说:

“巴哥,你会 Python 还是 Java?”

“我都会一点,Python 之前自学过,Java 在大学里的课程里是有的”,巴哥回答道。

“那好啊,给你出一道作业题,考考你写代码的能力咋样!你用 Python 实现将日志写入本地文件的功能”,华哥说道。

“这不难实现啊,直接用 open 方法打开一个文件,写入日志内容不就行了”,巴哥心里嘀咕道。

于是巴哥按照自己的理解,实现了一个版本,发给了华哥,其实核心代码就两行,不得不感叹 Python 语言的简洁。

def write_log_file(content):
    """
    将日志写入到文件中
    :return:
    """
    with open("log.txt", "w+") as log_file:
        log_file.write(content)

if __name__ == '__main__':
    write_log_file("test log")

华哥看了看巴哥提交的代码,只回复他了一句话:“我给你提个需求吧?!”

02 华哥的需求

“日志文件,每天都会产生,需要将他们分开存储,方便查看。”

“日志内容,需要显示打印日志的时间、调用打印日志的方法名”

“支持多人同时调用你的这个方法写日志。”

“你先实现这三个功能,将你的方法完善下”,华哥笑着说道。

巴哥被惊到了,没想到听上去一个小小的功能,里面需要考虑的情况这么多。

虽然有些东西自己也没想明白,只能硬着头皮去实现了。

“实在不行,还有搜索大法呢”,巴哥心想道。

首先日志文件如果想以天为维度来存储,可以使用时间命名,这个比较简单。

其次在日志内容中打印时间简单,不过获取调用打印日志的方法得研究下。

经过查资料,发现 Python 的 sys._getframe() 可以用来查看函数被什么函数调用,以及被调用函数的行号,正好能满足需要。

最后就是需要支持多线程同时写日志文件,需要用到 Python 中 fcntl 库,它提供了文件加锁机制,避免日志信息丢失。

想清楚上面三个问题的实现方案,巴哥又实现了一个版本。

import sys
import time
import fcntl

def write_log_file(content):
    """
    将日志写入到文件中
    :return:
    """
    # 获取格式化时间
    file_name_format = time.strftime("%Y%m%d", time.localtime())
    log_time_format = time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime())

    # 调用的模块的名称,以py结尾,截取其中的py文件名
    call_file_name = sys._getframe().f_code.co_filename
    call_file_names = call_file_name.split("/")
    call_file_name = call_file_names[len(call_file_names) - 1 ]
    # 获取调用打印日志的方法名
    call_method_name = sys._getframe().f_code.co_name
    # 获取调用打印日志方法的行数
    call_no = sys._getframe().f_back.f_lineno
    # 格式化日志
    log_content_format = "{} {}:{}():{} {} \n"
    with open("{}.log".format(file_name_format), "a") as log_file:
        # 加锁,注意,不需要手动解锁,在with方法之外,会自动解锁
        fcntl.flock(log_file.fileno(), fcntl.LOCK_EX)
        log_file.write(log_content_format.format(log_time_format, call_file_name, call_method_name, call_no, content))

if __name__ == '__main__':
    write_log_file("测试日志")
    write_log_file("我要测试日志")

巴哥将代码再次发送给华哥,并且将日志内容截了个图,让华哥直接看看效果。

dFNsz9.png

03 Python 日志的利器

“你这能满足咱基本的需要了,不过,短短的时间里你能写出来,也是不错的”,华哥看了看巴哥的代码说道。

“华哥,你们平时工作中都用什么来打印日志呀?我得学习学习”,巴哥期待的看着华哥。

“那就给你推荐一款 Python 日志的利器—loguru,它是一个开源的 Python 库”,华哥说道。

“那 loguru 主要厉害在什么地方呢?”,巴哥疑惑的看着华哥。

"可以用四个字概括:简单、强大",华哥得意的说道。

“简单是说它只需要一行代码 from loguru import logger 导入方法就能使用”

“功能强大是说它不仅打印日志带颜色、还可格式化日志、过滤日志、根据一定规则保存到文件等等”。

“可以到github上看更详细的介绍”,华哥补充道。

“好的,我这就试试去”,巴哥已经迫不及待的想体验一把。

04 用好开源工具

其实,在软件测试的各个方面,都已经有了成熟的开源方案,或者现成的工具可供选择。

所以,在我们平时的工作中,碰到问题或者产生了哪些方面的需求。

可以先去 github 上找找有没有对应的开源工具。

但是,建议在使用开源工具的同时,能够阅读源码,读懂作者的设计思路。

为了,能结合你们公司的具体情况,做定制化的一些二次开发。

巴哥在当天的工作日报中总结到。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册