案例故事:有时候一个测试报告发过来,发现这个测试报告的Bug,很多信息未提及,
比如Bug严重级别(Proirity),指派给谁了(assginee),目前Bug状态(Status)等信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E55jxks7-1587127793737)(http://www.zipython.com/images/think/testenv/testreport.jpg)]
其实我们可以借助Jira的Jql(Jira Query Language)查询语句,实现批量查询这些Bug。
准备阶段
-
由于使用的是Jira Bug管理系统,点击Advanced就可以进入Jql高级搜索,
输入类似:issuekey in (QTBUG-51184, QTBUG-53341)的Jql预计即可实现搜索, -
可以将邮件内容存储到input.txt文件里,Python遍历该文本,过滤出QTBUG-开头的Bug列表,生成正确的Jql后,自动保存到output.txt。
Python批处理脚本形式
记住批处理脚本的精髓: 批量顺序执行语句
# coding=utf-8
import os
import re
# 第一步:读取input.txt, 并匹配所有QTBUG-多个数字的BugID
hf1 = open("input.txt", "r")
bug_list = re.findall(r'QTBUG-\d+', str(hf1.readlines()))
bug_list = sorted(list(set(bug_list))) # 可去重, 可排序
# 第二步: 列表转字符串并生成Jql查询语句
bug_str = ",".join(bug_list)
jql_str = "issuekey in (" + bug_str + ")"
print("Jql: %s" % jql_str)
# 第三步: 将Jql查询语句写入output.txt文本里边。
hf2 = open("output.txt", "w")
hf2.write(jql_str)
# 第四步: 关闭文件句柄hf(handle file)
hf1.close()
hf2.close()
# 暂停,等待查看脚本运行结果,避免运行完毕后直接关闭运行界面
os.system("pause")
Python面向过程函数形式
面向过程函数的编程思维应该是这样的:
你需要多少个功能(函数),才能做成这个事。
把功能(函数)都尽量封装好,只暴露一些的参数接口即可。
# coding=utf-8
import os
import re
def get_buglist(input_file):
'''读取input_file,过滤出QTBUG-多个数字的Bug列表'''
with open(input_file, "r") as hf:
bug_list = re.findall(r'QTBUG-\d+', str(hf.readlines()))
return bug_list
def save_jql(output_file, jql_str):
'''将jql_str这个字符串,写入指定的output_file输出文件'''
with open(output_file, "w") as hf:
hf.write(jql_str)
# 第一步:读取input.txt, 并匹配所有QTBUG-多个数字的BugID
bug_list = get_buglist("input.txt")
# 第二步:列表转字符串并生成Jql查询语句
bug_str = ",".join(bug_list)
jql_str = "issuekey in (" + bug_str + ")"
print("Jql: %s" % jql_str)
# 第三步: 将Jql查询语句写入output.txt文本里边。
save_jql("output.txt", jql_str)
os.system("pause")
Python面向对象类形式
面向对象类的编程思维应该是这样的:
如果给你一个空白的世界,在这个世界里你需要哪些种类的事物,
这些种类的事物都具备哪些共有的属性与方法,
这些种类(类)的事物(对象),和其他种类(其他类)的事物(其他对象)有什么关系。
尽量把这些类封装好,只暴露对外的属性(变量)和方法(函数)即可。
# coding=utf-8
import os
import re
class JqlGenerator(object):
'''Jql查询语句生成器'''
def __init__(self, input_file):
self.input_file = input_file
self.jql_str = None
def generate_jql(self):
'''生成Jql并返回Jql查询语句字符串'''
with open(self.input_file, "r") as hf:
bug_list = re.findall(r'QTBUG-\d+', str(hf.readlines()))
bug_str = ",".join(bug_list)
self.jql_str = "issuekey in (" + bug_str + ")"
print("Jql: %s" % self.jql_str)
return self.jql_str
def save_jql(output_file, jql_str):
'''将jql_str这个字符串,写入指定的output_file输出文件'''
with open(output_file, "w") as hf:
hf.write(jql_str)
if __name__ == '__main__':
# 第一步:初始化一个j_obj对象, 初始化的时候传入一个input.txt文件
j_obj = JqlGenerator("input.txt")
# 第二步: 调用对象的generate_jql()函数
jql_str = j_obj.generate_jql()
# 第三步,将jql查询语句保存到output.txt
save_jql("output.txt", jql_str)
os.system("pause")
<br>
##### 运行方式与效果
以上代码的3种实现形式都可以直接运行,比如保存为generate_jql.py与input.txt放在同一个目录,
建议python generate_jql.py运行,当然也可以双击运行。
运行效果如下:
![](https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL3Rlc3RlbnYvanFsLmpwZw?x-oss-process=image/format,png)
![](https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3RoaW5rL3Rlc3RlbnYvc2VhcmNoMy5qcGc?x-oss-process=image/format,png)
##### 本案例练手素材下载
[跳转到官网下载](https://www.zipython.com/#/detail?id=446a26a9677248878d46162be2bc62e6)
武散人出品,请放心下载并使用。
<br>
> **小提示**: 为什么我要取名input.txt, output.txt,
因为武散人觉得不管是脚本代码,还是函数,其主要功能都是数据处理,
对输入(input.txt)进行数据处理后,获得输出(output.txt)的过程,
后面武散人的案例很多都这么命名,请理解并适应!
<br>
> **扩展阅读**:作为一名Python爱好者,要有敏锐的嗅觉,一看到这种需要大批量,或需要长时间执行,
就要想着如何用Python脚本来实现之, 这样才能把Python运用到时间工作中去,
又岂止Jql, 还有SQL数据库查询语句也可以参考此方法实现批量生成。
:::
<br>
更多更好的原创文章,请访问官方网站:[www.zipython.com](https://www.zipython.com)
自拍教程(自动化测试Python教程,武散人编著)
原文链接:[https://www.zipython.com/#/detail?id=446a26a9677248878d46162be2bc62e6](https://www.zipython.com/#/detail?id=446a26a9677248878d46162be2bc62e6)
也可关注“武散人”微信订阅号,随时接受文章推送。
![](https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy56aXB5dGhvbi5jb20vaW1hZ2VzL3dlY2hhdC5wbmc?x-oss-process=image/format,png)