动态设置用户定义的变量

Dynamically set user defined variable

有什么方法可以在测试启动期间使用 Java 动态设置 jmx 文件中的用户定义变量?

到目前为止,我可以使用以下代码打印姓名:

 try {

            // JMeter Engine
            StandardJMeterEngine jmeter = new StandardJMeterEngine();

            // Initialize Properties, logging, locale, etc.
            JMeterUtils.loadJMeterProperties("c:\path\jmeter.properties");
            JMeterUtils.setJMeterHome("C:\path\apache-jmeter-5.0");
            JMeterUtils.initLocale();

            // Initialize JMeter SaveService
            SaveService.loadProperties();

            // Load existing .jmx Test Plan
            Path path = Paths.get("C:\path\whatever.jmx");
            HashTree testPlanTree = SaveService.loadTree(path.toFile());

            // Run JMeter Test
            jmeter.configure(testPlanTree);

            JMeterTreeModel treeModel = new JMeterTreeModel();
            JMeterTreeNode root = (JMeterTreeNode) treeModel.getRoot();
            treeModel.addSubTree(testPlanTree, root);

            SearchByClass<TestPlan> testPlan = new SearchByClass<>(TestPlan.class);
            testPlanTree.traverse(testPlan);
            Collection<TestPlan> testPlans = testPlan.getSearchResults();
            for (TestPlan testPlan1 : testPlans) {
                System.out.println(testPlan1.getName());

                JMeterProperty udvProperty = testPlan1.getUserDefinedVariablesAsProperty();

                Arguments arg = (Arguments) udvProperty.getObjectValue();

                CollectionProperty arguments = arg.getArguments();

                arguments.forEach(c -> {

                    System.out.println(c);

                });

            }

            // jmeter.run();

        }
        catch (IOException | IllegalUserActionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我快到了!但只需要一些建议,看看这是否是正确的方向?或者还有其他更好的方法吗?

更新: 我可以通过修改上面的代码来设置变量:

try {

            // JMeter Engine
            StandardJMeterEngine jmeter = new StandardJMeterEngine();

            // Initialize Properties, logging, locale, etc.
            JMeterUtils.loadJMeterProperties("c:\path\jmeter.properties");
            JMeterUtils.setJMeterHome("C:\path\apache-jmeter-5.0");
            JMeterUtils.initLocale();

            // Initialize JMeter SaveService
            SaveService.loadProperties();

            // Load existing .jmx Test Plan
            Path path = Paths.get("C:\path\whatever.jmx");
            HashTree testPlanTree = SaveService.loadTree(path.toFile());

            // Run JMeter Test
            jmeter.configure(testPlanTree);

            JMeterTreeModel treeModel = new JMeterTreeModel();
            JMeterTreeNode root = (JMeterTreeNode) treeModel.getRoot();
            treeModel.addSubTree(testPlanTree, root);

            SearchByClass<TestPlan> testPlan = new SearchByClass<>(TestPlan.class);
            testPlanTree.traverse(testPlan);
            Collection<TestPlan> testPlans = testPlan.getSearchResults();
            for (TestPlan testPlan1 : testPlans) {
                System.out.println(testPlan1.getName());

                JMeterProperty udvProperty = testPlan1.getUserDefinedVariablesAsProperty();

                Arguments arg = (Arguments) udvProperty.getObjectValue();

                CollectionProperty arguments = arg.getArguments();

                arguments.forEach(c -> {

                Argument j = (Argument) c.getObjectValue();
                System.out.println("-----j--- " + j.getName());
                j.setValue("whatever value");

                System.out.println(j);

                });

            }

            // jmeter.run();

        }
        catch (IOException | IllegalUserActionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

User Defined Variables 测试元素由 org.apache.jmeter.config.Arguments class 表示,因此直接查找 Arguments 是有意义的,因为它会更方便、快速和可读。

addArgument()函数可用于添加用户自定义变量

例如,此代码将从定义的位置读取测试计划,添加值为 bar 的用户定义变量 foo,然后将测试计划保存回

// JMeter Engine
StandardJMeterEngine jmeter = new StandardJMeterEngine();

// Initialize Properties, logging, locale, etc.
JMeterUtils.loadJMeterProperties("c:\path\jmeter.properties");
JMeterUtils.setJMeterHome("C:\path\apache-jmeter-5.0");
JMeterUtils.initLocale();

// Initialize JMeter SaveService
SaveService.loadProperties();

// Load existing .jmx Test Plan
Path path = Paths.get("C:\path\whatever.jmx");
HashTree testPlanTree = SaveService.loadTree(path.toFile());

SearchByClass<Arguments> udvSearch = new SearchByClass<>(Arguments.class);
testPlanTree.traverse(udvSearch);
Collection<Arguments> udvs = udvSearch.getSearchResults();

Arguments userDefinedVariables = udvs.stream().findAny().get();

System.out.println("Current values:");

userDefinedVariables.getArgumentsAsMap().forEach((k, v) -> System.out.println("Name : " + k + " Value : " + v));

userDefinedVariables.addArgument("foo", "bar");

SaveService.saveTree(testPlanTree, new FileOutputStream("C:\path\whatever.jmx"));

查看 Five Ways To Launch a JMeter Test without Using the JMeter GUI for more information regarding different ways of creating a JMeter test plan (including running an existing test and creating a brand new one using JMeter API)

经过仔细研究,我想出了这个代码片段。我已经在 J​​Meter 5.3 及更高版本上对此进行了测试,它适用于我。它看起来与其他答案相似,但我已经仔细解释了每一行中发生的事情。希望这有帮助。

// Initialize Properties, logging, locale, etc.
JMeterUtils.loadJMeterProperties("apache-jmeter-5.3/bin/jmeter.properties");
JMeterUtils.setJMeterHome("apache-jmeter-5.3"); // Have the apache JMeter extracted in the same folder
JMeterUtils.initLocale();

try {
    // Initialize JMeter SaveService
    SaveService.loadProperties();
} catch (IOException e) {
    // handle the error
}

// add user defined variables
HashMap<String, String> userArguments = new HashMap<>();
userArguments.put("variable1", "value1");
userArguments.put("variable2", "value2");
userArguments.put("variable3", "value3");

String jmxFilePath = "jmeterscript.jmx";
File jmxFile = new File(jmxFilePath);

// get the jmeter to run by configuring it
StandardJMeterEngine jMeterEngine = configureJmeterEngine(jmxFile, userArguments);

// starting to invoke the JMeter Script
jMeterEngine.run();
jMeterEngine.reset();
jMeterEngine.exit();

/**
 * This method returns a configured StandardJMeterEngine based on a arguments configured in
 * a JMX file and arguments defined by user through metadata
 *
 * @param jmxFileName JMX file path
 * @param arguments   User defined arguments
 * @return Configured StandardJMeterEngine
 */
private StandardJMeterEngine configureJmeterEngine(File jmxFileName, HashMap<String, String> arguments) {
    StandardJMeterEngine standardJMeterEngine = new StandardJMeterEngine();
    try {
        // Get test plan tree
        HashTree testPlanTree = SaveService.loadTree(jmxFileName);
        // Get all user defined arguments in JMX file
        SearchByClass<Arguments> udvSearch = new SearchByClass<>(Arguments.class);
        testPlanTree.traverse(udvSearch);
        Collection<Arguments> udvs = udvSearch.getSearchResults();
        Arguments args = udvs.stream().findAny().orElseGet(Arguments::new);
        // Add user defined arguments in metadata
        arguments.keySet().forEach(key -> args.addArgument(key, arguments.get(key)));
        // Configure JMeter engine
        standardJMeterEngine.configure(testPlanTree);
    } catch (Exception e) {
        logger.error("Error in configuring a Jmeter Probe", e);
    }
    return standardJMeterEngine;
}