动态设置用户定义变量

问题描述 投票:0回答:3

有没有办法使用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();
        }
java jmeter jmeter-plugins
3个回答
2
投票

用户定义变量测试元素由 org.apache.jmeter.config.Arguments 类表示,因此直接查找 Arguments 是有意义的,因为它将更方便、快速和可读。

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

例如,此代码将从定义的位置读取测试计划,添加用户定义变量

foo
,其值为
bar
,然后保存测试计划

// 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"));

查看不使用 JMeter GUI 启动 JMeter 测试的五种方法,了解有关创建 JMeter 测试计划的不同方法的更多信息(包括运行现有测试和使用 JMeter API 创建全新测试)


0
投票

经过仔细研究,我想出了这个代码片段。我已经在 JMeter 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;
}

0
投票

有什么方法可以在Http标头管理器中注入动态值

© www.soinside.com 2019 - 2024. All rights reserved.