51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 818|回复: 0
打印 上一主题 下一主题

[转贴] 给接口自动化测试框架增色,实现企业微信测试报告

[复制链接]
  • TA的每日心情
    擦汗
    昨天 09:05
  • 签到天数: 1048 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-4-20 11:35:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    摘要:作者在新项目中搭建了python+requests+unittest+HTMLTestRunner接口自动化测试框架,通过修改配置文件实现环境隔离,一份脚本即可在不同的环境执行接口测试用例。
      但是没有实现任何形式的消息通知,也没有集成到jenkins,原因很简单,因为还没做到很大,而且用户活跃不够,问题也相对较少,只在上线前后执行一次uat和prod环境。
      那这几天想完善一下消息通知功能,让它具备发送消息及报告的功能。
      流程

    代码
      流程及代码功能已在注释中说明。
    1.  '''
    2.   Created on 2021年5月12日
    3.   @author: qguan
    4.   '''
    5.   import time
    6.   import unittest
    7.   from Librarys.HTMLTestRunnerNew import  HTMLTestRunnerNew
    8.   from common.dirs_config import testcases_path, report_dir
    9.   from unitconfig import env, conf
    10.   from utils.handle_notice import send_weixin, upload_weixin
    11.   # 当前时间
    12.   curTime = time.strftime("%Y-%m-%d_%H-%M")
    13.   # 创建测试套件并加载测试用例
    14.   suite = unittest.TestSuite()
    15.   loader = unittest.TestLoader()
    16.   suite.addTest(loader.discover(start_dir=testcases_path, pattern='flaget_*.py'))
    17.   # 拼接测试报告路径及文件名
    18.   report_name = report_dir + "FlagetAPI_{}_report_{}.html".format(env, curTime)
    19.   # 报告生成器
    20.   with open(report_name, "wb") as pf:
    21.       runner = HTMLTestRunnerNew(stream=pf, title="Flaget接口自动化测试报告", tester="joe-tester", description="{}环境,业务场景接口测试".format(env))
    22.       runner.run(suite)
    23.      
    24.       # 组织报告详情
    25.       msg = "\n \
    26.           执行环境:{}\n \
    27.           测试人员:{}\n \
    28.           开始时间:{}\n \
    29.           持续时间:{}\n \
    30.           测试结果:{},通过率为:{} \n \
    31.           \n \
    32.           报告详情需要在PC打开,移动端打开为HTML源码!".format(env, runner.tester, runner.startTime, runner.duration, runner.status, runner.passrate)
    33.           
    34.   # 获取企业微信key
    35.   prod_key = conf.get_value("notice", "prod_key")
    36.   uat_key = conf.get_value("notice", "uat_key")
    37.   if env == "prod":    # 只在生产环境发送报告给项目涉众
    38.       media_id = upload_weixin(key=prod_key, filename=report_name)
    39.       send_weixin(msg, key=prod_key)
    40.       send_weixin(media_id, key=prod_key, v_type="file", k_type="media_id")
    41.   elif env == "uat":    # uat环境报告发送给小组
    42.       send_weixin(msg, key=uat_key)
    复制代码
    分析
      python如何请求发送消息到企业微信;这个流程已经在其他[url=]文章[/url]中说明,这里不再赘述,或者参考企业微信的配置说明。
      python实现
    def send_weixin(msg,key=None, **kwargs):
          '''
          发送企业微信通知
          '''
          headers = {"Content-Type":"application/json"}
         
          # 地址
          url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={}"
         
          if not key:
              print("key不能为空")
              raise
         
          url = url.format(key)
              
          if not kwargs: # 默认发送文本
              v_type = "text"
              k_type = "content"
          else: # 如果有传入则按需
              v_type=kwargs.get("v_type")
              k_type=kwargs.get("k_type")
              
          # 请求主体
          data = {
              "msgtype": v_type,
              v_type: {
                  k_type: msg
              }
          }
          # 发送请求
          requests.post(url, json=data, headers=headers)

     问题:怎么上传并发送文件呢?
      仔细阅读企业微信机器人配置说明,有如何上传文件及发送;发送消息的主题根据不同的参数来选择是发送文字还是文件;
      msgtype:支持text、file、image、markdown、news等多种模版,再往下看配置说明中有上传文件的说明:

    python实现
    def upload_weixin(key=None, filename=None):
          """
          上传附件到企业微信,获得media_id.然后发送消息通知,可查看文件
          """
         
          if not key:
              print("key不能为空")
              raise
         
          # 请求地址
          url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={}&type=file".format(key)
          # 请求头
          headers = {"Content-Type":"multipart/form-data"}
          # 请求数据,是rb读取文件流
          data = {"file"pen(filename, "rb")}
          # 发送请求
          res = requests.post(url, files=data, headers=headers).json()
          # 获取结果返回的media_id是给发送消息的接口参数使用的。
          return res.get("media_id")

     总结
      上面对流程代码实现都进行了分析,如何上传文件和发送消息;再回到开始的那一片代码,逻辑理解就很清楚了;暂时这不集成jenkins。







    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-19 01:30 , Processed in 0.072845 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表