Jmeter书中不会教你的(28)——执行写入csv文件报错Typed variable declaration : Object constructor

本文介绍了在执行写入CSV文件脚本时遇到的错误,问题源于文件在执行过程中处于打开状态。解决方案是确保在执行前关闭文件,从而避免此类错误。对于编程和数据处理工作,了解如何正确管理和操作文件状态至关重要。

        今天分享一个小技巧,经常遇到在执行有写入csv脚本时,在log中出现以下错误信息

2021-11-25 10:05:56,257 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval    Sourced file: inline evaluation of: ``//定义一个写入csv文件的地址 String filePath1 = "D://xntest//result.csv";  //定义一个写入的字段 Strin . . . '' : Typed variable declaration : Object constructor

        原因就是"D://xntest//result.csv"这个地址的文件状态是打开着的,关闭它再次执行就可以了。

-------------------------------------------------------------------------------

如果觉得我的文章对您有用,请收藏+关注,您的支持是我坚持的动力!

2025-07-01 15:17:22,311 INFO o.j.r.JARSourceHTTP: Found cached repo 2025-07-01 15:17:22,536 INFO o.j.r.PluginManager: Plugins Status: [jpgc-plugins-manager=1.11, jmeter-core=5.6.3, jmeter-ftp=5.6.3, jmeter-http=5.6.3, jmeter-jdbc=5.6.3, jmeter-jms=5.6.3, jmeter-junit=5.6.3, jmeter-java=5.6.3, jmeter-ldap=5.6.3, jmeter-mail=5.6.3, jmeter-mongodb=5.6.3, jmeter-native=5.6.3, jmeter-tcp=5.6.3, jmeter-components=5.6.3] 2025-07-01 15:17:32,191 INFO o.a.j.s.FileServer: Default base='D:\日常软件\H.Jmeter\apache-jmeter-5.6.3\bin' 2025-07-01 15:17:32,193 INFO o.a.j.g.a.Load: Loading file: D:\日常软件\H.Jmeter\查看结果树.jmx 2025-07-01 15:17:32,193 INFO o.a.j.s.FileServer: Set new base='D:\日常软件\H.Jmeter' 2025-07-01 15:17:32,240 INFO o.a.j.s.SaveService: Testplan (JMX) version: 2.2. Testlog (JTL) version: 2.2 2025-07-01 15:17:32,240 INFO o.a.j.s.SaveService: Using SaveService properties file encoding UTF-8 2025-07-01 15:17:32,240 INFO o.a.j.s.SaveService: Using SaveService properties version 5.0 2025-07-01 15:17:32,256 INFO o.a.j.s.SaveService: Loading file: D:\日常软件\H.Jmeter\查看结果树.jmx 2025-07-01 15:17:32,319 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/html is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser 2025-07-01 15:17:32,319 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for application/xhtml+xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser 2025-07-01 15:17:32,319 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for application/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser 2025-07-01 15:17:32,319 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser 2025-07-01 15:17:32,319 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/vnd.wap.wml is org.apache.jmeter.protocol.http.parser.RegexpHTMLParser 2025-07-01 15:17:32,319 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/css is org.apache.jmeter.protocol.http.parser.CssParser 2025-07-01 15:17:32,557 INFO o.a.j.s.SampleResult: Note: Sample TimeStamps are START times 2025-07-01 15:17:32,557 INFO o.a.j.s.SampleResult: sampleresult.default.encoding is set to UTF-8 2025-07-01 15:17:32,557 INFO o.a.j.s.SampleResult: sampleresult.useNanoTime=true 2025-07-01 15:17:32,557 INFO o.a.j.s.SampleResult: sampleresult.nanoThreadSleep=5000 2025-07-01 15:17:32,636 INFO o.a.j.r.ClassFinder: Will scan jar D:\日常软件\H.Jmeter\apache-jmeter-5.6.3\lib\ext\jmeter-plugins-manager-1.11.jar with filter ExtendsClassFilter [parents=[interface org.apache.jmeter.visualizers.ResultRenderer], inner=false, contains=null, notContains=null]. Consider exposing JMeter plugins via META-INF/services, and add JMeter-Skip-Class-Scanning=true manifest attribute so JMeter can skip classfile scanning 2025-07-01 15:17:32,636 INFO o.a.j.r.ClassFinder: Will scan jar D:\日常软件\H.Jmeter\apache-jmeter-5.6.3\lib\ext\jmeter-plugins-manager-1.11.jar with filter ExtendsClassFilter [parents=[interface org.apache.jmeter.visualizers.RequestView], inner=false, contains=null, notContains=null]. Consider exposing JMeter plugins via META-INF/services, and add JMeter-Skip-Class-Scanning=true manifest attribute so JMeter can skip classfile scanning 2025-07-01 15:17:32,668 INFO o.a.j.s.FileServer: Set new base='D:\日常软件\H.Jmeter' 2025-07-01 15:17:37,105 INFO o.a.j.e.StandardJMeterEngine: Running the test! 2025-07-01 15:17:37,105 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2025-07-01 15:17:37,105 INFO o.a.j.s.SampleEvent: List of sample_variables: [] 2025-07-01 15:17:37,105 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must contain the string: '.functions.' 2025-07-01 15:17:37,105 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must not contain the string: '.gui.' 2025-07-01 15:17:37,254 INFO o.a.j.r.ClassFinder: Will scan jar D:\日常软件\H.Jmeter\apache-jmeter-5.6.3\lib\ext\jmeter-plugins-manager-1.11.jar with filter ExtendsClassFilter [parents=[interface org.apache.jmeter.functions.Function], inner=false, contains=null, notContains=null]. Consider exposing JMeter plugins via META-INF/services, and add JMeter-Skip-Class-Scanning=true manifest attribute so JMeter can skip classfile scanning 2025-07-01 15:17:37,254 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, *local*) 2025-07-01 15:17:37,254 INFO o.a.j.e.StandardJMeterEngine: Starting setUp thread groups 2025-07-01 15:17:37,254 INFO o.a.j.e.StandardJMeterEngine: Starting setUp ThreadGroup: 1 : tbd 线程组 2025-07-01 15:17:37,254 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group tbd 线程组. 2025-07-01 15:17:37,254 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error 2025-07-01 15:17:37,254 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false 2025-07-01 15:17:37,270 INFO o.a.j.t.ThreadGroup: Started thread group number 1 2025-07-01 15:17:37,270 INFO o.a.j.e.StandardJMeterEngine: Waiting for all setup thread groups to exit 2025-07-01 15:17:37,270 INFO o.a.j.t.JMeterThread: Thread started: tbd 线程组 1-1 2025-07-01 15:17:37,270 INFO o.a.j.p.h.s.HTTPHCAbstractImpl: Local host = jizhi 2025-07-01 15:17:37,285 INFO o.a.j.p.h.s.HTTPHC4Impl: HTTP request retry count = 0 2025-07-01 15:17:37,424 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``// JSR223 Sampler 中使用 import org.apache.http.client.methods.HttpPost; import org . . . '' : Typed variable declaration : Object constructor 2025-07-01 15:17:37,424 WARN o.a.j.e.BeanShellPostProcessor: Problem in BeanShell script: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``// JSR223 Sampler 中使用 import org.apache.http.client.methods.HttpPost; import org . . . '' : Typed variable declaration : Object constructor 2025-07-01 15:17:37,460 INFO o.a.j.t.JMeterThread: Thread is done: tbd 线程组 1-1 2025-07-01 15:17:37,460 INFO o.a.j.t.JMeterThread: Thread finished: tbd 线程组 1-1 2025-07-01 15:17:37,475 INFO o.a.j.e.StandardJMeterEngine: All Setup Threads have ended 2025-07-01 15:17:37,539 INFO o.a.j.e.StandardJMeterEngine: No enabled thread groups found 2025-07-01 15:17:37,539 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test 2025-07-01 15:17:37,539 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, *local*)
最新发布
07-02
<think>我们正在处理JMeter中BeanShell脚本执行时出现的“Class ITesseractnot foundin namespace”错误。根据引用[1][2][3]中的类似错误,这通常是由于缺少必要的JAR包或类路径配置问题导致的。以下是完整的解决方案:###解决方案步骤####1.**添加Tess4J依赖库**-从[Tess4J官方仓库](https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j)下载最新JAR包(例如:`tess4j-5.3.0.jar`)-同时下载其依赖库:- `jai-imageio-core-1.4.0.jar`-`leptonica-1.82.0.jar`-将这些JAR包放入JMeter的`lib`目录(例如:`apache-jmeter-5.6/lib/`)-**重启JMeter**使类加载生效####2. **验证Tesseract本地安装**-确保系统已安装[Tesseract OCR引擎](https://github.com/UB-Mannheim/tesseract/wiki)(Windows推荐5.0+版本)-配置环境变量:将Tesseract安装路径(如`C:\ProgramFiles\Tesseract-OCR`)添加到`PATH`-在BeanShell脚本中指定`tessdata`路径:```javatess.setDatapath("C:/ProgramFiles/Tesseract-OCR/tessdata");```####3.**修复BeanShell脚本**修正后的脚本示例:```java//必须显式导入Tess4J类importnet.sourceforge.tess4j.*;//1.初始化OCR引擎ITesseracttess =new Tesseract();tess.setDatapath("D:/tesseract/tessdata");//修改为实际路径//2.加载保存的验证码图片File imageFile =new File(vars.get("captcha_path")); //从变量获取路径//3.执行OCR识别try {Stringresult =tess.doOCR(imageFile);//去除空格后存储到JMeter变量vars.put("captcha_text", result.replaceAll("\\s",""));}catch (TesseractExceptione){log.error("OCR失败: "+ e.getMessage());}```####4.**处理依赖冲突(参考引用[3])**-检查`lib`目录是否存在旧版本或冲突的JAR(如多个版本的`poi.jar`)-使用Maven解决依赖:```xml<!--在pom.xml中声明依赖 --><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>5.3.0</version></dependency>```-通过Maven下载所有依赖并复制到`lib`目录####5. **改用JSR223 +Groovy(推荐)**由于BeanShell兼容性问题(引用[1][2][3]),改用Groovy性能更稳定:```groovyimport net.sourceforge.tess4j.Tesseractdeftess =new Tesseract()tess.setDatapath("C:/ProgramFiles/Tesseract-OCR/tessdata")defimage =new File(vars.get("captcha_path"))defresult= tess.doOCR(image)vars.put("captcha_code",result.trim())``` ###关键原理说明-**类加载机制**:JMeter启动时加载`lib`目录下的JAR,BeanShell脚本需显式`import`类-**路径规范**:Windows路径使用正斜杠`/`或双反斜杠`\\` -**错误诊断**:在脚本开头添加调试代码检查类路径:```java//打印类路径log.info("Classpath: "+ System.getProperty("java.class.path"));``` ###验证步骤1.在BeanShell前添加**Debug Sampler**2.使用**ViewResults Tree**查看:- `log.info()`输出的类路径是否包含`tess4j.jar`-变量`captcha_text`是否包含识别结果>**性能提示**:OCR识别时间$$T_{ocr}$$与图片复杂度成正比,建议在非GUI模式测试[^1]。 §§相关问题§§1. JMeter如何加载第三方JAR包?2.如何解决TesseractOCR在JMeter中的识别精度问题?3.BeanShell和JSR223Groovy在JMeter中的性能差异有多大?4.如何验证Tesseract的`tessdata`路径配置是否正确?[^1][^2]</think>根据您提供的日志和引用信息,JMeter 执行测试时出现的 "Class ITesseract not found in namespace" 错误是由于 Tess4J 库未正确加载导致的。以下是系统级解决方案: ### 完整解决方案 #### 1. **添加 Tess4J 依赖库** ```bash # 必需的核心库 tess4j-5.3.0.jar # Tess4J 主库 jai-imageio-core-1.4.0.jar # 图像处理支持 leptonica-1.82.0.jar # Leptonica 图像处理引擎 ``` **操作步骤**: 1. 从 [Maven 仓库](https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j) 下载最新版本 2. 将 JAR 文件复制到 JMeter 的 `lib/` 目录(如 `apache-jmeter-5.6/lib/`) 3. **重启 JMeter** 使类加载器生效 #### 2. **验证本地 Tesseract 安装** ```java // BeanShell 诊断脚本 import java.net.URL; import java.net.URLClassLoader; // 打印当前类路径 ClassLoader cl = ClassLoader.getSystemClassLoader(); URL[] urls = ((URLClassLoader)cl).getURLs(); for(URL url: urls){ log.info("Classpath: " + url.getFile()); } // 显式加载类测试 try { Class.forName("net.sourceforge.tess4j.ITesseract"); log.info("✅ ITesseract 类加载成功"); } catch (ClassNotFoundException e) { log.error("❌ 类加载失败: " + e.getMessage()); } ``` #### 3. **修复依赖冲突(参考引用[3])** 当存在损坏的 JAR 包时: 1. 清理损坏依赖: ```bash rm -rf ~/.m2/repository/org/apache-extras/beanshell/bsh/* ``` 2. 重新下载依赖: ```xml <!-- pom.xml 示例 --> <dependency> <groupId>org.apache-extras.beanshell</groupId> <artifactId>bsh</artifactId> <version>2.0b6</version> </dependency> ``` #### 4. **修正 BeanShell 脚本** ```java // 修正后的验证码识别脚本 import net.sourceforge.tess4j.*; // 1. 初始化 OCR 引擎 ITesseract tess = new Tesseract(); tess.setDatapath("C:/Program Files/Tesseract-OCR/tessdata"); // Windows 路径 // 2. 加载验证码图片 File captchaFile = new File("D:/jmeter_captcha/20250701-150409.png"); // 3. 执行 OCR 识别 try { String result = tess.doOCR(captchaFile); String cleanResult = result.replaceAll("[^a-zA-Z0-9]", ""); // 去除非字母数字字符 vars.put("captcha_code", cleanResult); log.info("✅ 验证码识别结果: " + cleanResult); } catch (TesseractException e) { log.error("❌ OCR 失败: " + e.getMessage()); } ``` #### 5. **备选方案:使用 JSR223 + Groovy(推荐)** ```groovy // Groovy 脚本(兼容性更好) import net.sourceforge.tess4j.Tesseract def tess = new Tesseract() tess.setDatapath("C:/Program Files/Tesseract-OCR/tessdata") def imageFile = new File(vars.get("captcha_path")) try { def result = tess.doOCR(imageFile) vars.put("captcha_code", result.replaceAll("\\s", "")) log.info("识别结果: ${vars.get('captcha_code')}") } catch (Exception e) { log.error("OCR 错误: ${e.getMessage()}", e) } ``` ### 关键配置注意事项 1. **路径格式**: - Windows 使用双反斜杠:`C:\\Path\\to\\tessdata` - 或正斜杠:`C:/Path/to/tessdata` 2. **Tesseract 安装验证**: ```bash # 命令行验证 tesseract --version # 应输出: tesseract 5.0.0 ``` 3. **性能优化**: - 预处理验证码图像(二值化、降噪) - 设置识别参数: ```java tess.setPageSegMode(PageSegMode.PSM_SINGLE_LINE); // 单行模式 tess.setOcrEngineMode(OcrEngineMode.OEM_TESSERACT_ONLY); // 仅用Tesseract ``` ### 验证步骤 1. 添加 **Debug Sampler** 在脚本前 2. 使用 **View Results Tree** 查看: - `log.info()` 输出的类路径 - OCR 识别结果变量 `${captcha_code}` 3. 检查 Tesseract 日志: ``` grep "Tesseract Open Source" jmeter.log ``` > **技术原理**:JMeter 通过系统类加载器加载 `lib/` 目录下的 JAR,BeanShell 需要显式导入类。Tess4J 依赖关系:$$ \text{Tess4J} \rightarrow \text{Leptonica} + \text{JAI ImageIO} $$[^1][^3]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

agrapea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值