API巡检并将测试结果发送到钉钉群

一、基本介绍

Python+unittest+钉钉+crontab,定时测试API,并发送测试结果到钉钉群,第一时间掌握API状况

二、项目目录结构

2.1 functions.py

该py用于存放项目所需的一些函数,比如钉钉机器人发送消息

def DingDingalert(msg):
    """
    send alert info by DingDing
    :param msg:要发送的内容
    :return:
    """
    data = {
    
    
        'msgtype': 'text',
        'text': {
    
    
            "content": msg
        },
    }
    try:
        return requests.post(DINGDING_URL_WEBHOOK, json=data)
    except:
        traceback.print_exc()
#DINGDING_URL_WEBHOOK就是钉钉群添加机器人,设置里的webhook地址,不懂的可以百度 钉钉群机器人发送消息
def getMessage(filepath):
	#读取文件内容
    message = ""
    for line in open(filepath):
        message = message + line
    # print(message)
    return message

2.2 settings.py

用于存放项目的一些全局变量,比如host,api url

2.3 run_all_cases.py

主函数,项目执行该文件即可

# -*- coding:utf-8 -*-
#服务器一般默认是Python2,所以第一句申明最好加上
import os
import unittest
from functions import *

def all_case():
    case_dir = os.path.join(os.getcwd(), "case")#也可以用绝对目录存放测试用例的目录,定时任务时钉钉消息可能不会发,改成绝对目录就好了
    print(case_dir)
    testcase = unittest.TestSuite()#初始化一个测试套件用来装测试用例
    discover = unittest.defaultTestLoader.discover(case_dir, pattern="test*.py", top_level_dir=None)#寻找case_dir下所有test开头的测试用例
    testcase.addTests(discover)
    print(testcase)
    return testcase


if __name__ == "__main__":
    # runner = unittest.TextTestRunner()
    # runner.run(all_case())

    # test report 为了方便发送消息,把测试结果保存到TXT文档里,也可以用HTML报告形式
    with open('APITextReport.txt', 'w') as f:
        runner = unittest.TextTestRunner(stream=f, verbosity=2)
        runner.run(all_case())
    # send report to dingding
    msg = getMessage("APITextReport.txt")#读取文件内容保存到变量用于钉钉消息发送
    print("**************************")
    print(msg)
    DingDingalert(msg)#调用Dingding函数发消息

2.4 case目录

分了两个目录APP和web,用于区别不同的api 类型,也可以不用
简单举个例子吧
目录下新增py,比如test_getbaidu.py,所有用例命名前缀一定要统一,方便程序收集所有用例,哪个不想执行可以改掉前缀
代码如下

# -*- coding:utf-8 -*-
import json
import unittest
import time
from settings import *
from functions import *


class Test(unittest.TestCase):
    def setUp(self):
        print("start!")

    def test_getbaidu(self):
        """
        打开百度
        """
        print("执行测试用例:打开百度")
        url_baidu = "https://www.baidu.com"
        res = requests.post(url_baidu)#这个比较简单,一般接口还有body,header
        result = res.text
        assert res.status_code == 200
    def tearDown(self):
        time.sleep(1)
        print("end!")
if __name__ == "__main__":
    unittest.main()
        

三、服务器定时任务crontab

3.1 先查看crontab状态

检查cron服务是不是在运行
service crond status
在运行的时候会看到crond is running…
如cron不在运行启动服务
Service cron start

3.2 编辑crontab

输入命令crontab -e
编辑内容如
每5分钟执行一次
*/5 * * * * python /root/apipatrolinspection/run_all_cases.py

每天2点十分执行
10 2 * * * python /root/apipatrolinspection/run_all_cases.py
其他定时规则可百度crontab规则,以上路径最好用绝对路径包括Python

编辑完保存,即可验证程序是否定时执行了,也可以查看执行log
tail -f /var/log/cron.log
若看不到这个log,则有可能是crontab log没配置打开,做如下操作即可:

修改rsyslog文件:
/etc/rsyslog.d/50-default.conf
将 rsyslog 文件中的 #cron.* 前的 # 删掉;

重启rsyslog服务:
service rsyslog restart

重启cron服务:  
service cron restart

查看日志文件:
tail -f /var/log/cron.log

四、结束

有问题可以留言

猜你喜欢

转载自blog.csdn.net/weixin_42166361/article/details/109289955