《自拍教程58》Python-批量生成Jira Bug查询语句

案例故事:有时候一个测试报告发过来,发现这个测试报告的Bug,很多信息未提及,
比如Bug严重级别(Proirity),指派给谁了(assginee),目前Bug状态(Status)等信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E55jxks7-1587127793737)(http://www.zipython.com/images/think/testenv/testreport.jpg)]
其实我们可以借助Jira的Jql(Jira Query Language)查询语句,实现批量查询这些Bug。


准备阶段
  1. 由于使用的是Jira Bug管理系统,点击Advanced就可以进入Jql高级搜索,
    《自拍教程58》Python-批量生成Jira Bug查询语句
    输入类似:issuekey in (QTBUG-51184, QTBUG-53341)的Jql预计即可实现搜索,
    《自拍教程58》Python-批量生成Jira Bug查询语句

  2. 可以将邮件内容存储到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)
上一篇:Daliy Algorithm (贪心,gcd)-- day 58


下一篇:LeetCode 剑指offer 面试题58 - II. 左旋转字符串 多种语言解法