Note
This section provides a collection of questions with answers that don't otherwise fit in the rest of the documentation. If something is missing, please create an issue.
As this document grows it will gain a more refined structure.
yaml
No, you can use gabbi-run <runner>
to test an HTTP service built in any programming language.
Each YAML file contains a sequence of tests, each test within each file has a name. That name is translated to the name of the test by replacing spaces with an _
.
When running tests that are generated dynamically <loader>
, filtering based on the test name prior to the test being collected will not work in some test runners. Test runners that use a --load-list
functionality can be convinced to filter after discovery.
pytest does this directly with the -k
keyword flag.
When using testrepository with tox as used in gabbi's own tests it is possible to pass a filter in the tox command:
tox -epy27 -- get_the_widget
When using testtools.run
and similar test runners it's a bit more complicated. It is necessary to provide the full name of the test as a list to --load-list
:
python -m testtools.run --load-list \
<(echo package.tests.test_api.yamlfile_get_the_widge.test_request)
By default, when you select a single test to run, all tests prior to that one in a file will be run as well: the file is treated as as sequence of dependent tests. If you do not want this you can adjust the use_prior_test
test metadata <metadata>
in one of three ways:
- Set it in the YAML file for the one test you are concerned with.
- Set the
defaults
for all tests in that file. - set
use_prior_test
to false when calling~gabbi.driver.build_tests
Be aware that doing this breaks a fundamental assumption that gabbi makes about how tests work. Any substitutions <state-substitution>
will fail.
Gabbi provides the $ENVIRON
substitution
<state-substitution>
which can operate a bit like variables that are set elsewhere and then used in the tests defined by the YAML.
If you find it necessary to have variables within a single YAML file you take advantage of YAML alias nodes list this:
vars:
- &uuid_1 5613AABF-BAED-4BBA-887A-252B2D3543F8
tests:
- name: send a uuid to a post
POST: /resource
request_headers:
content-type: application/json
data:
uuid: *uuid_1
You can alias all sorts of nodes, not just single items. Be aware that the replacement of an alias node happens while the YAML is being loaded, before gabbi does any processing.
For the sake of readability it is best to keep each YAML file relatively short. Since each YAML file represents a sequence of requests, it usually makes sense to create a new file when a test is not dependent on any before it.
It's tempting to put all the tests for any resource or URL in the same file, but this eventually leads to files that are too long and are thus difficult to read.