JMeter學習-029-JMeter配置文件propertie配置項讀取及應用實例


上文中提到通過讀取配置文件中的數據,以此定制JMeter Slave的腳本分發路徑(默認腳本路徑,即參數文件相對路徑父目錄)。

此文,就以此為例進行實例說明。

通過閱讀JMeter源碼 core/src/org.apache.jmeter.JMeter.java 如下代碼片段可知,其通過 private void initializeProperties(CLArgsParser parser) 方法初始化響應的系統、用戶等設置。

JMeter.java對應初始化的方法源碼如下所示:

 1     private void initializeProperties(CLArgsParser parser) {  2         if (parser.getArgumentById(PROPFILE_OPT) != null) {  3  JMeterUtils.loadJMeterProperties(parser.getArgumentById(PROPFILE_OPT).getArgument());  4         } else {  5             JMeterUtils.loadJMeterProperties(NewDriver.getJMeterDir() + File.separator  6                     + "bin" + File.separator // $NON-NLS-1$
 7                     + "jmeter.properties");// $NON-NLS-1$
 8  }  9 
 10         if (parser.getArgumentById(JMLOGFILE_OPT) != null){  11             String jmlogfile=parser.getArgumentById(JMLOGFILE_OPT).getArgument();  12             jmlogfile = processLAST(jmlogfile, ".log");// $NON-NLS-1$
 13  JMeterUtils.setProperty(LoggingManager.LOG_FILE,jmlogfile);  14  }  15 
 16  JMeterUtils.initLogging();  17  JMeterUtils.initLocale();  18         // Bug 33845 - allow direct override of Home dir
 19         if (parser.getArgumentById(JMETER_HOME_OPT) == null) {  20  JMeterUtils.setJMeterHome(NewDriver.getJMeterDir());  21         } else {  22  JMeterUtils.setJMeterHome(parser.getArgumentById(JMETER_HOME_OPT).getArgument());  23  }  24 
 25         Properties jmeterProps = JMeterUtils.getJMeterProperties();  26         remoteProps = new Properties();  27 
 28         // Add local JMeter properties, if the file is found
 29         String userProp = JMeterUtils.getPropDefault("user.properties",""); //$NON-NLS-1$
 30         if (userProp.length() > 0){ //$NON-NLS-1$
 31             FileInputStream fis=null;  32             try {  33                 File file = JMeterUtils.findFile(userProp);  34                 if (file.canRead()){  35                     log.info("Loading user properties from: "+file.getCanonicalPath());  36                     fis = new FileInputStream(file);  37                     Properties tmp = new Properties();  38  tmp.load(fis);  39  jmeterProps.putAll(tmp);  40                     LoggingManager.setLoggingLevels(tmp);//Do what would be done earlier
 41  }  42             } catch (IOException e) {  43                 log.warn("Error loading user property file: " + userProp, e);  44             } finally {  45  JOrphanUtils.closeQuietly(fis);  46  }  47  }  48 
 49         // Add local system properties, if the file is found
 50         String sysProp = JMeterUtils.getPropDefault("system.properties",""); //$NON-NLS-1$
 51         if (sysProp.length() > 0){  52             FileInputStream fis=null;  53             try {  54                 File file = JMeterUtils.findFile(sysProp);  55                 if (file.canRead()){  56                     log.info("Loading system properties from: "+file.getCanonicalPath());  57                     fis = new FileInputStream(file);  58  System.getProperties().load(fis);  59  }  60             } catch (IOException e) {  61                 log.warn("Error loading system property file: " + sysProp, e);  62             } finally {  63  JOrphanUtils.closeQuietly(fis);  64  }  65  }  66 
 67         // Process command line property definitions  68         // These can potentially occur multiple times
 69 
 70         List<CLOption> clOptions = parser.getArguments();  71         for (CLOption option : clOptions) {  72             String name = option.getArgument(0);  73             String value = option.getArgument(1);  74             FileInputStream fis = null;  75 
 76             switch (option.getDescriptor().getId()) {  77 
 78             // Should not have any text arguments
 79             case CLOption.TEXT_ARGUMENT:  80                 throw new IllegalArgumentException("Unknown arg: " + option.getArgument());  81 
 82             case PROPFILE2_OPT: // Bug 33920 - allow multiple props
 83                 try {  84                     fis = new FileInputStream(new File(name));  85                     Properties tmp = new Properties();  86  tmp.load(fis);  87  jmeterProps.putAll(tmp);  88                     LoggingManager.setLoggingLevels(tmp);//Do what would be done earlier
 89                 } catch (FileNotFoundException e) {  90                     log.warn("Can't find additional property file: " + name, e);  91                 } catch (IOException e) {  92                     log.warn("Error loading additional property file: " + name, e);  93                 } finally {  94  JOrphanUtils.closeQuietly(fis);  95  }  96                 break;  97             case SYSTEM_PROPFILE:  98                 log.info("Setting System properties from file: " + name);  99                 try { 100                     fis = new FileInputStream(new File(name)); 101  System.getProperties().load(fis); 102                 } catch (IOException e) { 103                     log.warn("Cannot find system property file " + e.getLocalizedMessage()); 104                 } finally { 105  JOrphanUtils.closeQuietly(fis); 106  } 107                 break; 108             case SYSTEM_PROPERTY: 109                 if (value.length() > 0) { // Set it
110                     log.info("Setting System property: " + name + "=" + value); 111  System.getProperties().setProperty(name, value); 112                 } else { // Reset it
113                     log.warn("Removing System property: " + name); 114  System.getProperties().remove(name); 115  } 116                 break; 117             case JMETER_PROPERTY: 118                 if (value.length() > 0) { // Set it
119                     log.info("Setting JMeter property: " + name + "=" + value); 120  jmeterProps.setProperty(name, value); 121                 } else { // Reset it
122                     log.warn("Removing JMeter property: " + name); 123  jmeterProps.remove(name); 124  } 125                 break; 126             case JMETER_GLOBAL_PROP: 127                 if (value.length() > 0) { // Set it
128                     log.info("Setting Global property: " + name + "=" + value); 129  remoteProps.setProperty(name, value); 130                 } else { 131                     File propFile = new File(name); 132                     if (propFile.canRead()) { 133                         log.info("Setting Global properties from the file " + name); 134                         try { 135                             fis = new FileInputStream(propFile); 136  remoteProps.load(fis); 137                         } catch (FileNotFoundException e) { 138                             log.warn("Could not find properties file: " + e.getLocalizedMessage()); 139                         } catch (IOException e) { 140                             log.warn("Could not load properties file: " + e.getLocalizedMessage()); 141                         } finally { 142  JOrphanUtils.closeQuietly(fis); 143  } 144  } 145  } 146                 break; 147             case LOGLEVEL: 148                 if (value.length() > 0) { // Set category
149                     log.info("LogLevel: " + name + "=" + value); 150  LoggingManager.setPriority(value, name); 151                 } else { // Set root level
152                     log.warn("LogLevel: " + name); 153  LoggingManager.setPriority(name); 154  } 155                 break; 156             case REMOTE_STOP: 157                 remoteStop = true; 158                 break; 159             default: 160                 // ignored
161                 break; 162  } 163  } 164 
165         String sampleVariables = (String) jmeterProps.get(SampleEvent.SAMPLE_VARIABLES); 166         if (sampleVariables != null){ 167  remoteProps.put(SampleEvent.SAMPLE_VARIABLES, sampleVariables); 168  } 169         jmeterProps.put("jmeter.version", JMeterUtils.getJMeterVersion()); 170     }
JMeter.java initializeProperties(CLArgsParser parser) 方法源碼

