准备写一个小程序(压力测试工具)概要设计:
本人没有看过jmeter的源代码,所以我写的程序可能存在严重设计缺陷。但希望有时间对其继续改进。jmeter倒是用过,不理想的是,分布式测试的设计较差,jmeter的界面也非常粗糙,测试脚本编辑只能通过jmeter的控制界面进行编辑,如果对xml进行编辑,这简直无法完成。
设计的这个压力测试工具,分为agent和controller两部分。controller只做管理,不做加压。agent是主要的加压器。
那我先来说下agent, agent作为主要的工作者,所以主要和重要的功能都会实现都是在agent上。
1. Agent
1) thredpool (线程池,每一个线程代表一个用户), 有了线程池,最基本的加压模型就有了。
a) 线程池的管理 (开始测试时,创建线程池,创建的同时,每个线程就开始模拟用户进行工作)
b) 结束测试时,关闭线程池(触发条件,可能是测试时间到,手动停止,或者是用户的迭代次数完成)
c) 需要注意的是, 手动停止和测试时间到的触发模式,需要慎重思考如何高效和降低风险的进行线程管理器。
I) 一个线程监听结束事件,监听到候,将关闭其他所有线程,最后关闭自己。 (但是如何关闭线程,才能安全的让用户的线程都能正常完成本次测试? 这是一个问题! 待解决。 lr里,在停止测试时,有2种模式。一种是stop,一种是立即stop。 立即stop,可能会强制关闭线程,这样可能会导致正在测试的用户异常停止。)
II)在用户迭代次数之间,加入控制代码,这样可以保证在用户完成迭代之后进行自动关闭或者停止测试工作。(可能会对测试压力导致一定的降低)。 这种方法虽然能造成测试的压力降低,但并不影响测试的本质。可以通过加大用户进行加压。
2) 用户脚本 (用户脚本最好采用即时编译, 这样测试者可以用代码进行编写脚本,完成脚本后,实事编译,并进行执行脚本)。
a) 用户脚本可以进行用代码进行编译,这样对于开发者人员或者有语言基础的测试人员,非常容易进行脚本编辑。且可以完成非常复杂的压力测试。
b) 支持第三方库插件。这样不需要自己全部开发所有插件。
3) agent 对外通过http,json/xml等协议于controller进行交互。
a) runtimesettings 运行时设定
b) status 状态 (运行状态,即时报告,例如运行时间,周期内的测试数据等,错误数据等)
c) run 开始加压
d) stop 关闭加压
e) savetestscript 测试脚本的编辑和编译 (编译通过的脚本,则视为正确的脚本)
f) 对参数化的支持,也可以自己进行编程进行实现。
4) 其他额外功能
a) 线程池的管理,可以加入自检功能。对自己的运行状态和资源消耗作监控,如果资源消耗严重,则自动停止再进行用户加压,或者还可以减少用户,来保证加压agent的正常工作。
每一个agent,当前只能执行一个任务。
2. controllers:
主要就是对agent的管理了。
1) agent管理
2) 测试状态收集
3) 监控平台
此篇文章已被阅读2243 次