• 技术学得好,老婆加班少!


    国庆本来打算好好休息下的,没想到第一天就被领导的电话叫醒,说微信服务挂了,抓紧修复。

    mmp...

    这就是我老婆的第一天假期,问题修复后,老婆心有余悸,一直手动在那测试微信服务,就是往他们公众号发个消息,看是不是能够正常返回。

    我看着心疼,立志要用技术手段实现微信接口的巡检。

    这就是志气

    我先捋了下思路,技术实现的话,大概需要解决如下几个问题:

    1、微信后台接口如何测试?
    2、如何用 Python 实现?
    3、如何及时获取测试结果?
    4、如何定时执行测试?

    下面开始!

    1 微信接口如何测试?

    最开始,我比较闹心的就是微信接口怎么测,因为之前基本没有接触过。

    我先去他们微信后台找到了配置的服务接口信息,然后又再往上各种找如何测试。

    最后,找到的一个竟然是官网提供的:https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E8%B0%83%E8%AF%95&form=%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF

    官方测试工具

    于是我打开了浏览器开发者工具,查看后台请求信息:

    请求详情

    然后,我用我们熟悉的 Postman 进行接口测试,果然,OK!

    能够得到我们想要的数据。

    返回数据长这样:

    返回数据

    2 Python 如何实现接口测试?

    经过上面的分析,如何测试接口,流程已经很清晰,我们接下来要做的就是数据解析。

    由上图可见,返回的其实是一个 HTML,我们想要的数据在其中的 resultData 变量中。

    resultData 变量对应的是一个 json 数据,其中的 body 是我们最想要的内容,它还是一个 XML 格式的数据。

    resultData 对应的数据如下(已经过 UrlDecode):

    {
    	"status_line": "200	OK",
    	"header": ["Cache-Control: private",
    	"Date: Tue, 02 Oct 2018 07:50:50 GMT",
    	"X-Powered-By: ASP.NET",
    	"Set-Cookie: ASPSESSIONIDCCRCTCTQ=DPFLKAJBFOJLDAFAFNOCDDFI; path=/",
    	"Server: WWW Server/1.1",
    	"Content-Type: text/html; Charset=utf-8",
    	"Content-Length: 270"],
    	"body": "<xml><ToUserName><![CDATA[xxx]]></ToUserName><FromUserName><![CDATA[xxx]]></FromUserName><CreateTime>2018/10/2 15:50:50</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[您所查询的数码不存在,请仔细确认,谨防假冒。]]></Content></xml>",
    	"hint": "请求成功"
    }
    

    因此,主要需要做的工作就是:

    1、从返回数据中解析出 resultData 对应的数据;
    2、从 body 数据中解析出 <Content> 标签对应的内容;

    解析 resultData

    本来打算用 BeautifulSoup 解析返回的 HTML 数据,但是 resultData 其实是其中 js 代码中的一个变量,我不知道怎么处理,于是想到了用正则直接解析字符串。

    需要做的就是用正则匹配出 resultData =} 之间的内容。

    参考正则:匹配两个字符串 A 与 B 中间的字符串包含 A 但是不包含 B:

    表达式: A.*?(?=B)

    写出来我们的正则就是:

    pattern = re.compile(r'(?<=resultData = ).*?}')
    

    看着有点懵吧,正则的一大头疼问题就是难看,难懂!

    body 内容的解析

    resultData 对应数据解析完成后,我们得到了一个 json 数据,然后很容易可以获取到 body 数据。

    接下来就是解析 body 对应的 xml 数据了。

    这里,我们使用的是 xml.etree.ElementTree,解析 xml 非常简单:

    xml_data = ET.fromstring(body)
    text = xml_data.find('Content').text
    

    这个组件在之前的文章 《Python 助你填写高考志愿》也有用过,有兴趣的可以点击查阅。

    重要信息我们都获取到了,下面我们就要想怎么把接口结果发出去了。

    3 如何及时获取测试结果?

    这里,我首先想到的还是之前用过的 pushbear 的微信推送服务,因为实现很简单,而且也不是正式场合使用。

    def send_wechat(tiele, text):
        url = "https://pushbear.ftqq.com/sub?sendkey=xxx5&text={}&desp={}".format(tiele, text)
        resp = requests.get(url)
    

    通过上面的函数,就可以将信息推送到微信了,不懂得可以参考之前的文章:1 行代码,实现微信消息发送

    4 如何定时执行接口测试?

    接口测试代码也有了,消息推送也有了,下面就是如何定时执行接口测试了,比如半小时执行一次?

    一种方案是使用 Linux 系统自带的 crontab 模块。

    还有就是 Python 也有定时任务的模块,我找到了一个轻量级的定时任务调度的库:schedule

    import schedule
    import time
     
    def job():
        print("I'm working...")
     
    schedule.every(10).minutes.do(job)
    schedule.every().hour.do(job)
    schedule.every().day.at("10:30").do(job)
    schedule.every(5).to(10).days.do(job)
    schedule.every().monday.do(job)
    schedule.every().wednesday.at("13:15").do(job)
     
    while True:
        schedule.run_pending()
        time.sleep(1)
    

    这个栗子简单到我不需要怎么解释。而且,通过这个栗子,我们也可以知道,schedule 其实就只是个定时器。

    在 while True 死循环中,schedule.run_pending() 是保持 schedule 一直运行,去查询上面那一堆的任务,在任务中,就可以设置不同的时间去运行。跟 crontab 是类似的。

    我们只要把我们的测试接口方法放在上面的 job() 方法里,然后通过 schedule.every(30).minutes.do(job) 就可以实现半小时一次执行啦!

    最终执行效果

    总结

    至此,我的任务基本完毕,虽然功能简单,也没有什么高级的架构。

    但是涉及的东西还是挺多的,网络交互、XML 解析、JSON 解析、正则表达式、微信推送、定时任务等。

    这次,就到这吧,大家节日快乐~

  • 相关阅读:
    POJ1204:Word Puzzles——题解
    HDU2222:Keywords Search——题解
    CF17E:Palisection——题解
    BZOJ2565:最长双回文串——题解
    POJ3974:Palindrome——题解
    接口测试的另一种方式 – 接口测试平台
    接口测试的另一种方式 – 接口测试平台
    接口测试的另一种方式 – 接口测试平台
    美团招聘-测试开发工程师
    美团招聘-测试开发工程师
  • 原文地址:https://www.cnblogs.com/hoxis/p/9739560.html
Copyright © 2020-2023  润新知