通過源碼可以看出 jmeter.properties、user.properties、system.properties均被系統獲取,並最終保存在 org.apache.jmeter.util.JMmeterUtils.java 類中的appProperties 這個私有變量中,我們可通過 JMeterUtils.java 類中如下方法獲取我們想要獲取的值。

下面就通過定制JMeter Slave的腳本分發路徑實例演示(相關命令請參閱上文)。

一、FileServer.java 源碼修改及編譯,生成class文件

1、新增方法
	/**
	 * Get slave home for set base by fanfengping 2016-06-21
	 * <p>
	 * 
	 * Reset base to SLAVE_ARG_HOME or JMETER_HOME when jmxBase is '.'.
	 */
	public File getSlaveBaseHome() {
		String slaveArgHome = JMeterUtils.getPropDefault("SLAVE_ARG_HOME", "");
		File jmeterHomeBase = new File(JMeterUtils.getJMeterHome());
		
		if ("".equals(slaveArgHome)) {
			return jmeterHomeBase;
		} else {
			return new File(slaveArgHome);
		}
	}

2、修改 setBase 方法
    /**
     * Sets the current base directory for relative file names.
     * 
     * @param jmxBase the path of the script file base directory, cannot be null
     * @throws IllegalStateException if files are still open
     * @throws IllegalArgumentException if {@code basepath} is null
     */
    public synchronized void setBase(File jmxBase) {
        if (jmxBase == null) {
            throw new IllegalArgumentException("jmxBase must not be null");
        }
        checkForOpenFiles();
        // base = jmxBase;
		/**
		 * fanfengping 2016-06-21
		 */
		base = ".".equals("" + jmxBase) ? getSlaveBaseHome() : jmxBase;
				
        log.info("setBase Set new base='"+base+"'");
}

