Skip to main content

Simple JMeter performance tests API for python

Project description

pymeter

All Contributors

Simple JMeter performance tests API for python

Powered by JMeter-DSL and pyjnius

Version Generic badge Generic badge Documentation Status

License






Load testing with JMeter using python!

Read the documentation here
Read about performance benchmarking here

JMeter is one of the most popular and long standing load testing tools.
The original implementation is a gui based tool to script load test scenarios in a hierarchical structure, however this came with limitations and shortcomings.

For once, upgrading JMeter versions is painful, as it involved manually downloading and deploying executable files. This became very clear when log4j vulnerability was discovered, and software developers needed to instantly upgrade their log4j versions. With JMeter, this was even more painful without a proper package management system such as maven or gradle.

Other limitations include difficulty to share code between different projects, using source control management tools such as git or svn. It is quite difficult to extend JMeter and it requires a GUI editor which means to use additional development environment instead of using a single IDE for all needs.

The awesome folks at abstracta have put up an amazing amount of work to deliver JMeter-DSL, which allows developers to use plain Java to script their load test scenarios, and pretty much solve all the pain mentioned above.

pymeter project is aimed to capitalize on the success of JMeter-DSL and extend it to the python community! Using pyjnius developed by Kivy, it is possible to bridge between JMeter-DSLs classes written in Java and reflect them into python's runtime environment without spawning up java runtime and relying on costly inter-process communication.

Pre-requisites:

  1. python version 3.9 or higher - download
  2. Java version 8 or 11 - download
  3. JAVA_HOME environment variable set - read

Install pymeter

>>> pip install py-jmeter-dsl

simple pymeter script:

"""unittest module"""
from unittest import TestCase, main

from pymeter.api.config import TestPlan, ThreadGroupWithRampUpAndHold
from pymeter.api.postprocessors import JsonExtractor
from pymeter.api.reporters import HtmlReporter
from pymeter.api.samplers import DummySampler, HttpSampler
from pymeter.api.timers import UniformRandomTimer


class TestTestPlanClass(TestCase):
    def test_1(self):
        json_extractor = JsonExtractor("variable", "args.var")
        timer = UniformRandomTimer(1000, 2000)
        http_sampler = HttpSampler(
            "Echo",
            "https://postman-echo.com/get?var=${__Random(0,10)}",
            timer,
            json_extractor,
        )
        dummy_sampler = DummySampler("dummy ${variable}", "hi dummy")
        tg = ThreadGroupWithRampUpAndHold(
            10, 1, 60, http_sampler, dummy_sampler, name="Some Name"
        )
        html_reporter = HtmlReporter()
        tp = TestPlan(tg, html_reporter)
        stats = tp.run()
        print(
            f"duration= {stats.duration_milliseconds}",
            f"mean= {stats.sample_time_mean_milliseconds}",
            f"min= {stats.sample_time_min_milliseconds}",
            f"median= {stats.sample_time_median_milliseconds}",
            f"90p= {stats.sample_time_90_percentile_milliseconds}",
            f"95p= {stats.sample_time_95_percentile_milliseconds}",
            f"99p= {stats.sample_time_99_percentile_milliseconds}",
            f"max= {stats.sample_time_max_milliseconds}",
            sep="\t",
        )
        self.assertLess(stats.sample_time_99_percentile_milliseconds, 2000)


if __name__ == "__main__":
    main()

In this example, the standard python unittest was used to execute the test code, however pymeter is framework agnostic and can be used by any other testing framework

File Structure

|   .coverage
|   .gitignore
|   .pylintrc
|   cosmic-ray-config.ini
|   LICENSE
|   make.bat
|   Makefile
|   poetry.lock
|   pyproject.toml
|   README.md
|   tox.ini               
+---source
|   |   conf.py
|   |   index.rst
|   |   
|   +---_static
|   \---_templates
+---src
|   \---pymeter
|       |   __init__.py
|       |   
|       +---api
|       |   |   config.py
|       |   |   postprocessors.py
|       |   |   reporters.py
|       |   |   samplers.py
|       |   |   timers.py
|       |   |   __init__.py
|       |   |   
+---utests
|   |   test_postprocessors.py
|   |   test_reporter.py
|   |   test_sampler.py
|   |   test_test_plan.py
|   |   test_thread_group.py
|   |   test_timers.py
|   |   __init__.py
|   |   

Code styling

black used for auto-formatting code read,

pylint used for code linting and pep8 compliance read,

mypy used for type hinting read,

perflint pylint extension for performance linting read

cosmic-ray Python tool for mutation testing read

Contributors

Antonio Zaitoun
Antonio Zaitoun

📖
Eldad Uzman
Eldad Uzman

🚇 ⚠️ 💻

links

  1. JMeter Dsl
  2. pyjnius

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_jmeter_dsl-0.5b0.tar.gz (65.3 MB view details)

Uploaded Source

File details

Details for the file py_jmeter_dsl-0.5b0.tar.gz.

File metadata

  • Download URL: py_jmeter_dsl-0.5b0.tar.gz
  • Upload date:
  • Size: 65.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.15

File hashes

Hashes for py_jmeter_dsl-0.5b0.tar.gz
Algorithm Hash digest
SHA256 7d3e4ad6f41d4ea04a6cb105f62d2db5438fffb6e5690889f8c083cc02480d12
MD5 46dc3b063df98342e6495c8e21750676
BLAKE2b-256 2f22ec8fd1697928862850d1962c1e8e6d823dd7c5d934404981b681201eee7b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page