python http基准测试工具
httpbenchmark的Python项目详细描述
httpbenchmark的目标是介于apache bench(ab)和一个更全面的 http测试套件。它以最简单的形式提供了与 ab,它支持-n开关来指定要发出的请求数 和a-c开关来指定有多少并发用户。
然而,真正的目的是子类化httpbenchmark并重写 worker方法来实现您自己的测试逻辑。在这方面你可以 将httpbenchmark看作一个框架,它允许您为 您的http应用程序也旨在强调服务器。查看工作程序代码 下面一节。
安装
使用pip或easy_install可以轻松完成安装。
pipinstallhttpbenchmark
基本用法
提供了一个名为pb的脚本,该脚本旨在作为 apacheab脚本。
pb -n 1000 -c 25 http://my-host.tld/endpoint/
工人代码
默认情况下,httpbenchmark只发送一个GET请求和 需要200 OK返回码。为了充分利用您应该创建的系统 你自己的脚本子类HTTPBenchmark。
下面是一个不完整且未经测试的示例,它正在对某个应用程序进行负载测试 与用户和朋友打交道。它旨在说明 使用httpbenchmark
fromhttpbenchmarkimportHTTPBenchmarkfromtornadoimportgenimportrandomUSER_IDS=[1111,2222,3333,4444]_url=lambdax:''.join(['http://my-host.tld/',x])classMyBenchmark(HTTPBenchmark):@gen.coroutinedefworker(self):''' get_worker should return a callable that will be called by the async http client '''ifrandom.choice([True,False]):yieldself.new_user()else:yieldself.returning_user()@gen.coroutinedefnew_user(self):user_id=random.choice(USER_IDS)self.log.debug("New user: %s"%user_id)friends=yieldself.open_json(_url("register?uid=%d"%user_id))# ... handle registration response ...iffailure:self.log.error("Indicate reason for failure")self.log.debug("Show debugging info if you want")self.finish_request(False)else:yieldself.next_step(user_id,friends['friendList'][0])@gen.coroutinedefreturning_user(self):user_id=random.choice(USER_IDS)self.log.debug("Returning user: %s"%user_id)defhandle_login(response,friends):friends=yieldself.open_json(_url("login?uid=%d"%user_id))# ... handle login response ...iffailure:self.log.error("Indicate reason for failure")self.log.debug("Show debugging info if you want")self.finish_request(False)else:yieldself.next_step(user_id,friends['friendList'][0])@gen.coroutinedefnext_step(self,user_id,friend_id):# ... do something else ...iffailure:self.log.error("Indicate reason for failure")self.log.debug("Show debugging info if you want")self.finish_request(False)else:# success!self.finish_request()if__name__=='__main__':MyBenchmark().main()
基本要素
- 这使用Tornado’s async generator interface来实现并发,您的 函数需要包装在@gen.coroutine中,而您应该yield 他们之间。
- worker是主代码所在的位置。无论何时何地都会叫它 是基于并发性的空闲插槽。
- yield self.get(url, code=200)用于发出get请求。你会 在操作完成时返回响应对象。
- self.post(url, params={}, callback)用于发布数据。params 应该是字典,并将作为post数据发送。它的功能 否则与get相同。
- 如果要发布到php后端并需要使用php的nested数组 将php_urlencode传递给self.post方法的参数的语法 值为True,它将相应地对参数进行编码。
- self.get_json(url, callback)是获取和解析json的快捷方式 返回的数据。回调应该接受两个参数,第一个 是响应对象,第二个是解码的json。
- self.finish_request(True/False)应该被调用来表示 请求。如果一切都按你所期望的那样工作,则传递它True,否则 传递False
- self.debug_response(response)是一个方便的函数 开发测试用例。如果您传递一个响应对象,它将打印 输出对象以及头和正文的摘要,以便可以调试 实时数据。
待办事项
- 添加一些工作示例