Skip to main content
Glama

execute_jmeter_test

Run JMeter performance tests by specifying the test file (.jmx), GUI mode, and custom properties. Simplify test execution and management through structured inputs.

Instructions

Execute a JMeter test.

Args: test_file: Path to the JMeter test file (.jmx) gui_mode: Whether to run in GUI mode (default: False) properties: Dictionary of JMeter properties to pass with -J (default: None)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
gui_modeNo
propertiesNo
test_fileYes

Implementation Reference

  • The @mcp.tool() decorator registers the 'execute_jmeter_test' function as an MCP tool.
    @mcp.tool()
  • The handler function implementing the tool logic. It accepts test_file, gui_mode, and properties parameters and delegates execution to the run_jmeter helper function.
    async def execute_jmeter_test(test_file: str, gui_mode: bool = False, properties: dict = None) -> str: """Execute a JMeter test. Args: test_file: Path to the JMeter test file (.jmx) gui_mode: Whether to run in GUI mode (default: False) properties: Dictionary of JMeter properties to pass with -J (default: None) """ return await run_jmeter(test_file, non_gui=not gui_mode, properties=properties) # Run in non-GUI mode by default
  • The run_jmeter helper function contains the core logic for executing JMeter tests using subprocess, handling both GUI and non-GUI modes, properties, report generation, and error handling.
    async def run_jmeter(test_file: str, non_gui: bool = True, properties: dict = None, generate_report: bool = False, report_output_dir: str = None, log_file: str = None) -> str: """Run a JMeter test. Args: test_file: Path to the JMeter test file (.jmx) non_gui: Run in non-GUI mode (default: True) properties: Dictionary of JMeter properties to pass with -J (default: None) generate_report: Whether to generate report dashboard after load test (default: False) report_output_dir: Output folder for report dashboard (default: None) log_file: Name of JTL file to log sample results to (default: None) Returns: str: JMeter execution output """ try: # Convert to absolute path test_file_path = Path(test_file).resolve() # Validate file exists and is a .jmx file if not test_file_path.exists(): return f"Error: Test file not found: {test_file}" if not test_file_path.suffix == '.jmx': return f"Error: Invalid file type. Expected .jmx file: {test_file}" # Get JMeter binary path from environment jmeter_bin = os.getenv('JMETER_BIN', 'jmeter') java_opts = os.getenv('JMETER_JAVA_OPTS', '') # Log the JMeter binary path and Java options logger.info(f"JMeter binary path: {jmeter_bin}") logger.debug(f"Java options: {java_opts}") # Build command cmd = [str(Path(jmeter_bin).resolve())] if non_gui: cmd.extend(['-n']) cmd.extend(['-t', str(test_file_path)]) # Add JMeter properties if provided∑ if properties: for prop_name, prop_value in properties.items(): cmd.extend([f'-J{prop_name}={prop_value}']) logger.debug(f"Adding property: -J{prop_name}={prop_value}") # Add report generation options if requested if generate_report and non_gui: if log_file is None: # Generate unique log file name if not specified unique_id = generate_unique_id() log_file = f"{test_file_path.stem}_{unique_id}_results.jtl" logger.debug(f"Using generated unique log file: {log_file}") cmd.extend(['-l', log_file]) cmd.extend(['-e']) # Always ensure report_output_dir is unique unique_id = unique_id if 'unique_id' in locals() else generate_unique_id() if report_output_dir: # Append unique identifier to user-provided report directory original_dir = report_output_dir report_output_dir = f"{original_dir}_{unique_id}" logger.debug(f"Making user-provided report directory unique: {original_dir} -> {report_output_dir}") else: # Generate unique report output directory if not specified report_output_dir = f"{test_file_path.stem}_{unique_id}_report" logger.debug(f"Using generated unique report output directory: {report_output_dir}") cmd.extend(['-o', report_output_dir]) # Log the full command for debugging logger.debug(f"Executing command: {' '.join(cmd)}") if non_gui: # For non-GUI mode, capture output result = subprocess.run(cmd, capture_output=True, text=True) # Log output for debugging logger.debug("Command output:") logger.debug(f"Return code: {result.returncode}") logger.debug(f"Stdout: {result.stdout}") logger.debug(f"Stderr: {result.stderr}") if result.returncode != 0: return f"Error executing JMeter test:\n{result.stderr}" return result.stdout else: # For GUI mode, start process without capturing output subprocess.Popen(cmd) return "JMeter GUI launched successfully" except Exception as e: return f"Unexpected error: {str(e)}"

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/QAInsights/jmeter-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server