4634.39.32
by Ian Clatworthy
proper Contents panel in bzr-developers.chm |
1 |
==================== |
2 |
Bazaar Testing Guide |
|
3 |
==================== |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
4 |
|
5 |
||
6 |
The Importance of Testing |
|
7 |
========================= |
|
8 |
||
5225.2.1
by Martin Pool
Mention Babune in test guide. |
9 |
Reliability is a critical success factor for any version control system. |
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
10 |
We want Bazaar to be highly reliable across multiple platforms while |
11 |
evolving over time to meet the needs of its community. |
|
12 |
||
13 |
In a nutshell, this is what we expect and encourage: |
|
14 |
||
15 |
* New functionality should have test cases. Preferably write the |
|
16 |
test before writing the code. |
|
17 |
||
18 |
In general, you can test at either the command-line level or the |
|
19 |
internal API level. See `Writing tests`_ below for more detail. |
|
20 |
||
21 |
* Try to practice Test-Driven Development: before fixing a bug, write a |
|
22 |
test case so that it does not regress. Similarly for adding a new |
|
23 |
feature: write a test case for a small version of the new feature before |
|
24 |
starting on the code itself. Check the test fails on the old code, then |
|
25 |
add the feature or fix and check it passes. |
|
26 |
||
27 |
By doing these things, the Bazaar team gets increased confidence that |
|
28 |
changes do what they claim to do, whether provided by the core team or |
|
29 |
by community members. Equally importantly, we can be surer that changes |
|
30 |
down the track do not break new features or bug fixes that you are |
|
31 |
contributing today. |
|
32 |
||
4665.2.2
by Martin Pool
Doc update that there are actually many more tests now |
33 |
As of September 2009, Bazaar ships with a test suite containing over |
34 |
23,000 tests and growing. We are proud of it and want to remain so. As |
|
35 |
community members, we all benefit from it. Would you trust version control |
|
36 |
on your project to a product *without* a test suite like Bazaar has? |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
37 |
|
38 |
||
39 |
Running the Test Suite |
|
40 |
====================== |
|
41 |
||
5004.2.5
by Martin Pool
More docs on testing |
42 |
As of Bazaar 2.1, you must have the testtools_ library installed to run |
43 |
the bzr test suite. |
|
44 |
||
45 |
.. _testtools: https://launchpad.net/testtools/ |
|
46 |
||
5004.2.4
by Martin Pool
More tips on running tests |
47 |
To test all of Bazaar, just run:: |
48 |
||
49 |
bzr selftest |
|
50 |
||
5004.2.5
by Martin Pool
More docs on testing |
51 |
With ``--verbose`` bzr will print the name of every test as it is run. |
52 |
||
5004.2.4
by Martin Pool
More tips on running tests |
53 |
This should always pass, whether run from a source tree or an installed |
54 |
copy of Bazaar. Please investigate and/or report any failures. |
|
55 |
||
56 |
||
57 |
Running particular tests |
|
58 |
------------------------ |
|
59 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
60 |
Currently, bzr selftest is used to invoke tests. |
61 |
You can provide a pattern argument to run a subset. For example, |
|
62 |
to run just the blackbox tests, run:: |
|
63 |
||
64 |
./bzr selftest -v blackbox |
|
65 |
||
66 |
To skip a particular test (or set of tests), use the --exclude option |
|
67 |
(shorthand -x) like so:: |
|
68 |
||
69 |
./bzr selftest -v -x blackbox |
|
70 |
||
71 |
To ensure that all tests are being run and succeeding, you can use the |
|
72 |
--strict option which will fail if there are any missing features or known |
|
73 |
failures, like so:: |
|
74 |
||
75 |
./bzr selftest --strict |
|
76 |
||
77 |
To list tests without running them, use the --list-only option like so:: |
|
78 |
||
79 |
./bzr selftest --list-only |
|
80 |
||
81 |
This option can be combined with other selftest options (like -x) and |
|
82 |
filter patterns to understand their effect. |
|
83 |
||
84 |
Once you understand how to create a list of tests, you can use the --load-list |
|
85 |
option to run only a restricted set of tests that you kept in a file, one test |
|
86 |
id by line. Keep in mind that this will never be sufficient to validate your |
|
87 |
modifications, you still need to run the full test suite for that, but using it |
|
88 |
can help in some cases (like running only the failed tests for some time):: |
|
89 |
||
90 |
./bzr selftest -- load-list my_failing_tests |
|
91 |
||
92 |
This option can also be combined with other selftest options, including |
|
93 |
patterns. It has some drawbacks though, the list can become out of date pretty |
|
94 |
quick when doing Test Driven Development. |
|
95 |
||
96 |
To address this concern, there is another way to run a restricted set of tests: |
|
97 |
the --starting-with option will run only the tests whose name starts with the |
|
98 |
specified string. It will also avoid loading the other tests and as a |
|
99 |
consequence starts running your tests quicker:: |
|
100 |
||
101 |
./bzr selftest --starting-with bzrlib.blackbox |
|
102 |
||
103 |
This option can be combined with all the other selftest options including |
|
104 |
--load-list. The later is rarely used but allows to run a subset of a list of |
|
105 |
failing tests for example. |
|
106 |
||
5004.2.4
by Martin Pool
More tips on running tests |
107 |
Disabling plugins |
108 |
----------------- |
|
109 |
||
110 |
To test only the bzr core, ignoring any plugins you may have installed, |
|
111 |
use:: |
|
112 |
||
113 |
./bzr --no-plugins selftest |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
114 |
|
5004.2.2
by Martin Pool
Recommend using -Dno_apport for development |
115 |
Disabling crash reporting |
116 |
------------------------- |
|
117 |
||
118 |
By default Bazaar uses apport_ to report program crashes. In developing |
|
119 |
Bazaar it's normal and expected to have it crash from time to time, at |
|
120 |
least because a test failed if for no other reason. |
|
121 |
||
122 |
Therefore you should probably add ``debug_flags = no_apport`` to your |
|
123 |
``bazaar.conf`` file (in ``~/.bazaar/`` on Unix), so that failures just |
|
124 |
print a traceback rather than writing a crash file. |
|
125 |
||
126 |
.. _apport: https://launchpad.net/apport/ |
|
127 |
||
128 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
129 |
Test suite debug flags |
130 |
---------------------- |
|
131 |
||
132 |
Similar to the global ``-Dfoo`` debug options, bzr selftest accepts |
|
133 |
``-E=foo`` debug flags. These flags are: |
|
134 |
||
135 |
:allow_debug: do *not* clear the global debug flags when running a test. |
|
136 |
This can provide useful logging to help debug test failures when used |
|
137 |
with e.g. ``bzr -Dhpss selftest -E=allow_debug`` |
|
138 |
||
5004.2.3
by Martin Pool
Caveat on -Eallow_debug |
139 |
Note that this will probably cause some tests to fail, because they |
140 |
don't expect to run with any debug flags on. |
|
141 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
142 |
|
5004.2.5
by Martin Pool
More docs on testing |
143 |
Using subunit |
144 |
------------- |
|
145 |
||
146 |
Bazaar can optionally produce output in the machine-readable subunit_ |
|
5060.2.1
by Robert Collins
* bzr now has a ``.testr.conf`` file in its source tree configured |
147 |
format, so that test output can be post-processed by various tools. To |
148 |
generate a subunit test stream:: |
|
149 |
||
150 |
$ ./bzr selftest --subunit |
|
151 |
||
152 |
Processing such a stream can be done using a variety of tools including: |
|
153 |
||
154 |
* The builtin ``subunit2pyunit``, ``subunit-filter``, ``subunit-ls``, |
|
155 |
``subunit2junitxml`` from the subunit project. |
|
156 |
||
157 |
* tribunal_, a GUI for showing test results. |
|
158 |
||
159 |
* testrepository_, a tool for gathering and managing test runs. |
|
5004.2.5
by Martin Pool
More docs on testing |
160 |
|
161 |
.. _subunit: https://launchpad.net/subunit/ |
|
5060.2.1
by Robert Collins
* bzr now has a ``.testr.conf`` file in its source tree configured |
162 |
.. _tribunal: https://launchpad.net/tribunal/ |
163 |
||
164 |
||
165 |
Using testrepository |
|
166 |
-------------------- |
|
167 |
||
168 |
Bazaar ships with a config file for testrepository_. This can be very |
|
169 |
useful for keeping track of failing tests and doing general workflow |
|
170 |
support. To run tests using testrepository:: |
|
171 |
||
172 |
$ testr run |
|
173 |
||
174 |
To run only failing tests:: |
|
175 |
||
176 |
$ testr run --failing |
|
177 |
||
178 |
To run only some tests, without plugins:: |
|
179 |
||
180 |
$ test run test_selftest -- --no-plugins |
|
181 |
||
182 |
See the testrepository documentation for more details. |
|
183 |
||
184 |
.. _testrepository: https://launchpad.net/testrepository |
|
5004.2.5
by Martin Pool
More docs on testing |
185 |
|
5225.2.1
by Martin Pool
Mention Babune in test guide. |
186 |
|
187 |
Babune continuous integration |
|
188 |
----------------------------- |
|
189 |
||
190 |
We have a Hudson continuous-integration system that automatically runs |
|
191 |
tests across various platforms. In the future we plan to add more |
|
192 |
combinations including testing plugins. See |
|
193 |
<http://babune.ladeuil.net:24842/>. (Babune = Bazaar Buildbot Network.) |
|
194 |
||
195 |
||
5335.3.2
by Martin Pool
Note about selftest --parallel |
196 |
Running tests in parallel |
197 |
------------------------- |
|
198 |
||
199 |
Bazaar can use subunit to spawn multiple test processes. There is |
|
200 |
slightly more chance you will hit ordering or timing-dependent bugs but |
|
201 |
it's much faster:: |
|
202 |
||
203 |
$ ./bzr selftest --parallel=fork |
|
204 |
||
5335.3.4
by Martin Pool
Review tweaks to testing documentation |
205 |
Note that you will need the Subunit library |
206 |
<https://launchpad.net/subunit/> to use this, which is in |
|
207 |
``python-subunit`` on Ubuntu. |
|
208 |
||
5335.3.2
by Martin Pool
Note about selftest --parallel |
209 |
|
5335.3.1
by Martin Pool
notes on testing on a tmpfs |
210 |
Running tests from a ramdisk |
211 |
---------------------------- |
|
212 |
||
213 |
The tests create and delete a lot of temporary files. In some cases you |
|
214 |
can make the test suite run much faster by running it on a ramdisk. For |
|
215 |
example:: |
|
216 |
||
217 |
$ sudo mkdir /ram |
|
218 |
$ sudo mount -t tmpfs none /ram |
|
219 |
$ TMPDIR=/ram ./bzr selftest ... |
|
220 |
||
221 |
You could also change ``/tmp`` in ``/etc/fstab`` to have type ``tmpfs``, |
|
222 |
if you don't mind possibly losing other files in there when the machine |
|
5335.3.4
by Martin Pool
Review tweaks to testing documentation |
223 |
restarts. Add this line (if there is none for ``/tmp`` already):: |
224 |
||
225 |
none /tmp tmpfs defaults 0 0 |
|
5335.3.1
by Martin Pool
notes on testing on a tmpfs |
226 |
|
227 |
With a 6-core machine and ``--parallel=fork`` using a tmpfs doubles the |
|
228 |
test execution speed. |
|
229 |
||
230 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
231 |
Writing Tests |
232 |
============= |
|
233 |
||
5004.2.5
by Martin Pool
More docs on testing |
234 |
Normally you should add or update a test for all bug fixes or new features |
235 |
in Bazaar. |
|
236 |
||
237 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
238 |
Where should I put a new test? |
239 |
------------------------------ |
|
240 |
||
241 |
Bzrlib's tests are organised by the type of test. Most of the tests in |
|
242 |
bzr's test suite belong to one of these categories: |
|
243 |
||
244 |
- Unit tests |
|
245 |
- Blackbox (UI) tests |
|
246 |
- Per-implementation tests |
|
247 |
- Doctests |
|
248 |
||
249 |
A quick description of these test types and where they belong in bzrlib's |
|
250 |
source follows. Not all tests fall neatly into one of these categories; |
|
251 |
in those cases use your judgement. |
|
252 |
||
253 |
||
254 |
Unit tests |
|
255 |
~~~~~~~~~~ |
|
256 |
||
257 |
Unit tests make up the bulk of our test suite. These are tests that are |
|
258 |
focused on exercising a single, specific unit of the code as directly |
|
259 |
as possible. Each unit test is generally fairly short and runs very |
|
260 |
quickly. |
|
261 |
||
262 |
They are found in ``bzrlib/tests/test_*.py``. So in general tests should |
|
263 |
be placed in a file named test_FOO.py where FOO is the logical thing under |
|
264 |
test. |
|
265 |
||
266 |
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py. |
|
267 |
See bzrlib/tests/test_sampler.py for a template test script. |
|
268 |
||
269 |
||
270 |
Blackbox (UI) tests |
|
271 |
~~~~~~~~~~~~~~~~~~~ |
|
272 |
||
273 |
Tests can be written for the UI or for individual areas of the library. |
|
274 |
Choose whichever is appropriate: if adding a new command, or a new command |
|
275 |
option, then you should be writing a UI test. If you are both adding UI |
|
276 |
functionality and library functionality, you will want to write tests for |
|
277 |
both the UI and the core behaviours. We call UI tests 'blackbox' tests |
|
278 |
and they belong in ``bzrlib/tests/blackbox/*.py``. |
|
279 |
||
280 |
When writing blackbox tests please honour the following conventions: |
|
281 |
||
282 |
1. Place the tests for the command 'name' in |
|
283 |
bzrlib/tests/blackbox/test_name.py. This makes it easy for developers |
|
284 |
to locate the test script for a faulty command. |
|
285 |
||
286 |
2. Use the 'self.run_bzr("name")' utility function to invoke the command |
|
287 |
rather than running bzr in a subprocess or invoking the |
|
288 |
cmd_object.run() method directly. This is a lot faster than |
|
289 |
subprocesses and generates the same logging output as running it in a |
|
290 |
subprocess (which invoking the method directly does not). |
|
4853.1.1
by Patrick Regan
Removed trailing whitespace from files in doc directory |
291 |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
292 |
3. Only test the one command in a single test script. Use the bzrlib |
293 |
library when setting up tests and when evaluating the side-effects of |
|
294 |
the command. We do this so that the library api has continual pressure |
|
295 |
on it to be as functional as the command line in a simple manner, and |
|
296 |
to isolate knock-on effects throughout the blackbox test suite when a |
|
297 |
command changes its name or signature. Ideally only the tests for a |
|
298 |
given command are affected when a given command is changed. |
|
299 |
||
300 |
4. If you have a test which does actually require running bzr in a |
|
301 |
subprocess you can use ``run_bzr_subprocess``. By default the spawned |
|
302 |
process will not load plugins unless ``--allow-plugins`` is supplied. |
|
303 |
||
304 |
||
305 |
Per-implementation tests |
|
306 |
~~~~~~~~~~~~~~~~~~~~~~~~ |
|
307 |
||
308 |
Per-implementation tests are tests that are defined once and then run |
|
309 |
against multiple implementations of an interface. For example, |
|
4913.3.7
by John Arbash Meinel
Doc updates for permute_for_extension |
310 |
``per_transport.py`` defines tests that all Transport implementations |
311 |
(local filesystem, HTTP, and so on) must pass. They are found in |
|
312 |
``bzrlib/tests/per_*/*.py``, and ``bzrlib/tests/per_*.py``. |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
313 |
|
314 |
These are really a sub-category of unit tests, but an important one. |
|
315 |
||
4913.3.7
by John Arbash Meinel
Doc updates for permute_for_extension |
316 |
Along the same lines are tests for extension modules. We generally have |
317 |
both a pure-python and a compiled implementation for each module. As such, |
|
318 |
we want to run the same tests against both implementations. These can |
|
319 |
generally be found in ``bzrlib/tests/*__*.py`` since extension modules are |
|
320 |
usually prefixed with an underscore. Since there are only two |
|
321 |
implementations, we have a helper function |
|
322 |
``bzrlib.tests.permute_for_extension``, which can simplify the |
|
323 |
``load_tests`` implementation. |
|
324 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
325 |
|
326 |
Doctests |
|
327 |
~~~~~~~~ |
|
328 |
||
329 |
We make selective use of doctests__. In general they should provide |
|
330 |
*examples* within the API documentation which can incidentally be tested. We |
|
5193.5.8
by Vincent Ladeuil
Revert previous change as I can't reproduce the related problem anymore. |
331 |
don't try to test every important case using doctests |--| regular Python |
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
332 |
tests are generally a better solution. That is, we just use doctests to |
333 |
make our documentation testable, rather than as a way to make tests. |
|
334 |
||
335 |
Most of these are in ``bzrlib/doc/api``. More additions are welcome. |
|
336 |
||
337 |
__ http://docs.python.org/lib/module-doctest.html |
|
338 |
||
339 |
||
4665.5.20
by Vincent Ladeuil
Fixed as per Martin's review. |
340 |
Shell-like tests |
4917.2.1
by Martin Pool
Add better example for ScriptRunner and tweak its place in the document hierarchy |
341 |
---------------- |
4665.5.20
by Vincent Ladeuil
Fixed as per Martin's review. |
342 |
|
343 |
``bzrlib/tests/script.py`` allows users to write tests in a syntax very close to a shell session, |
|
344 |
using a restricted and limited set of commands that should be enough to mimic |
|
345 |
most of the behaviours. |
|
346 |
||
347 |
A script is a set of commands, each command is composed of: |
|
348 |
||
349 |
* one mandatory command line, |
|
350 |
* one optional set of input lines to feed the command, |
|
351 |
* one optional set of output expected lines, |
|
352 |
* one optional set of error expected lines. |
|
353 |
||
354 |
Input, output and error lines can be specified in any order. |
|
355 |
||
356 |
Except for the expected output, all lines start with a special |
|
357 |
string (based on their origin when used under a Unix shell): |
|
358 |
||
359 |
* '$ ' for the command, |
|
360 |
* '<' for input, |
|
361 |
* nothing for output, |
|
362 |
* '2>' for errors, |
|
363 |
||
364 |
Comments can be added anywhere, they start with '#' and end with |
|
365 |
the line. |
|
366 |
||
367 |
The execution stops as soon as an expected output or an expected error is not |
|
4853.1.1
by Patrick Regan
Removed trailing whitespace from files in doc directory |
368 |
matched. |
4665.5.20
by Vincent Ladeuil
Fixed as per Martin's review. |
369 |
|
370 |
When no output is specified, any ouput from the command is accepted |
|
4853.1.1
by Patrick Regan
Removed trailing whitespace from files in doc directory |
371 |
and execution continue. |
4665.5.20
by Vincent Ladeuil
Fixed as per Martin's review. |
372 |
|
373 |
If an error occurs and no expected error is specified, the execution stops. |
|
374 |
||
375 |
An error is defined by a returned status different from zero, not by the |
|
376 |
presence of text on the error stream. |
|
377 |
||
378 |
The matching is done on a full string comparison basis unless '...' is used, in |
|
379 |
which case expected output/errors can be less precise. |
|
380 |
||
381 |
Examples: |
|
382 |
||
383 |
The following will succeeds only if 'bzr add' outputs 'adding file':: |
|
384 |
||
385 |
$ bzr add file |
|
386 |
>adding file |
|
387 |
||
388 |
If you want the command to succeed for any output, just use:: |
|
389 |
||
390 |
$ bzr add file |
|
5422.3.3
by Martin Pool
Update ScriptRunner docs: blank won't match output; suggest -q |
391 |
... |
392 |
2>... |
|
393 |
||
394 |
or use the ``--quiet`` option:: |
|
395 |
||
396 |
$ bzr add -q file |
|
4665.5.20
by Vincent Ladeuil
Fixed as per Martin's review. |
397 |
|
398 |
The following will stop with an error:: |
|
399 |
||
400 |
$ bzr not-a-command |
|
401 |
||
402 |
If you want it to succeed, use:: |
|
403 |
||
404 |
$ bzr not-a-command |
|
405 |
2> bzr: ERROR: unknown command "not-a-command" |
|
406 |
||
407 |
You can use ellipsis (...) to replace any piece of text you don't want to be |
|
408 |
matched exactly:: |
|
409 |
||
410 |
$ bzr branch not-a-branch |
|
411 |
2>bzr: ERROR: Not a branch...not-a-branch/". |
|
412 |
||
413 |
This can be used to ignore entire lines too:: |
|
414 |
||
415 |
$ cat |
|
416 |
<first line |
|
417 |
<second line |
|
418 |
<third line |
|
419 |
# And here we explain that surprising fourth line |
|
420 |
<fourth line |
|
421 |
<last line |
|
422 |
>first line |
|
423 |
>... |
|
424 |
>last line |
|
425 |
||
426 |
You can check the content of a file with cat:: |
|
427 |
||
428 |
$ cat <file |
|
429 |
>expected content |
|
430 |
||
431 |
You can also check the existence of a file with cat, the following will fail if |
|
432 |
the file doesn't exist:: |
|
433 |
||
434 |
$ cat file |
|
435 |
||
4917.2.1
by Martin Pool
Add better example for ScriptRunner and tweak its place in the document hierarchy |
436 |
The actual use of ScriptRunner within a TestCase looks something like |
437 |
this:: |
|
438 |
||
5283.1.1
by Martin Pool
Add helper function script.run_script and suggest using it |
439 |
from bzrlib.tests import script |
440 |
||
441 |
def test_unshelve_keep(self): |
|
442 |
# some setup here |
|
443 |
script.run_script(self, ''' |
|
444 |
$ bzr add file |
|
445 |
$ bzr shelve --all -m Foo |
|
446 |
$ bzr shelve --list |
|
447 |
1: Foo |
|
448 |
$ bzr unshelve --keep |
|
449 |
$ bzr shelve --list |
|
450 |
1: Foo |
|
451 |
$ cat file |
|
452 |
contents of file |
|
453 |
''') |
|
4917.2.1
by Martin Pool
Add better example for ScriptRunner and tweak its place in the document hierarchy |
454 |
|
5417.1.1
by Martin Pool
ScriptRunner can now cope with commands that prompt for input. |
455 |
You can also test commands that read user interaction:: |
456 |
||
457 |
def test_confirm_action(self): |
|
458 |
"""You can write tests that demonstrate user confirmation""" |
|
459 |
commands.builtin_command_registry.register(cmd_test_confirm) |
|
460 |
self.addCleanup(commands.builtin_command_registry.remove, 'test-confirm') |
|
461 |
self.run_script(""" |
|
462 |
$ bzr test-confirm |
|
463 |
2>Really do it? [y/n]: |
|
464 |
<yes |
|
465 |
yes |
|
466 |
""") |
|
4665.5.20
by Vincent Ladeuil
Fixed as per Martin's review. |
467 |
|
5017.2.2
by Martin Pool
Add import tariff tests |
468 |
Import tariff tests |
469 |
------------------- |
|
470 |
||
471 |
`bzrlib.tests.test_import_tariff` has some tests that measure how many |
|
472 |
Python modules are loaded to run some representative commands. |
|
473 |
||
474 |
We want to avoid loading code unnecessarily, for reasons including: |
|
475 |
||
476 |
* Python modules are interpreted when they're loaded, either to define |
|
477 |
classes or modules or perhaps to initialize some structures. |
|
478 |
||
479 |
* With a cold cache we may incur blocking real disk IO for each module. |
|
480 |
||
481 |
* Some modules depend on many others. |
|
482 |
||
483 |
* Some optional modules such as `testtools` are meant to be soft |
|
484 |
dependencies and only needed for particular cases. If they're loaded in |
|
485 |
other cases then bzr may break for people who don't have those modules. |
|
486 |
||
5279.1.1
by Andrew Bennetts
lazy_import most things in merge.py; add a few representative modules to the import tariff tests; tweak a couple of other modules so that patiencediff is not necessarily imported; remove a bunch of unused imports from test_knit.py. |
487 |
`test_import_tariff` allows us to check that removal of imports doesn't |
5017.2.2
by Martin Pool
Add import tariff tests |
488 |
regress. |
489 |
||
490 |
This is done by running the command in a subprocess with |
|
491 |
``--profile-imports``. Starting a whole Python interpreter is pretty |
|
492 |
slow, so we don't want exhaustive testing here, but just enough to guard |
|
493 |
against distinct fixed problems. |
|
494 |
||
495 |
Assertions about precisely what is loaded tend to be brittle so we instead |
|
496 |
make assertions that particular things aren't loaded. |
|
497 |
||
498 |
Unless selftest is run with ``--no-plugins``, modules will be loaded in |
|
499 |
the usual way and checks made on what they cause to be loaded. This is |
|
500 |
probably worth checking into, because many bzr users have at least some |
|
501 |
plugins installed (and they're included in binary installers). |
|
502 |
||
503 |
In theory, plugins might have a good reason to load almost anything: |
|
504 |
someone might write a plugin that opens a network connection or pops up a |
|
505 |
gui window every time you run 'bzr status'. However, it's more likely |
|
506 |
that the code to do these things is just being loaded accidentally. We |
|
507 |
might eventually need to have a way to make exceptions for particular |
|
508 |
plugins. |
|
509 |
||
510 |
Some things to check: |
|
511 |
||
512 |
* non-GUI commands shouldn't load GUI libraries |
|
513 |
||
514 |
* operations on bzr native formats sholudn't load foreign branch libraries |
|
515 |
||
516 |
* network code shouldn't be loaded for purely local operations |
|
517 |
||
518 |
* particularly expensive Python built-in modules shouldn't be loaded |
|
519 |
unless there is a good reason |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
520 |
|
521 |
||
4634.146.7
by Danny van Heumen
Updated documentation on how to approach testing locking behaviour. |
522 |
Testing locking behaviour |
523 |
------------------------- |
|
524 |
||
525 |
In order to test the locking behaviour of commands, it is possible to install |
|
526 |
a hook that is called when a write lock is: acquired, released or broken. |
|
527 |
(Read locks also exist, they cannot be discovered in this way.) |
|
528 |
||
529 |
A hook can be installed by calling bzrlib.lock.Lock.hooks.install_named_hook. |
|
530 |
The three valid hooks are: `lock_acquired`, `lock_released` and `lock_broken`. |
|
531 |
||
532 |
Example:: |
|
533 |
||
534 |
locks_acquired = [] |
|
535 |
locks_released = [] |
|
536 |
||
537 |
lock.Lock.hooks.install_named_hook('lock_acquired', |
|
538 |
locks_acquired.append, None) |
|
539 |
lock.Lock.hooks.install_named_hook('lock_released', |
|
540 |
locks_released.append, None) |
|
541 |
||
542 |
`locks_acquired` will now receive a LockResult instance for all locks acquired |
|
543 |
since the time the hook is installed. |
|
544 |
||
4634.146.10
by Danny van Heumen
Updated documentation: added case for BzrDir (removed "special case" remark) and removed explanation for LockResult representation. |
545 |
The last part of the `lock_url` allows you to identify the type of object that is locked. |
546 |
||
547 |
- BzrDir: `/branch-lock` |
|
548 |
- Working tree: `/checkout/lock` |
|
549 |
- Branch: `/branch/lock` |
|
550 |
- Repository: `/repository/lock` |
|
4634.146.7
by Danny van Heumen
Updated documentation on how to approach testing locking behaviour. |
551 |
|
552 |
To test if a lock is a write lock on a working tree, one can do the following:: |
|
553 |
||
554 |
self.assertEndsWith(locks_acquired[0].lock_url, "/checkout/lock") |
|
555 |
||
556 |
See bzrlib/tests/commands/test_revert.py for an example of how to use this for |
|
557 |
testing locks. |
|
558 |
||
5077.3.1
by Martin Pool
Tip on testing locking behaviour |
559 |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
560 |
Skipping tests |
561 |
-------------- |
|
562 |
||
563 |
In our enhancements to unittest we allow for some addition results beyond |
|
564 |
just success or failure. |
|
565 |
||
566 |
If a test can't be run, it can say that it's skipped by raising a special |
|
5193.5.8
by Vincent Ladeuil
Revert previous change as I can't reproduce the related problem anymore. |
567 |
exception. This is typically used in parameterized tests |--| for example |
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
568 |
if a transport doesn't support setting permissions, we'll skip the tests |
569 |
that relating to that. :: |
|
570 |
||
571 |
try: |
|
572 |
return self.branch_format.initialize(repo.bzrdir) |
|
573 |
except errors.UninitializableFormat: |
|
574 |
raise tests.TestSkipped('Uninitializable branch format') |
|
575 |
||
576 |
Raising TestSkipped is a good idea when you want to make it clear that the |
|
577 |
test was not run, rather than just returning which makes it look as if it |
|
578 |
was run and passed. |
|
579 |
||
580 |
Several different cases are distinguished: |
|
581 |
||
582 |
TestSkipped |
|
583 |
Generic skip; the only type that was present up to bzr 0.18. |
|
584 |
||
585 |
TestNotApplicable |
|
586 |
The test doesn't apply to the parameters with which it was run. |
|
587 |
This is typically used when the test is being applied to all |
|
588 |
implementations of an interface, but some aspects of the interface |
|
589 |
are optional and not present in particular concrete |
|
590 |
implementations. (Some tests that should raise this currently |
|
591 |
either silently return or raise TestSkipped.) Another option is |
|
592 |
to use more precise parameterization to avoid generating the test |
|
593 |
at all. |
|
594 |
||
595 |
UnavailableFeature |
|
596 |
The test can't be run because a dependency (typically a Python |
|
597 |
library) is not available in the test environment. These |
|
598 |
are in general things that the person running the test could fix |
|
599 |
by installing the library. It's OK if some of these occur when |
|
600 |
an end user runs the tests or if we're specifically testing in a |
|
601 |
limited environment, but a full test should never see them. |
|
602 |
||
603 |
See `Test feature dependencies`_ below. |
|
604 |
||
605 |
KnownFailure |
|
606 |
The test exists but is known to fail, for example this might be |
|
607 |
appropriate to raise if you've committed a test for a bug but not |
|
608 |
the fix for it, or if something works on Unix but not on Windows. |
|
4853.1.1
by Patrick Regan
Removed trailing whitespace from files in doc directory |
609 |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
610 |
Raising this allows you to distinguish these failures from the |
611 |
ones that are not expected to fail. If the test would fail |
|
612 |
because of something we don't expect or intend to fix, |
|
613 |
KnownFailure is not appropriate, and TestNotApplicable might be |
|
614 |
better. |
|
615 |
||
616 |
KnownFailure should be used with care as we don't want a |
|
617 |
proliferation of quietly broken tests. |
|
618 |
||
4873.2.4
by John Arbash Meinel
Add a NEWS entry and an entry in the testing docs about ModuleAvailableFeature |
619 |
|
620 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
621 |
We plan to support three modes for running the test suite to control the |
622 |
interpretation of these results. Strict mode is for use in situations |
|
623 |
like merges to the mainline and releases where we want to make sure that |
|
624 |
everything that can be tested has been tested. Lax mode is for use by |
|
625 |
developers who want to temporarily tolerate some known failures. The |
|
626 |
default behaviour is obtained by ``bzr selftest`` with no options, and |
|
627 |
also (if possible) by running under another unittest harness. |
|
628 |
||
629 |
======================= ======= ======= ======== |
|
630 |
result strict default lax |
|
631 |
======================= ======= ======= ======== |
|
632 |
TestSkipped pass pass pass |
|
633 |
TestNotApplicable pass pass pass |
|
3619.3.2
by Andrew Bennetts
Remove references to unimplemented TestPlatformLimit, remove some redundant (and misplaced) text from 'Test feature dependencies'. |
634 |
UnavailableFeature fail pass pass |
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
635 |
KnownFailure fail pass pass |
636 |
======================= ======= ======= ======== |
|
4853.1.1
by Patrick Regan
Removed trailing whitespace from files in doc directory |
637 |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
638 |
|
639 |
Test feature dependencies |
|
640 |
------------------------- |
|
641 |
||
642 |
Writing tests that require a feature |
|
643 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
644 |
||
645 |
Rather than manually checking the environment in each test, a test class |
|
646 |
can declare its dependence on some test features. The feature objects are |
|
647 |
checked only once for each run of the whole test suite. |
|
648 |
||
649 |
(For historical reasons, as of May 2007 many cases that should depend on |
|
650 |
features currently raise TestSkipped.) |
|
651 |
||
652 |
For example:: |
|
653 |
||
654 |
class TestStrace(TestCaseWithTransport): |
|
655 |
||
656 |
_test_needs_features = [StraceFeature] |
|
657 |
||
3619.3.2
by Andrew Bennetts
Remove references to unimplemented TestPlatformLimit, remove some redundant (and misplaced) text from 'Test feature dependencies'. |
658 |
This means all tests in this class need the feature. If the feature is |
659 |
not available the test will be skipped using UnavailableFeature. |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
660 |
|
661 |
Individual tests can also require a feature using the ``requireFeature`` |
|
662 |
method:: |
|
663 |
||
664 |
self.requireFeature(StraceFeature) |
|
665 |
||
5004.2.1
by Martin Pool
Better documentation of ModuleAvailableFeature |
666 |
The old naming style for features is CamelCase, but because they're |
667 |
actually instances not classses they're now given instance-style names |
|
668 |
like ``apport``. |
|
669 |
||
670 |
Features already defined in ``bzrlib.tests`` and ``bzrlib.tests.features`` |
|
671 |
include: |
|
672 |
||
673 |
- apport |
|
674 |
- paramiko |
|
675 |
- SymlinkFeature |
|
676 |
- HardlinkFeature |
|
677 |
- OsFifoFeature |
|
678 |
- UnicodeFilenameFeature |
|
679 |
- FTPServerFeature |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
680 |
- CaseInsensitiveFilesystemFeature. |
5094.3.1
by Martin Pool
``.bazaar``, ``.bazaar/bazaar.conf`` and ``.bzr.log`` inherit user and group ownership from the containing directory. This allow bzr to work better with sudo. |
681 |
- chown_feature: The test can rely on OS being POSIX and python |
5051.4.6
by Parth Malwankar
documented ChownFeature in testing.txt |
682 |
supporting os.chown. |
5094.3.1
by Martin Pool
``.bazaar``, ``.bazaar/bazaar.conf`` and ``.bzr.log`` inherit user and group ownership from the containing directory. This allow bzr to work better with sudo. |
683 |
- posix_permissions_feature: The test can use POSIX-style |
684 |
user/group/other permission bits. |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
685 |
|
686 |
||
687 |
Defining a new feature that tests can require |
|
688 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
689 |
||
690 |
New features for use with ``_test_needs_features`` or ``requireFeature`` |
|
691 |
are defined by subclassing ``bzrlib.tests.Feature`` and overriding the |
|
692 |
``_probe`` and ``feature_name`` methods. For example:: |
|
693 |
||
694 |
class _SymlinkFeature(Feature): |
|
4853.1.1
by Patrick Regan
Removed trailing whitespace from files in doc directory |
695 |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
696 |
def _probe(self): |
697 |
return osutils.has_symlinks() |
|
4853.1.1
by Patrick Regan
Removed trailing whitespace from files in doc directory |
698 |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
699 |
def feature_name(self): |
700 |
return 'symlinks' |
|
4853.1.1
by Patrick Regan
Removed trailing whitespace from files in doc directory |
701 |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
702 |
SymlinkFeature = _SymlinkFeature() |
703 |
||
5004.2.1
by Martin Pool
Better documentation of ModuleAvailableFeature |
704 |
A helper for handling running tests based on whether a python |
705 |
module is available. This can handle 3rd-party dependencies (is |
|
706 |
``paramiko`` available?) as well as stdlib (``termios``) or |
|
707 |
extension modules (``bzrlib._groupcompress_pyx``). You create a |
|
708 |
new feature instance with:: |
|
709 |
||
710 |
# in bzrlib/tests/features.py |
|
711 |
apport = tests.ModuleAvailableFeature('apport') |
|
712 |
||
713 |
||
714 |
# then in bzrlib/tests/test_apport.py |
|
715 |
class TestApportReporting(TestCaseInTempDir): |
|
716 |
||
717 |
_test_needs_features = [features.apport] |
|
718 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
719 |
|
5432.6.1
by John C Barstow
Mention applyDeprecated in doc/developers/testing.txt |
720 |
Testing deprecated code |
721 |
----------------------- |
|
722 |
||
723 |
When code is deprecated, it is still supported for some length of time, |
|
724 |
usually until the next major version. The ``applyDeprecated`` helper |
|
725 |
wraps calls to deprecated code to verify that it is correctly issuing the |
|
726 |
deprecation warning, and also prevents the warnings from being printed |
|
727 |
during test runs. |
|
728 |
||
729 |
Typically patches that apply the ``@deprecated_function`` decorator should |
|
730 |
update the accompanying tests to use the ``applyDeprecated`` wrapper. |
|
731 |
||
732 |
``applyDeprecated`` is defined in ``bzrlib.tests.TestCase``. See the API |
|
733 |
docs for more details. |
|
734 |
||
735 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
736 |
Testing exceptions and errors |
737 |
----------------------------- |
|
738 |
||
739 |
It's important to test handling of errors and exceptions. Because this |
|
740 |
code is often not hit in ad-hoc testing it can often have hidden bugs -- |
|
741 |
it's particularly common to get NameError because the exception code |
|
742 |
references a variable that has since been renamed. |
|
743 |
||
744 |
.. TODO: Something about how to provoke errors in the right way? |
|
745 |
||
746 |
In general we want to test errors at two levels: |
|
747 |
||
748 |
1. A test in ``test_errors.py`` checking that when the exception object is |
|
749 |
constructed with known parameters it produces an expected string form. |
|
750 |
This guards against mistakes in writing the format string, or in the |
|
751 |
``str`` representations of its parameters. There should be one for |
|
752 |
each exception class. |
|
753 |
||
754 |
2. Tests that when an api is called in a particular situation, it raises |
|
755 |
an error of the expected class. You should typically use |
|
756 |
``assertRaises``, which in the Bazaar test suite returns the exception |
|
757 |
object to allow you to examine its parameters. |
|
758 |
||
759 |
In some cases blackbox tests will also want to check error reporting. But |
|
760 |
it can be difficult to provoke every error through the commandline |
|
5193.5.8
by Vincent Ladeuil
Revert previous change as I can't reproduce the related problem anymore. |
761 |
interface, so those tests are only done as needed |--| eg in response to a |
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
762 |
particular bug or if the error is reported in an unusual way(?) Blackbox |
763 |
tests should mostly be testing how the command-line interface works, so |
|
764 |
should only test errors if there is something particular to the cli in how |
|
765 |
they're displayed or handled. |
|
766 |
||
767 |
||
768 |
Testing warnings |
|
769 |
---------------- |
|
770 |
||
771 |
The Python ``warnings`` module is used to indicate a non-fatal code |
|
772 |
problem. Code that's expected to raise a warning can be tested through |
|
773 |
callCatchWarnings. |
|
774 |
||
775 |
The test suite can be run with ``-Werror`` to check no unexpected errors |
|
776 |
occur. |
|
777 |
||
778 |
However, warnings should be used with discretion. It's not an appropriate |
|
779 |
way to give messages to the user, because the warning is normally shown |
|
780 |
only once per source line that causes the problem. You should also think |
|
781 |
about whether the warning is serious enought that it should be visible to |
|
782 |
users who may not be able to fix it. |
|
783 |
||
784 |
||
785 |
Interface implementation testing and test scenarios |
|
786 |
--------------------------------------------------- |
|
787 |
||
788 |
There are several cases in Bazaar of multiple implementations of a common |
|
789 |
conceptual interface. ("Conceptual" because it's not necessary for all |
|
790 |
the implementations to share a base class, though they often do.) |
|
791 |
Examples include transports and the working tree, branch and repository |
|
792 |
classes. |
|
793 |
||
794 |
In these cases we want to make sure that every implementation correctly |
|
795 |
fulfils the interface requirements. For example, every Transport should |
|
796 |
support the ``has()`` and ``get()`` and ``clone()`` methods. We have a |
|
797 |
sub-suite of tests in ``test_transport_implementations``. (Most |
|
798 |
per-implementation tests are in submodules of ``bzrlib.tests``, but not |
|
799 |
the transport tests at the moment.) |
|
800 |
||
801 |
These tests are repeated for each registered Transport, by generating a |
|
802 |
new TestCase instance for the cross product of test methods and transport |
|
803 |
implementations. As each test runs, it has ``transport_class`` and |
|
804 |
``transport_server`` set to the class it should test. Most tests don't |
|
805 |
access these directly, but rather use ``self.get_transport`` which returns |
|
806 |
a transport of the appropriate type. |
|
807 |
||
808 |
The goal is to run per-implementation only the tests that relate to that |
|
809 |
particular interface. Sometimes we discover a bug elsewhere that happens |
|
810 |
with only one particular transport. Once it's isolated, we can consider |
|
811 |
whether a test should be added for that particular implementation, |
|
812 |
or for all implementations of the interface. |
|
813 |
||
814 |
See also `Per-implementation tests`_ (above). |
|
815 |
||
816 |
||
5462.3.12
by Martin Pool
Doc for variations |
817 |
Test scenarios and variations |
818 |
----------------------------- |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
819 |
|
820 |
Some utilities are provided for generating variations of tests. This can |
|
821 |
be used for per-implementation tests, or other cases where the same test |
|
822 |
code needs to run several times on different scenarios. |
|
823 |
||
824 |
The general approach is to define a class that provides test methods, |
|
825 |
which depend on attributes of the test object being pre-set with the |
|
826 |
values to which the test should be applied. The test suite should then |
|
827 |
also provide a list of scenarios in which to run the tests. |
|
828 |
||
5462.3.14
by Martin Pool
Unify varations with scenario protocol |
829 |
A single *scenario* is defined by a `(name, parameter_dict)` tuple. The |
830 |
short string name is combined with the name of the test method to form the |
|
831 |
test instance name. The parameter dict is merged into the instance's |
|
832 |
attributes. |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
833 |
|
5462.3.17
by Martin Pool
Updated test scenario docs |
834 |
For example:: |
835 |
||
5462.3.21
by Martin Pool
Rename to load_tests_apply_scenarios |
836 |
load_tests = load_tests_apply_scenarios |
5462.3.17
by Martin Pool
Updated test scenario docs |
837 |
|
838 |
class TestCheckout(TestCase): |
|
839 |
||
840 |
variations = multiply_scenarios( |
|
841 |
VaryByRepositoryFormat(), |
|
842 |
VaryByTreeFormat(), |
|
843 |
) |
|
5462.3.14
by Martin Pool
Unify varations with scenario protocol |
844 |
|
845 |
The `load_tests` declaration or definition should be near the top of the |
|
846 |
file so its effect can be seen. |
|
847 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
848 |
|
849 |
Test support |
|
850 |
------------ |
|
851 |
||
852 |
We have a rich collection of tools to support writing tests. Please use |
|
853 |
them in preference to ad-hoc solutions as they provide portability and |
|
854 |
performance benefits. |
|
855 |
||
856 |
||
857 |
TestCase and its subclasses |
|
858 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
859 |
||
860 |
The ``bzrlib.tests`` module defines many TestCase classes to help you |
|
861 |
write your tests. |
|
862 |
||
863 |
TestCase |
|
864 |
A base TestCase that extends the Python standard library's |
|
5200.3.3
by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now |
865 |
TestCase in several ways. TestCase is build on |
866 |
``testtools.TestCase``, which gives it support for more assertion |
|
867 |
methods (e.g. ``assertContainsRe``), ``addCleanup``, and other |
|
868 |
features (see its API docs for details). It also has a ``setUp`` that |
|
869 |
makes sure that global state like registered hooks and loggers won't |
|
870 |
interfere with your test. All tests should use this base class |
|
871 |
(whether directly or via a subclass). Note that we are trying not to |
|
872 |
add more assertions at this point, and instead to build up a library |
|
873 |
of ``bzrlib.tests.matchers``. |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
874 |
|
875 |
TestCaseWithMemoryTransport |
|
876 |
Extends TestCase and adds methods like ``get_transport``, |
|
877 |
``make_branch`` and ``make_branch_builder``. The files created are |
|
878 |
stored in a MemoryTransport that is discarded at the end of the test. |
|
879 |
This class is good for tests that need to make branches or use |
|
880 |
transports, but that don't require storing things on disk. All tests |
|
881 |
that create bzrdirs should use this base class (either directly or via |
|
882 |
a subclass) as it ensures that the test won't accidentally operate on |
|
883 |
real branches in your filesystem. |
|
884 |
||
885 |
TestCaseInTempDir |
|
886 |
Extends TestCaseWithMemoryTransport. For tests that really do need |
|
887 |
files to be stored on disk, e.g. because a subprocess uses a file, or |
|
888 |
for testing functionality that accesses the filesystem directly rather |
|
889 |
than via the Transport layer (such as dirstate). |
|
890 |
||
891 |
TestCaseWithTransport |
|
892 |
Extends TestCaseInTempDir. Provides ``get_url`` and |
|
893 |
``get_readonly_url`` facilities. Subclasses can control the |
|
894 |
transports used by setting ``vfs_transport_factory``, |
|
895 |
``transport_server`` and/or ``transport_readonly_server``. |
|
896 |
||
897 |
||
898 |
See the API docs for more details. |
|
899 |
||
900 |
||
901 |
BranchBuilder |
|
902 |
~~~~~~~~~~~~~ |
|
903 |
||
904 |
When writing a test for a feature, it is often necessary to set up a |
|
905 |
branch with a certain history. The ``BranchBuilder`` interface allows the |
|
906 |
creation of test branches in a quick and easy manner. Here's a sample |
|
907 |
session:: |
|
908 |
||
909 |
builder = self.make_branch_builder('relpath') |
|
910 |
builder.build_commit() |
|
911 |
builder.build_commit() |
|
912 |
builder.build_commit() |
|
913 |
branch = builder.get_branch() |
|
914 |
||
915 |
``make_branch_builder`` is a method of ``TestCaseWithMemoryTransport``. |
|
916 |
||
917 |
Note that many current tests create test branches by inheriting from |
|
918 |
``TestCaseWithTransport`` and using the ``make_branch_and_tree`` helper to |
|
919 |
give them a ``WorkingTree`` that they can commit to. However, using the |
|
920 |
newer ``make_branch_builder`` helper is preferred, because it can build |
|
921 |
the changes in memory, rather than on disk. Tests that are explictly |
|
922 |
testing how we work with disk objects should, of course, use a real |
|
923 |
``WorkingTree``. |
|
924 |
||
925 |
Please see bzrlib.branchbuilder for more details. |
|
926 |
||
4070.5.2
by Martin Pool
Recommend setting timestamp in BranchBuilder |
927 |
If you're going to examine the commit timestamps e.g. in a test for log |
928 |
output, you should set the timestamp on the tree, rather than using fuzzy |
|
929 |
matches in the test. |
|
930 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
931 |
|
932 |
TreeBuilder |
|
933 |
~~~~~~~~~~~ |
|
934 |
||
935 |
The ``TreeBuilder`` interface allows the construction of arbitrary trees |
|
936 |
with a declarative interface. A sample session might look like:: |
|
937 |
||
938 |
tree = self.make_branch_and_tree('path') |
|
939 |
builder = TreeBuilder() |
|
940 |
builder.start_tree(tree) |
|
941 |
builder.build(['foo', "bar/", "bar/file"]) |
|
942 |
tree.commit('commit the tree') |
|
943 |
builder.finish_tree() |
|
944 |
||
945 |
Usually a test will create a tree using ``make_branch_and_memory_tree`` (a |
|
946 |
method of ``TestCaseWithMemoryTransport``) or ``make_branch_and_tree`` (a |
|
947 |
method of ``TestCaseWithTransport``). |
|
948 |
||
949 |
Please see bzrlib.treebuilder for more details. |
|
950 |
||
5193.5.8
by Vincent Ladeuil
Revert previous change as I can't reproduce the related problem anymore. |
951 |
|
4986.2.7
by Martin Pool
Recommend overrideAttr in the test writing guide |
952 |
Temporarily changing state |
953 |
~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
954 |
||
955 |
If your test needs to temporarily mutate some global state, and you need |
|
956 |
it restored at the end, you can say for example:: |
|
957 |
||
958 |
self.overrideAttr(osutils, '_cached_user_encoding', 'latin-1') |
|
959 |
||
960 |
Cleaning up |
|
4986.2.2
by Martin Pool
Doc about using addCleanup not tearDown |
961 |
~~~~~~~~~~~ |
962 |
||
963 |
Our base ``TestCase`` class provides an ``addCleanup`` method, which |
|
964 |
should be used instead of ``tearDown``. All the cleanups are run when the |
|
965 |
test finishes, regardless of whether it passes or fails. If one cleanup |
|
966 |
fails, later cleanups are still run. |
|
967 |
||
968 |
(The same facility is available outside of tests through |
|
969 |
``bzrlib.cleanup``.) |
|
970 |
||
5335.3.5
by Martin Pool
merge trunk |
971 |
|
5335.3.3
by Martin Pool
Developer documentation about tc qdisc |
972 |
Manual testing |
973 |
============== |
|
974 |
||
975 |
Generally we prefer automated testing but sometimes a manual test is the |
|
976 |
right thing, especially for performance tests that want to measure elapsed |
|
977 |
time rather than effort. |
|
978 |
||
979 |
Simulating slow networks |
|
980 |
------------------------ |
|
981 |
||
982 |
To get realistically slow network performance for manually measuring |
|
983 |
performance, we can simulate 500ms latency (thus 1000ms round trips):: |
|
984 |
||
985 |
$ sudo tc qdisc add dev lo root netem delay 500ms |
|
986 |
||
987 |
Normal system behaviour is restored with :: |
|
988 |
||
989 |
$ sudo tc qdisc del dev lo root |
|
990 |
||
991 |
A more precise version that only filters traffic to port 4155 is:: |
|
992 |
||
993 |
tc qdisc add dev lo root handle 1: prio |
|
994 |
tc qdisc add dev lo parent 1:3 handle 30: netem delay 500ms |
|
995 |
tc qdisc add dev lo parent 30:1 handle 40: prio |
|
996 |
tc filter add dev lo protocol ip parent 1:0 prio 3 u32 match ip dport 4155 0xffff flowid 1:3 handle 800::800 |
|
997 |
tc filter add dev lo protocol ip parent 1:0 prio 3 u32 match ip sport 4155 0xffff flowid 1:3 handle 800::801 |
|
998 |
||
999 |
and to remove this:: |
|
1000 |
||
1001 |
tc filter del dev lo protocol ip parent 1: pref 3 u32 |
|
1002 |
tc qdisc del dev lo root handle 1: |
|
1003 |
||
5335.3.4
by Martin Pool
Review tweaks to testing documentation |
1004 |
You can use similar code to add additional delay to a real network |
1005 |
interface, perhaps only when talking to a particular server or pointing at |
|
1006 |
a VM. For more information see <http://lartc.org/>. |
|
1007 |
||
5335.3.3
by Martin Pool
Developer documentation about tc qdisc |
1008 |
|
5193.5.8
by Vincent Ladeuil
Revert previous change as I can't reproduce the related problem anymore. |
1009 |
.. |--| unicode:: U+2014 |
1010 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
1011 |
.. |
5283.1.1
by Martin Pool
Add helper function script.run_script and suggest using it |
1012 |
vim: ft=rst tw=74 ai et sw=4 |