3、修改 setBaseDir 方法
    /**
     * Sets the current base directory for relative file names from the provided path.
     * If the path does not refer to an existing directory, then its parent is used.
     * Normally the provided path is a file, so using the parent directory is appropriate.
     * 
     * @param basedir the path to set, or {@code null} if the GUI is being cleared
     * @throws IllegalStateException if files are still open
     */
    public synchronized void setBasedir(String basedir) {
        checkForOpenFiles(); // TODO should this be called if basedir == null?
        if (basedir != null) {
            File newBase = new File(basedir);
            if (!newBase.isDirectory()) {
                newBase = newBase.getParentFile();
            }
            // base = newBase;
			/**
			 * fanfengping 2016-06-21
			 */
			base = ".".equals("" + newBase) ? getSlaveBaseHome() : newBase;
            log.info("setBasedir Set new base='"+base+"'");
        }
    }

 

二、ApacheJMeter_core.jar重新打包

將新生成的class文件拷貝至對應目錄,重新打包 ApacheJMeter_core.jar,並替換JMETER_HOME/lib/ext 下的源文件。

三、user.properties配置文件修改

在文件末尾添加:SLAVE_ARG_HOME=E:/jmeter/script/,並在對應目錄放置相應的參數文件 distributed.csv。

在D盤根目錄下,重新執行啟動JMeter服務命令:jmeter -s

四、執行腳本

jmeter -n -t JMeter分布式測試參數化示例.jmx -r -l report.csv -j remote.log

執行結果如下所示:

三、查看Slave服務日志

當SLAVE_ARG_HOME=E:/jmeter/script/時,日志如下所示:

當SLAVE_ARG_HOME不存在或為空時,日志如下所示:

由此可見,配置已生效,且JMeter腳本能夠成功執行。

PS:暫未發現修改 base 后有其他的什么問題出現。若有發現因此產生的問題,敬請留言告知,不勝感激!

 

至此,此文順利完結,希望此文能夠給初學 JMeter 的您一份參考。

最后,非常感謝親的駐足,希望此文能對親有所幫助。熱烈歡迎親一起探討,共同進步。非常感謝! ^_^

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM