利用Python批量测试一组HTTP服务的可用性

简介:

   用Python实现批量测试一组url的可用性(可以包括HTTP状态、响应时间等)并统计出现不可用情况的次数和频率等。

    类似的,这样的脚本可以判断某个服务的可用性,以及在众多的服务提供者中选择最优的。

需求以及脚本实现的功能如下:

  1. 默认情况下,执行脚本会检测一组url的可用性。

  2. 如果可用,返回从脚本所在的机器到HTTP服务器所消耗的时间和内容等信息。

  3. 如果url不可用,则记录并提示用户,并显示不可用发生的时间。

  4. 默认情况下,允许最大的错误次数是200,数目可以自定义,如果达到允许的最大错误次数,则在输出信息的最后,根据每一个url做出错误统计。

  5. 如果用户手动停止脚本,则需要在输出信息的最后,根据每一个url做出错误统计。

脚本中涉及的一些技巧:

  1. 使用gevent并发处理多个HTTP请求,多个请求之间无须等待响应(gevent还有很多使用技巧,可再自行学习);

  2. 使用signal模块捕获信号,如果捕获到则处理并退出,避免主进程接收到KeyboardInterrupt直接退出但无法处理的问题;

  3. 注意留意脚本中关于统计次数方面的小技巧;

脚本运行效果图(如果图片看不清楚,请选择“在新标签页中打开图片”)如下:

image

脚本可以参见Github,https://github.com/DingGuodong/LinuxBashShellScriptForOps/tree/master/projects/checkServicesAvailability/HttpService

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
"""
Created by PyCharm.
File:               LinuxBashShellScriptForOps:testNoHttpResponseException,testHttpHostAvailability.py
User:               Guodong
Create Date:        2016/10/26
Create Time:        12:09
 
Function:
     test Http Host Availability
 
Some helpful message:
     For CentOS: yum -y install python-devel python-pip; pip install gevent
     For Ubuntu: apt-get -y install python-dev python-pip; pip install gevent
     For Windows: pip install gevent
  """
import  signal
import  time
import  sys
#  execute some operations concurrently using python
from  gevent  import  monkey
 
monkey.patch_all()
import  gevent
import  urllib2
 
hosts  =  [ 'https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck' ,
          'https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck' , ]
 
errorStopCounts  =  200
 
quit_flag  =  False
statistics  =  dict ()
 
 
def  changeQuit_flag(signum, frame):
     del  signum, frame
     global  quit_flag
     quit_flag  =  True
     print  "Canceled task on their own by the user."
 
 
def  testNoHttpResponseException(url):
     tryFlag  =  True
     global  quit_flag
     errorCounts  =  0
     tryCounts  =  0
     global  statistics
     globalStartTime  =  time.time()
     while  tryFlag:
         if  not  quit_flag:
             tryCounts  + =  1
             print ( 'GET: %s'  %  url)
             try :
                 startTime  =  time.time()
                 resp  =  urllib2.urlopen(url)   # using module 'request' will be better, request will return header info..
                 endTime  =  time.time()
                 data  =  resp.read()
                 responseTime  =  endTime  -  startTime
                 print  '%d bytes received from %s. response time is: %s'  %  ( len (data), url, responseTime)
                 print  "data received from %s at %d try is: %s"  %  (url, tryCounts, data)
                 gevent.sleep( 2 )
             except  urllib2.HTTPError as e:
                 errorCounts  + =  1
                 statistics[url]  =  errorCounts
                 currentTime  =  time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime())
                 print  "HTTPError occurred, %s, and this is %d times(total) occurs on %s at %s."  %  (
                     e, statistics[url], url, currentTime)
 
                 if  errorCounts > =  errorStopCounts:
                     globalEndTime  =  time.time()
                     tryFlag  =  False
         else :
             globalEndTime  =  time.time()
             break
 
     for  url  in  statistics:
         print  "Total error counts is %d on %s"  %  (statistics[url], url)
         hosts.remove(url)
     for  url  in  hosts:
         print  "Total error counts is 0 on %s"  %  url
     globalUsedTime  =  globalEndTime  -  globalStartTime
     print  "Total time use is %s"  %  globalUsedTime
     sys.exit( 0 )
 
 
try :
     # Even if the user cancelled the task,
     # it also can statistics the number of errors and the consumption of time for each host.
     signal.signal(signal.SIGINT, changeQuit_flag)
 
     gevent.joinall([gevent.spawn(testNoHttpResponseException, host)  for  host  in  hosts])
except  KeyboardInterrupt:
     # Note: this line can NOT be reached, because signal has been captured!
     print  "Canceled task on their own by the user."
     sys.exit( 0 )


tag:python计算HTTp可用性,python 统计次数,python gevent

--end--





本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1865925,如需转载请自行联系原作者


相关文章
|
1月前
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
|
1月前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
34 4
|
3天前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
41 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
5天前
|
数据采集 网络安全 Python
【Python】怎么解决:urllib.error.HTTPError: HTTP Error 403: Forbidden
解决 `urllib.error.HTTPError: HTTP Error 403: Forbidden`错误需要根据具体情况进行不同的尝试。通过检查URL、模拟浏览器请求、使用代理服务器和Cookies、减慢请求速度、使用随机的User-Agent以及使用更加方便的 `requests`库,可以有效解决此类问题。通过逐步分析和调试,可以找到最合适的解决方案。
45 18
|
19天前
|
数据采集 数据安全/隐私保护 Python
【Python】已解决:urllib.error.HTTPError: HTTP Error 403: Forbidden
通过上述方法,可以有效解决 `urllib.error.HTTPError: HTTP Error 403: Forbidden` 错误。具体选择哪种方法取决于服务器对请求的限制。通常情况下,添加用户代理和模拟浏览器请求是最常见且有效的解决方案。
88 10
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
112 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
22天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
23天前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
32 3
|
1月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
32 4
|
1月前
|
JSON API 数据格式
Python中获取HTTP请求响应体的详解
本文介绍了如何使用Python的`requests`和`urllib`库发送HTTP请求并处理响应体。`requests`库简化了HTTP请求过程,适合快速开发;`urllib`库则更为底层,适用于性能要求较高的场景。文章详细演示了发送GET请求、处理JSON响应等常见操作。
50 3