JMeter使用Recording Controller录制脚本遇socket断开问题及概念咨询
问题解答
一、Recording Controller录制触发socket broken报错解决方案
- 调整代理请求超时配置:你代码中设置的
proxyController.setProxyPauseHTTPSample("10000")代表请求超时时间为10秒,若页面资源加载慢、网络波动都会导致连接超时断开,建议将值调整为30000(30秒)测试。 - 放开HTTPS域名限制:你仅配置了
sslDomains为www.geeksforgeeks.org,如果录制过程中访问了其他HTTPS域名,证书校验不通过会直接断开连接,可先删除该配置项放开所有HTTPS域名的录制权限,验证问题是否解决。 - 调整Firefox代理配置:在Firefox地址栏输入
about:config进入配置页,搜索network.http.proxy.keep-alive将值调整为300,同时将network.http.connection-timeout调整为30000,保持和JMeter代理超时配置一致。 - 校验证书导入状态:确认JMeter生成的根证书已经正确导入到Firefox的受信任根证书颁发机构列表中,证书未信任会导致HTTPS连接中途被浏览器断开,触发socket broken错误。
二、JMeterTreeModel与JMeterNode定义解释
JMeterTreeModel
JMeterTreeModel是JMeter底层维护测试计划层级结构的核心类,是Swing TreeModel的定制实现,不管是GUI模式还是非GUI代码调用模式,所有测试元素(线程组、控制器、采样器、代理组件等)的父子从属关系、增删改操作都由JMeterTreeModel实例统一管理,是整个测试计划的结构存储容器。
JMeterTreeNode
JMeterTreeNode是JMeterTreeModel中的最小节点单元,每个节点对应一个TestElement接口的实现类实例(比如你代码中的ProxyControl、RecordingController实例都可以作为节点绑定对象)。它除了存储关联的测试元素对象外,还维护了节点的父子关系、GUI模式下的展开/收起状态、节点展示名称等属性。你代码中proxyController.setTarget(node)的作用就是告诉录制代理,把捕获到的所有请求采样器都添加到这个节点绑定的测试元素下。
相关代码(优化排版后)
Scanner sc = new Scanner(System.in); // recordingController recordingcontroller=new recordingController("testrecorder",RecordController.class); // RecordingController rc= (RecordingController) recordingcontroller.buildTestElement(); RecordingController rc = new RecordingController(); GenericController gc = new GenericController(); rc.initialize(); gc.addTestElement(rc); LoopController loopController = new LoopController(); loopController.setLoops(1); loopController.setFirst(true); loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName()); loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName()); loopController.initialize(); rc.addTestElement(loopController); ThreadGroup threadGroup = new ThreadGroup(); threadGroup.setName("Thread-Group"); threadGroup.setSamplerController(loopController); ProxyControl proxyController = new ProxyControl(); // proxyController.setProperty(TestElement.TEST_CLASS, ProxyControl.class.getName()); // proxyController.setProperty(TestElement.GUI_CLASS, ProxyControlGui.class.getName()); proxyController.setName("Proxy Recorder"); proxyController.setPort(4444); // threadGroup.setSamplerController(rc); // proxyController.setSamplerTypeName("SAMPLER_TYPE_JAVA_SAMPLER"); TestPlan testPlan = new TestPlan("My_Test_Plan"); testPlan.addTestElement(threadGroup); testPlan.addTestElement(proxyController); JMeterTreeModel jtm = new JMeterTreeModel(); proxyController.setNonGuiTreeModel(jtm); JMeterTreeNode node = new JMeterTreeNode(proxyController,jtm); // JMeterTreeNode node=new JMeterTreeNode(); proxyController.setTarget(node); // proxyController.setCaptureHttpHeaders(true); // proxyController.setUseKeepAlive(true); // proxyController.setGroupingMode(4); proxyController.setCaptureHttpHeaders(true); proxyController.setProxyPauseHTTPSample("10000"); proxyController.setSamplerFollowRedirects(true); proxyController.setSslDomains("www.geeksforgeeks.org"); proxyController.startProxy();
内容的提问来源于stack exchange,提问作者Tarun Kumar1
相关产品推荐
相关产品推荐

