123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- BIND10 system testing with Lettuce
- or: to BDD or not to BDD
- In this directory, we define a set of behavioral tests for BIND 10. Currently,
- these tests are specific for BIND10, but we are keeping in mind that RFC-related
- tests could be separated, so that we can test other systems as well.
- Prerequisites:
- - Installed version of BIND 10 (but see below how to run it from source tree)
- - dig
- - lettuce (http://lettuce.it)
- To install lettuce, if you have the python pip installation tool, simply do
- pip install lettuce
- See http://lettuce.it/intro/install.html
- Most systems have the pip tool in a separate package; on Debian-based systems
- it is called python-pip. On FreeBSD the port is devel/py-pip.
- Running the tests
- -----------------
- At this moment, we have a fixed port for local tests in our setups, port 47806.
- This port must be free. (TODO: can we make this run-time discovered?).
- Port 47805 is used for cmdctl, and must also be available.
- (note, we will need to extend this to a range, or if possible, we will need to
- do some on-the-fly available port finding)
- The bind10 main program, bindctl, and dig must all be in the default search
- path of your environment, and BIND 10 must not be running if you use the
- installed version when you run the tests.
- If you want to test an installed version of bind 10, just run 'lettuce' in
- this directory.
- We have provided a script that sets up the shell environment to run the tests
- with the build tree version of bind. If your shell uses export to set
- environment variables, you can source the script setup_intree_bind10.sh, then
- run lettuce.
- Due to the default way lettuce prints its output, it is advisable to run it
- in a terminal that is wide than the default. If you see a lot of lines twice
- in different colors, the terminal is not wide enough.
- If you just want to run one specific feature test, use
- lettuce features/<feature file>
- To run a specific scenario from a feature, use
- lettuce features/<feature file> -s <scenario number>
- We have set up the tests to assume that lettuce is run from this directory,
- so even if you specify a specific feature file, you should do it from this
- directory.
- What to do when a test fails
- ----------------------------
- First of all, look at the error it printed and see what step it occurred in.
- If written well, the output should explain most of what went wrong.
- The stacktrace that is printed is *not* of bind10, but of the testing
- framework; this helps in finding more information about what exactly the test
- tried to achieve when it failed (as well as help debug the tests themselves).
- Furthermore, if any scenario fails, the output from long-running processes
- will be stored in the directory output/. The name of the files will be
- <Feature name>-<Scenario name>-<Process name>.stdout and
- <Feature name>-<Scenario name>-<Process name>.stderr
- Where spaces and other non-standard characters are replaced by an underscore.
- The process name is either the standard name for said process (e.g. 'bind10'),
- or the name given to it by the test ('when i run bind10 as <name>').
- These files *will* be overwritten or deleted if the same scenarios are run
- again, so if you want to inspect them after a failed test, either do so
- immediately or move the files.
- Adding and extending tests
- --------------------------
- If you want to add tests, it is advisable to first go through the examples to
- see what is possible, and read the documentation on http://www.lettuce.it
- There is also a README.tutorial file here.
- We have a couple of conventions to keep things manageable.
- Configuration files go into the configurations/ directory.
- Data files go into the data/ directory.
- Step definition go into the features/terrain/ directory (the name terrain is
- chosen for the same reason Lettuce chose terrain.py, this is the place the
- tests 'live' in).
- Feature definitions go directly into the features/ directory.
- These directories are currently not divided further; we may want to consider
- this as the set grows. Due to a (current?) limitation of Lettuce, for
- feature files this is currently not possible; the python files containing
- steps and terrain must be below or at the same level of the feature files.
- Long-running processes should be started through the world.RunningProcesses
- instance. If you want to add a process (e.g. bind9), create start, stop and
- control steps in terrain/<base_name>_control.py, and let it use the
- RunningProcesses API (defined in terrain.py). See bind10_control.py for an
- example.
- For sending queries and checking the results, steps have been defined in
- terrain/querying.py. These use dig and store the results split up into text
- strings. This is intentionally not parsed through our own library (as that way
- we might run into a 'symmetric bug'). If you need something more advanced from
- query results, define it here.
- Some very general steps are defined in terrain/steps.py.
- Initialization code, cleanup code, and helper classes are defined in
- terrain/terrain.py.
- To find the right steps, case insensitive matching is used. Parameters taken
- from the steps are case-sensitive though. So a step defined as
- 'do foo with value (bar)' will be matched when using
- 'Do Foo with value xyz', but xyz will be taken as given.
- If you need to add steps that are very particular to one test, create a new
- file with a name relevant for that test in terrain. We may want to consider
- creating a specific subdirectory for these, but at this moment it is unclear
- whether we need to.
- We should try to keep steps as general as possible, while not making them to
- complex and error-prone.
|