Based on the "Testing" category.
Alternatively, view PyRestTest alternatives based on common mentions on social networks and blogs.
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of PyRestTest or a related project?
NEW: Full Python 3 Support in Alpha - download it, 'pip install future' and give it a try!
Apache License, Version 2.0
Status Badge PyPI version PyPI
Join the chat at https://gitter.im/svanoort/pyresttest
[Changelog](CHANGELOG.md) shows the past and present, milestones show the future roadmap.
PyRestTest works on Linux or Mac with Python 2.6, 2.7, or 3.3+ (with module 'future' installed)
First we need to install package python-pycurl:
apt-get install python-pycurlyum install python-pycurlapk add curl-devIt is easy to install the latest release by pip:
(sudo) pip install pyresttest (also install 'future' if on Python 3)
If pip isn't installed, we'll want to install it first: If that is not installed, we'll need to install it first:
apt-get install python-pipyum install python-pipbrew install python (it's included)wget https://bootstrap.pypa.io/get-pip.py && sudo python get-pip.pyReleases occur every few months, if you want to use unreleased features, it's easy to install from source:
See the [Change Log](CHANGELOG.md) for feature status.
git clone https://github.com/svanoort/pyresttest.git
cd pyresttest
sudo python setup.py install
The master branch tracks the latest; it is unit tested, but less stable than the releases (the 'stable' branch tracks tested releases).
Almost all installation issues are due to problems with PyCurl and PyCurl's native libcurl bindings. It is easy to check if PyCurl is installed correctly:
python -c 'import pycurl'
If this returns correctly, pycurl is installed, if you see an ImportError or similar, it isn't. You may also verify the pyyaml installation as well, since that can fail to install by pip in rare circumstances.
__main__.ConfigurationError: Could not run curl-config: [Errno 2] No such file or directory
This is caused by libcurl not being installed or recognized: first install pycurl using native packages as above. Alternately, try installing just the libcurl libraries:
sudo apt-get install libcurl4-openssl-devyum install libcurl-develPyCurl should install by pip, but sometimes has issues with pycurl/libcurl. Manually copying in a working system pycurl installation may help:
cp /usr/lib/python2.7/dist-packages/pycurl* env/local/lib/python2.7/site-packages/
This will check that APIs accept operations, and will smoketest an application
---
- config:
- testset: "Basic tests"
- timeout: 100 # Increase timeout from the default 10 seconds
- test:
- name: "Basic get"
- url: "/api/person/"
- test:
- name: "Get single person"
- url: "/api/person/1/"
- test:
- name: "Delete a single person, verify that works"
- url: "/api/person/1/"
- method: 'DELETE'
- test: # create entity by PUT
- name: "Create/update person"
- url: "/api/person/1/"
- method: "PUT"
- body: '{"first_name": "Gaius","id": 1,"last_name": "Baltar","login": "gbaltar"}'
- headers: {'Content-Type': 'application/json'}
- validators: # This is how we do more complex testing!
- compare: {header: content-type, comparator: contains, expected:'json'}
- compare: {jsonpath_mini: 'login', expected: 'gbaltar'} # JSON extraction
- compare: {raw_body:"", comparator:contains, expected: 'Baltar' } # Tests on raw response
- test: # create entity by POST
- name: "Create person"
- url: "/api/person/"
- method: "POST"
- body: '{"first_name": "William","last_name": "Adama","login": "theadmiral"}'
- headers: {Content-Type: application/json}
Run a basic test of the github API:
pyresttest https://api.github.com examples/github_api_smoketest.yaml
A simple set of tests that show how json validation can be used to check contents of a response. Test includes both successful and unsuccessful validation using github API.
pyresttest https://api.github.com examples/github_api_test.yaml
(For help: pyresttest --help )
Same as the other test but running in interactive mode.
pyresttest https://api.github.com examples/github_api_test.yaml --interactive true --print-bodies true
pyresttest https://api.github.com examples/github_api_test.yaml --log debug
As you can see, tests are defined in YAML format.
There are 5 top level test syntax elements:
---
# Will load the test sets from miniapp-test.yaml and run them
# Note that this will run AFTER the current test set is executed
# Also note that imported tests get a new Context: any variables defined will be lost between test sets
- import: examples/miniapp-test.yaml
Imports are intended to let you create top-level test suites that run many independent, isolated test scenarios (test sets). They may also be used to create sample data or perform cleanup as long as you don't rely on variables to store this information. For example, if one testset creates a user for a set of scenarios, tests that rely on that user's ID need to start by querying the API to get the ID.
A simple URL test is equivalent to a basic GET test with that URL. Also shows how to use the timeout option in testset config to descrease the default timeout from 10 seconds to 1.
---
- config:
- testset: "Basic tests"
- timeout: 1
- url: "/api/person/" # This is a simple test
- test:
- url: "/api/person/" # This does the same thing
For advanced cases (example: SSL client certs), sometimes you will want to use custom Curl settings that don't have a corresponding option in PyRestTest.
This is easy to do: for each test, you can specify custom Curl arguments with 'curl_option_optionname.' For this, 'optionname' is case-insensitive and the optionname is a Curl Easy Option with 'CURLOPT_' removed.
For example, to follow redirects up to 5 times (CURLOPT_FOLLOWLOCATION and CURLOPT_MAXREDIRS):
---
- test:
- url: "/api/person/1"
- curl_option_followlocation: True
- curl_option_maxredirs: 5
Note that while option names are validated, no validation is done on their values.
Oh, yes please! PyRestTest allows you to collect low-level network performance metrics from Curl itself.
Benchmarks are based off of tests: they extend the configuration elements in a test, allowing you to configure the REST call similarly. However, they do not perform validation on the HTTP response, instead they collect metrics.
There are a few custom configuration options specific to benchmarks:
There are two ways to collect performance metrics: raw data, and aggregated stats. Each metric may yield raw data, plus one or more aggregate values.
To return raw data, in the 'metrics' configuration element, simply input the metric name in a list of values. The example below will return raw data for total time and size of download (101 values each).
- benchmark: # create entity
- name: "Basic get"
- url: "/api/person/"
- warmup_runs: 7
- 'benchmark_runs': '101'
- output_file: 'miniapp-benchmark.csv'
- metrics:
- total_time
- size_download
Aggregates are pretty straightforward:
Currently supported metrics are listed below, and these are a subset of Curl get_info variables. These variables are explained here (with the CURLINFO_ prefix removed): curl_easy_get_info documentation
Metrics: 'appconnect_time', 'connect_time', 'namelookup_time', 'num_connects', 'pretransfer_time', 'redirect_count', 'redirect_time', 'request_size', 'size_download', 'size_upload', 'speed_download', 'speed_upload', 'starttransfer_time', 'total_time'
CSV is the default report format. CSV ouput will include:
In JSON, the data is structured slightly differently:
{"failures": 0,
"aggregates":
[["metric_name", "aggregate", "aggregateValue"] ...],
"failures": failureCount,
"group": "Default",
"results": {"total_time": [value1, value2, etc], "metric2":[value1, value2, etc], ... }
}
Samples:
---
- config:
- testset: "Benchmark tests using test app"
- benchmark: # create entity
- name: "Basic get"
- url: "/api/person/"
- warmup_runs: 7
- 'benchmark_runs': '101'
- output_file: 'miniapp-benchmark.csv'
- metrics:
- total_time
- total_time: mean
- total_time: median
- size_download
- speed_download: median
- benchmark: # create entity
- name: "Get single person"
- url: "/api/person/1/"
- metrics: {speed_upload: median, speed_download: median, redirect_time: mean}
- output_format: json
- output_file: 'miniapp-single.json'
It's easy to build and install from RPM:
python setup.py bdist_rpm # Build RPM
find -iname '*.rpm' # Gets the RPM name
sudo yum localinstall my_rpm_name
sudo yum install PyYAML python-pycurl # If using python3, needs 'future' too
Gotcha: Python distutils add a dependency on your major python version. This means you can't build an RPM for a system with Python 2.6 on a Python 2.7 system.
You'll need to install rpm-build, and then it should work.
sudo yum install rpm-build
We welcome any feedback you have, including pull requests, reported issues, etc!
For new contributors there are a whole set of issues labelled with help wanted which are excellent starting points to offer a contribution!
For instructions on how to set up a dev environment for PyRestTest, see [building.md](building.md).
For pull requests to get easily merged, please:
Bear in mind that this is largely a one-man, outside-of-working-hours effort at the moment, so response times will vary. That said: every feature request gets heard, and even if it takes a while, all the reasonable features will get incorporated. If you fork the main repo, check back periodically... you may discover that the next release includes something to meet your needs and then some!
*Note that all licence references and agreements mentioned in the PyRestTest README section above
are relevant to that project's source code only.
Do not miss the trending, packages, news and articles with our weekly report.