我正在尝试使用JMeter 3.0(Java v1.8)中的Bean Shell Sampler在本地计算机(Win 7)上复制和重命名文件。我们的想法是创建一个具有唯一名称的新文件,并将名称保存为变量,可用于代替FTP PUT请求中的文件名。
以下是我用于复制和重命名的代码:
import java.text.*;
import java.nio.file.StandardCopyOption.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date())+".xlsx";
log.info(filename);
Path source = Paths.get("C:/dropfile/qatp/QATP_GuestRecords.xlsx");
Path target = Paths.get("C:/dropfile/qatp/"+filename);
Files.copy(source, target, REPLACE_EXISTING);
我在日志中收到的错误:
错误 - jmeter.util.BeanShellInterpreter:调用bsh方法时出错: eval源文件:内联评估:``import java.text。;进口 java.nio.file.StandardCopyOption 。 import java.io.IO。 。 。 '' :键入 变量声明:方法调用出错:静态方法get( 在类' java.nio.file.Paths'
中找不到java.lang.String
我一直在寻找这个问题的答案并遇到solution where the suggestion was: "我的猜测是问题是它没有填充varargs参数。尝试:
Path target = Paths.get(filename, new String[0]);"
我通过修改我的代码尝试了这个解决方案:
import java.text.*;
import java.nio.file.StandardCopyOption.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date())+".xlsx";
log.info(filename);
Path source = Paths.get("C:/dropfile/qatp/QATP_GuestRecords.xlsx", new String[0]);
Path target = Paths.get("C:/dropfile/qatp/"+filename, new String[0]);
Files.copy(source, target, REPLACE_EXISTING);
并收到此错误:
错误 - jmeter.util.BeanShellInterpreter:调用bsh方法时出错: eval源文件:内联评估:``import java.text。;进口 java.nio.file.StandardCopyOption 。 import java.io.IO。 。 。 '' :键入 变量声明:方法调用Paths.get
有谁知道我为什么会遇到这个错误以及如何绕过它?
答案 0 :(得分:2)
即使在普通的旧Java中,这也是对Paths.get
的误导性使用,它使用URI或字符串数组(varargs)。 See javadoc
在Java中你尝试过的是有效的,因为静态类型允许编译器确定你传递的是一个String的数组。显然BeanShell没有并且感到困惑。在另一个答案中提出的诀窍在我看来并不是一个好的:再次在Java中它可以工作,通过连接两个字符串(第二个是空的,所以结果是第一个字符串,这是你想要的),但它会混淆BeanShell都是一样的,因为还有另一个带有2个参数的静态get
方法。
如果您已将路径作为单个字符串,请尝试改为:
Path source = new File("C:/dropfile/qatp/QATP_GuestRecords.xlsx").toPath();
或者,您可以像这样使用Paths.get
:
Path source = Paths.get("C:", "dropfile", "qatp", "QATP_GuestRecords.xlsx");
或者像这样(varargs是帮助传递数组的语法糖):
Path source = Paths.get(new String [] { "C:/dropfile/qatp/QATP_GuestRecords.xlsx" });
将路径片段作为参数传递,或者将整个路径字符串作为单个参数传递是完全有效的,但这似乎会使BeanShell运行,因此,最好避免使用BeanShell中的Paths.get
,除非您通过数组显式如上例所示。
答案 1 :(得分:0)
Beanshell!= Java ,它不支持所有Java功能(将其视为关于Java 1.5并适当修改代码。
所以我建议切换到JSR223 Sampler和Groovy语言,Groovy更符合Java并且表现更好。
另请注意,您可以使用适用于Beanshell和/或Groovy的FileUtils.copyFile() method
import org.apache.commons.io.FileUtils;
import java.text.SimpleDateFormat;
String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date()) + ".xlsx";
FileUtils.copyFile(new File("/tmp/QATP_GuestRecords.xlsx"), new File("/tmp/" + filename));
有关在JMeter测试脚本中使用Groovy语言的更多信息,请参阅Groovy is the New Black文章。