【问题标题】:jmeter - user defined variables and groovyjmeter - 用户定义的变量和 groovy
【发布时间】:2019-04-26 05:40:30
【问题描述】:

这是我的目标:

让测试计划在 win 和 mac 上都更加灵活和可用(因为有些人使用 mac,而其他人使用 win)。

我在 groovy 中创建了这个简单的脚本:

import org.apache.jmeter.services.FileServer;
import groovy.json.JsonSlurper;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

    String winPath;
    String macPath;
    String winSlash;
    String macSlash;
    String userPath;
    String userSlash;

    if (System.properties['os.name'].toLowerCase().contains('windows')) {
        winPath="C:\\QA\\";
        winSlash="\\";
        vars.put("userPath",winPath.toString());
    }
    if (System.properties['os.name'].toLowerCase().contains('mac')) {
        macPath="/Users/macUser/QA/";
        macSlash="/";
        vars.put("userPath",macPath.toString());
    }

并将其添加到我的线程组对象下的“JSR223 Sampler”对象中

然后我添加了一个带有以下 var 的“用户定义的变量”对象:

    Name        value
    projectDir  myProjectDir
    rootPath    ${__groovy(props.getProperty("userPath"))}${projectDir}

然后我尝试使用 rootPath 变量来设置我的 csv 文件的路径,所以我在“CSV 数据集配置”对象中添加了 ${projectDir}/AUTH.csvFileName,但我收到了这条消息:

2018-11-23 16:36:40,634 DEBUG o.a.j.t.TestBeanHelper: Ignoring property 'property' in org.apache.jmeter.config.CSVDataSet
2018-11-23 16:36:40,634 DEBUG o.a.j.t.TestBeanHelper: Setting filename=myProjectPath/AUTH.csv

2018-11-23 16:36:40,634 DEBUG o.a.j.t.TestCompiler: Subtracting node, stack size = 2
2018-11-23 16:36:40,634 DEBUG o.a.j.t.TestCompiler: Subtracting node, stack size = 1
2018-11-23 16:36:40,634 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-1
2018-11-23 16:36:40,634 INFO o.a.j.s.FileServer: Stored: myProjectPath/AUTH.csv
2018-11-23 16:36:40,635 ERROR o.a.j.t.JMeterThread: Test failed!
java.lang.IllegalArgumentException: Could not read file header line for file myProjectPath/AUTH.csv

如您所见,它试图读取myProjectPath/AUTH.csv,然后当然会出现异常..

为什么它不“读取”变量 rootPath ?

有什么建议吗?

【问题讨论】:

    标签: groovy jmeter


    【解决方案1】:
    1. 根据用户自定义变量documentation

      请注意,测试计划中的所有 UDV 元素 - 无论它们在哪里 - 在开始时都会处理

    2. 另外注意JMeter Test Elements Execution Order

      0. Configuration elements
      1. Pre-Processors
      2. Timers
      3. Sampler
      4. Post-Processors (unless SampleResult is null)
      5. Assertions (unless SampleResult is null)
      6. Listeners (unless SampleResult is null)
      

    假设以上几点,您的 Groovy 代码是在 用户定义变量之后执行的,因此您无法访问该值。因此,在用户定义变量中根据操作系统定义动态值的唯一方法是直接在 Value 部分中使用 __groovy() 函数,例如:

    ${__groovy(if(System.getProperty('os.name').toLowerCase().contains('windows')){return 'C:\\\QA\\\' } else { return '/Users/macUser/QA/' },)}
    

    确保使用另一个反斜杠来转义逗号和反斜杠,就像在 JMeter Functions 中一样,逗号充当参数分隔符,反斜杠是转义字符。查看Apache JMeter Functions - An Introduction 指南以了解有关 JMeter 函数概念的更多信息。

    【讨论】:

    • 感谢@Dmitri T 的建议,但我找到了另一个使用全局变量和 Bean Shell 断言的解决方案
    【解决方案2】:

    问题是您尝试将其添加到properties 并尝试从variables 中读取它。

    另外,不要打扰 Java 中的 \ 或 /。 Java 在每个平台上都可以处理。 (Difference between File.separator and slash in paths)

    对我来说这很好用:

    def path;
    
    if (System.properties['os.name'].toLowerCase().contains('windows')) {
        path="C:\\QA\\";
    } else if (System.properties['os.name'].toLowerCase().contains('mac')) {
        path="/Users/macUser/QA/";
    }
    vars.put("userPath",path);
    vars.put("rootPath", path+vars.get("projectDir"));
    

    并使用它:log.info(vars.get("rootPath"))

    【讨论】:

    • 好的@Sven 感谢您的建议.. 但是我应该如何在“用户定义的变量”中使用变量 rootPath ?我试过 ˋ${__groovy(vars.get("rootPath"))}ˋ 和 ˋvars.get("rootPath")ˋ 但不起作用
    • 通常你应该只使用 ${rootPath}。
    • 好的,我找到了解决方案.. 从 groovy 读取(或更好地提取)变量并在用户定义变量中读取它的唯一方法是使用 BeanShell 断言。在那里你可以设置你的全局属性,然后你可以从 UDV 中读取它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多