布道师玄柯的测试江湖 《Python 测试开发技术栈—巴哥职场进化记》—一道作业题
上文《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("我要测试日志")
巴哥将代码再次发送给华哥,并且将日志内容截了个图,让华哥直接看看效果。
03 Python 日志的利器
“你这能满足咱基本的需要了,不过,短短的时间里你能写出来,也是不错的”,华哥看了看巴哥的代码说道。
“华哥,你们平时工作中都用什么来打印日志呀?我得学习学习”,巴哥期待的看着华哥。
“那就给你推荐一款 Python 日志的利器—loguru,它是一个开源的 Python 库”,华哥说道。
“那 loguru 主要厉害在什么地方呢?”,巴哥疑惑的看着华哥。
"可以用四个字概括:简单、强大",华哥得意的说道。
“简单是说它只需要一行代码 from loguru import logger 导入方法就能使用”
“功能强大是说它不仅打印日志带颜色、还可格式化日志、过滤日志、根据一定规则保存到文件等等”。
“可以到github上看更详细的介绍”,华哥补充道。
“好的,我这就试试去”,巴哥已经迫不及待的想体验一把。
04 用好开源工具
其实,在软件测试的各个方面,都已经有了成熟的开源方案,或者现成的工具可供选择。
所以,在我们平时的工作中,碰到问题或者产生了哪些方面的需求。
可以先去 github 上找找有没有对应的开源工具。
但是,建议在使用开源工具的同时,能够阅读源码,读懂作者的设计思路。
为了,能结合你们公司的具体情况,做定制化的一些二次开发。
巴哥在当天的工作日报中总结到。