System performance testing is often done as a high-ceremony performed for major releases only.
- Project on its own, designing:
- Requirement Analysis and Gathering
- PoC/Tool selection
- Performance Test Plan
- Performance Test Modeling
- Test Execution
- Test Analysis
- Done in a Test environment designed similar to Production
- Highly controlled environment
- Aiming to produce high loads and hard results: numbers, pass/fail
- Done by performance testing professionals
In today’s Agile and DevOps era teams are craving for rapid feedback and that certainly includes the impact of changes on system performance from one build to another. Performance testing can be done with reduced ceremony, continuously:
- As a part of a build pipeline
- In a lower-end Test environment
- Aiming to produce build trends because results could be more volatile
- Done by a DevOps team
Continuous Performance Testing is not difficult to set up on most projects. All you need is the following three ingredients, and each of them could be an open-source tool:
- Load Generator Tool
- Continuous Integration Server
- Chart Generator
The overall architecture (the big picture) of a solution relies on the usual Continuous Integration approach:
Load Generator Tools
Load generators can load a system-under-test with (HTTP) requests simulating the activity of virtual users. They support load logic (# of simulated clients, # of loops, spikes, fixed time testing, etc.) as well as simple scripting and assertion logic. Load generation could also be distributed to multiple machines.
Open source choices include:
- Apache JMeter: a mature performance testing IDE. Tests are developed primarily via composition and configuration of JMeter components.
- Gatling: Scala code-based tests, which can be generated recorder UI gene5
- Locust: Python code-based tests
You can find a more comprehensive comparison here: Open Source Load Testing Tools: Which One Should You Use?
Commercial tools include LoadRunner, Telerik Test Studio and New Relic Synthetics. Notably, Microsoft performance testing offerings in Visual Studio Enterprise and Azure DevOps were deprecated in 2011 and Microsoft recommends a migration path to JMeter.
Continuous Integration (CI) Servers
Jenkins is a popular open-source choice offering a wide variety of plug-ins, including chart generators. Any other CI server is also an option.
The critical part of Continuous Performance Testing is providing feedback to the DevOps team, ideally, on every build. This could be done in the form of generated charts showing performance trends. This could be done by feeding raw output data (e.g. CSVs, XMLs) to dashboards. An easier solution to implement though is to use CI server built-in or third-party chart generation capabilities. There are two good options that can be used if you’re running Jenkins.
Jenkins Performance Plug-In
- Use Advanced > Display Performance Report Per Test Case = on. This would chart one line per a performance test case (e.g. a JMeter Sampler) average data point.
- Chart titles = data file names. You can omit .xml suffix and give files verbose names with spaces to use them as chart titles. Patterns containing spaces would be matched. For example, the
build/jmeter-report/ *pattern would match any data file name that starts from space.
- Performance Plug-in would publish reports only for data files found in the latest build. Data files previously found in builds, but not present in the latest build are ignored. If you want to start a fresh baseline, you can do this by simply renaming data file(s).
- If there is a single data file, its charts are published on the main job page. If there are several reports, charts could be found on the job’s Performance Trend page, ordered by titles.
- You have to have at least two builds in order to see trend charts. If you have a test, which was temporarily disabled or removed then re-enabled, you would need to have it in at least two builds in order to see a corresponding trend line.
- Deleted builds are automatically removed from reports.
- It is recommended to split reports containing more than 10-20 tests so that they are easier to read.
Jenkins Plot Plug-In
Jenkins Plot Plug-In can be used to chart arbitrary generated data. It’s useful for fixed-time performance tests generating, for example, Transactions Per Second (TPS) metrics.