/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to doc/developers/testing.txt

  • Committer: Jelmer Vernooij
  • Date: 2020-04-05 19:11:34 UTC
  • mto: (7490.7.16 work)
  • mto: This revision was merged to the branch mainline in revision 7501.
  • Revision ID: jelmer@jelmer.uk-20200405191134-0aebh8ikiwygxma5
Populate the .gitignore file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
====================
2
 
Bazaar Testing Guide
 
2
Breezy Testing Guide
3
3
====================
4
4
 
5
5
 
6
6
The Importance of Testing
7
7
=========================
8
8
 
9
 
Reliability is a critical success factor for any Version Control System.
10
 
We want Bazaar to be highly reliable across multiple platforms while
 
9
Reliability is a critical success factor for any version control system.
 
10
We want Breezy to be highly reliable across multiple platforms while
11
11
evolving over time to meet the needs of its community.
12
12
 
13
13
In a nutshell, this is what we expect and encourage:
24
24
  starting on the code itself.  Check the test fails on the old code, then
25
25
  add the feature or fix and check it passes.
26
26
 
27
 
By doing these things, the Bazaar team gets increased confidence that
 
27
By doing these things, the Breezy team gets increased confidence that
28
28
changes do what they claim to do, whether provided by the core team or
29
29
by community members. Equally importantly, we can be surer that changes
30
30
down the track do not break new features or bug fixes that you are
31
31
contributing today.
32
32
 
33
 
As of September 2009, Bazaar ships with a test suite containing over
 
33
As of September 2009, Breezy ships with a test suite containing over
34
34
23,000 tests and growing. We are proud of it and want to remain so. As
35
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?
 
36
on your project to a product *without* a test suite like Breezy has?
37
37
 
38
38
 
39
39
Running the Test Suite
40
40
======================
41
41
 
42
 
As of Bazaar 2.1, you must have the testtools_ library installed to run
43
 
the bzr test suite.
 
42
As of Breezy 2.1, you must have the testtools_ library installed to run
 
43
the brz test suite.
44
44
 
45
45
.. _testtools: https://launchpad.net/testtools/
46
46
 
47
 
To test all of Bazaar, just run::
48
 
 
49
 
  bzr selftest 
50
 
 
51
 
With ``--verbose`` bzr will print the name of every test as it is run.
 
47
To test all of Breezy, just run::
 
48
 
 
49
  brz selftest 
 
50
 
 
51
With ``--verbose`` brz will print the name of every test as it is run.
52
52
 
53
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.
 
54
copy of Breezy.  Please investigate and/or report any failures.
55
55
 
56
56
 
57
57
Running particular tests
58
58
------------------------
59
59
 
60
 
Currently, bzr selftest is used to invoke tests.
 
60
Currently, brz selftest is used to invoke tests.
61
61
You can provide a pattern argument to run a subset. For example,
62
62
to run just the blackbox tests, run::
63
63
 
64
 
  ./bzr selftest -v blackbox
 
64
  ./brz selftest -v blackbox
65
65
 
66
66
To skip a particular test (or set of tests), use the --exclude option
67
67
(shorthand -x) like so::
68
68
 
69
 
  ./bzr selftest -v -x blackbox
 
69
  ./brz selftest -v -x blackbox
70
70
 
71
71
To ensure that all tests are being run and succeeding, you can use the
72
72
--strict option which will fail if there are any missing features or known
73
73
failures, like so::
74
74
 
75
 
  ./bzr selftest --strict
 
75
  ./brz selftest --strict
76
76
 
77
77
To list tests without running them, use the --list-only option like so::
78
78
 
79
 
  ./bzr selftest --list-only
 
79
  ./brz selftest --list-only
80
80
 
81
81
This option can be combined with other selftest options (like -x) and
82
82
filter patterns to understand their effect.
87
87
modifications, you still need to run the full test suite for that, but using it
88
88
can help in some cases (like running only the failed tests for some time)::
89
89
 
90
 
  ./bzr selftest -- load-list my_failing_tests
 
90
  ./brz selftest -- load-list my_failing_tests
91
91
 
92
92
This option can also be combined with other selftest options, including
93
93
patterns. It has some drawbacks though, the list can become out of date pretty
98
98
specified string. It will also avoid loading the other tests and as a
99
99
consequence starts running your tests quicker::
100
100
 
101
 
  ./bzr selftest --starting-with bzrlib.blackbox
 
101
  ./brz selftest --starting-with breezy.blackbox
102
102
 
103
103
This option can be combined with all the other selftest options including
104
104
--load-list. The later is rarely used but allows to run a subset of a list of
107
107
Disabling plugins
108
108
-----------------
109
109
 
110
 
To test only the bzr core, ignoring any plugins you may have installed,
 
110
To test only the brz core, ignoring any plugins you may have installed,
111
111
use::
112
112
 
113
 
  ./bzr --no-plugins selftest 
 
113
  ./brz --no-plugins selftest 
114
114
 
115
115
Disabling crash reporting
116
116
-------------------------
117
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
 
118
By default Breezy uses apport_ to report program crashes.  In developing
 
119
Breezy it's normal and expected to have it crash from time to time, at
120
120
least because a test failed if for no other reason.
121
121
 
122
122
Therefore you should probably add ``debug_flags = no_apport`` to your
123
 
``bazaar.conf`` file (in ``~/.bazaar/`` on Unix), so that failures just
 
123
``breezy.conf`` file (in ``~/.config/breezy/`` on Unix), so that failures just
124
124
print a traceback rather than writing a crash file.
125
125
 
126
126
.. _apport: https://launchpad.net/apport/
129
129
Test suite debug flags
130
130
----------------------
131
131
 
132
 
Similar to the global ``-Dfoo`` debug options, bzr selftest accepts
 
132
Similar to the global ``-Dfoo`` debug options, brz selftest accepts
133
133
``-E=foo`` debug flags.  These flags are:
134
134
 
135
135
:allow_debug: do *not* clear the global debug flags when running a test.
136
136
  This can provide useful logging to help debug test failures when used
137
 
  with e.g. ``bzr -Dhpss selftest -E=allow_debug``
 
137
  with e.g. ``brz -Dhpss selftest -E=allow_debug``
138
138
 
139
139
  Note that this will probably cause some tests to fail, because they
140
140
  don't expect to run with any debug flags on.
143
143
Using subunit
144
144
-------------
145
145
 
146
 
Bazaar can optionally produce output in the machine-readable subunit_
 
146
Breezy can optionally produce output in the machine-readable subunit_
147
147
format, so that test output can be post-processed by various tools. To
148
148
generate a subunit test stream::
149
149
 
150
 
 $ ./bzr selftest --subunit
 
150
 $ ./brz selftest --subunit
151
151
 
152
152
Processing such a stream can be done using a variety of tools including:
153
153
 
165
165
Using testrepository
166
166
--------------------
167
167
 
168
 
Bazaar ships with a config file for testrepository_. This can be very
 
168
Breezy ships with a config file for testrepository_. This can be very
169
169
useful for keeping track of failing tests and doing general workflow
170
170
support. To run tests using testrepository::
171
171
 
183
183
 
184
184
.. _testrepository: https://launchpad.net/testrepository
185
185
 
 
186
 
 
187
Running tests in parallel
 
188
-------------------------
 
189
 
 
190
Breezy can use subunit to spawn multiple test processes.  There is
 
191
slightly more chance you will hit ordering or timing-dependent bugs but
 
192
it's much faster::
 
193
 
 
194
  $ ./brz selftest --parallel=fork
 
195
 
 
196
Note that you will need the Subunit library
 
197
<https://launchpad.net/subunit/> to use this, which is in
 
198
``python-subunit`` on Ubuntu.
 
199
 
 
200
 
 
201
Running tests from a ramdisk
 
202
----------------------------
 
203
 
 
204
The tests create and delete a lot of temporary files.  In some cases you
 
205
can make the test suite run much faster by running it on a ramdisk.  For
 
206
example::
 
207
 
 
208
  $ sudo mkdir /ram
 
209
  $ sudo mount -t tmpfs none /ram
 
210
  $ TMPDIR=/ram ./brz selftest ...
 
211
 
 
212
You could also change ``/tmp`` in ``/etc/fstab`` to have type ``tmpfs``,
 
213
if you don't mind possibly losing other files in there when the machine
 
214
restarts.  Add this line (if there is none for ``/tmp`` already)::
 
215
 
 
216
  none           /tmp            tmpfs  defaults        0       0
 
217
 
 
218
With a 6-core machine and ``--parallel=fork`` using a tmpfs doubles the
 
219
test execution speed.
 
220
 
 
221
 
186
222
Writing Tests
187
223
=============
188
224
 
189
225
Normally you should add or update a test for all bug fixes or new features
190
 
in Bazaar.
 
226
in Breezy.
191
227
 
192
228
 
193
229
Where should I put a new test?
194
230
------------------------------
195
231
 
196
 
Bzrlib's tests are organised by the type of test.  Most of the tests in
197
 
bzr's test suite belong to one of these categories:
 
232
breezy's tests are organised by the type of test.  Most of the tests in
 
233
brz's test suite belong to one of these categories:
198
234
 
199
235
 - Unit tests
200
236
 - Blackbox (UI) tests
201
237
 - Per-implementation tests
202
238
 - Doctests
203
239
 
204
 
A quick description of these test types and where they belong in bzrlib's
 
240
A quick description of these test types and where they belong in breezy's
205
241
source follows.  Not all tests fall neatly into one of these categories;
206
242
in those cases use your judgement.
207
243
 
214
250
as possible.  Each unit test is generally fairly short and runs very
215
251
quickly.
216
252
 
217
 
They are found in ``bzrlib/tests/test_*.py``.  So in general tests should
 
253
They are found in ``breezy/tests/test_*.py``.  So in general tests should
218
254
be placed in a file named test_FOO.py where FOO is the logical thing under
219
255
test.
220
256
 
221
 
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
222
 
See bzrlib/tests/test_sampler.py for a template test script.
 
257
For example, tests for merge3 in breezy belong in breezy/tests/test_merge3.py.
 
258
See breezy/tests/test_sampler.py for a template test script.
223
259
 
224
260
 
225
261
Blackbox (UI) tests
230
266
option, then you should be writing a UI test.  If you are both adding UI
231
267
functionality and library functionality, you will want to write tests for
232
268
both the UI and the core behaviours.  We call UI tests 'blackbox' tests
233
 
and they belong in ``bzrlib/tests/blackbox/*.py``.
 
269
and they belong in ``breezy/tests/blackbox/*.py``.
234
270
 
235
271
When writing blackbox tests please honour the following conventions:
236
272
 
237
273
 1. Place the tests for the command 'name' in
238
 
    bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
 
274
    breezy/tests/blackbox/test_name.py. This makes it easy for developers
239
275
    to locate the test script for a faulty command.
240
276
 
241
 
 2. Use the 'self.run_bzr("name")' utility function to invoke the command
242
 
    rather than running bzr in a subprocess or invoking the
 
277
 2. Use the 'self.run_brz("name")' utility function to invoke the command
 
278
    rather than running brz in a subprocess or invoking the
243
279
    cmd_object.run() method directly. This is a lot faster than
244
280
    subprocesses and generates the same logging output as running it in a
245
281
    subprocess (which invoking the method directly does not).
246
282
 
247
 
 3. Only test the one command in a single test script. Use the bzrlib
 
283
 3. Only test the one command in a single test script. Use the breezy
248
284
    library when setting up tests and when evaluating the side-effects of
249
285
    the command. We do this so that the library api has continual pressure
250
286
    on it to be as functional as the command line in a simple manner, and
252
288
    command changes its name or signature. Ideally only the tests for a
253
289
    given command are affected when a given command is changed.
254
290
 
255
 
 4. If you have a test which does actually require running bzr in a
256
 
    subprocess you can use ``run_bzr_subprocess``. By default the spawned
 
291
 4. If you have a test which does actually require running brz in a
 
292
    subprocess you can use ``run_brz_subprocess``. By default the spawned
257
293
    process will not load plugins unless ``--allow-plugins`` is supplied.
258
294
 
259
295
 
264
300
against multiple implementations of an interface.  For example,
265
301
``per_transport.py`` defines tests that all Transport implementations
266
302
(local filesystem, HTTP, and so on) must pass. They are found in
267
 
``bzrlib/tests/per_*/*.py``, and ``bzrlib/tests/per_*.py``.
 
303
``breezy/tests/per_*/*.py``, and ``breezy/tests/per_*.py``.
268
304
 
269
305
These are really a sub-category of unit tests, but an important one.
270
306
 
271
307
Along the same lines are tests for extension modules. We generally have
272
308
both a pure-python and a compiled implementation for each module. As such,
273
309
we want to run the same tests against both implementations. These can
274
 
generally be found in ``bzrlib/tests/*__*.py`` since extension modules are
 
310
generally be found in ``breezy/tests/*__*.py`` since extension modules are
275
311
usually prefixed with an underscore. Since there are only two
276
312
implementations, we have a helper function
277
 
``bzrlib.tests.permute_for_extension``, which can simplify the
 
313
``breezy.tests.permute_for_extension``, which can simplify the
278
314
``load_tests`` implementation.
279
315
 
280
316
 
284
320
We make selective use of doctests__.  In general they should provide
285
321
*examples* within the API documentation which can incidentally be tested.  We
286
322
don't try to test every important case using doctests |--| regular Python
287
 
tests are generally a better solution.  That is, we just use doctests to
288
 
make our documentation testable, rather than as a way to make tests.
 
323
tests are generally a better solution.  That is, we just use doctests to make
 
324
our documentation testable, rather than as a way to make tests. Be aware that
 
325
doctests are not as well isolated as the unit tests, if you need more
 
326
isolation, you're likely want to write unit tests anyway if only to get a
 
327
better control of the test environment.
289
328
 
290
 
Most of these are in ``bzrlib/doc/api``.  More additions are welcome.
 
329
Most of these are in ``breezy/doc/api``.  More additions are welcome.
291
330
 
292
331
  __ http://docs.python.org/lib/module-doctest.html
293
332
 
 
333
There is an `assertDoctestExampleMatches` method in
 
334
`breezy.tests.TestCase` that allows you to match against doctest-style
 
335
string templates (including ``...`` to skip sections) from regular Python
 
336
tests.
 
337
 
294
338
 
295
339
Shell-like tests
296
340
----------------
297
341
 
298
 
``bzrlib/tests/script.py`` allows users to write tests in a syntax very close to a shell session,
299
 
using a restricted and limited set of commands that should be enough to mimic
300
 
most of the behaviours.
 
342
``breezy/tests/script.py`` allows users to write tests in a syntax very
 
343
close to a shell session, using a restricted and limited set of commands
 
344
that should be enough to mimic most of the behaviours.
301
345
 
302
346
A script is a set of commands, each command is composed of:
303
347
 
322
366
The execution stops as soon as an expected output or an expected error is not
323
367
matched.
324
368
 
325
 
When no output is specified, any ouput from the command is accepted
326
 
and execution continue.
 
369
If output occurs and no output is expected, the execution stops and the
 
370
test fails.  If unexpected output occurs on the standard error, then
 
371
execution stops and the test fails.
327
372
 
328
373
If an error occurs and no expected error is specified, the execution stops.
329
374
 
335
380
 
336
381
Examples:
337
382
 
338
 
The following will succeeds only if 'bzr add' outputs 'adding file'::
 
383
The following will succeeds only if 'brz add' outputs 'adding file'::
339
384
 
340
 
  $ bzr add file
 
385
  $ brz add file
341
386
  >adding file
342
387
 
343
388
If you want the command to succeed for any output, just use::
344
389
 
345
 
  $ bzr add file
 
390
  $ brz add file
 
391
  ...
 
392
  2>...
 
393
 
 
394
or use the ``--quiet`` option::
 
395
 
 
396
  $ brz add -q file
346
397
 
347
398
The following will stop with an error::
348
399
 
349
 
  $ bzr not-a-command
 
400
  $ brz not-a-command
350
401
 
351
402
If you want it to succeed, use::
352
403
 
353
 
  $ bzr not-a-command
354
 
  2> bzr: ERROR: unknown command "not-a-command"
 
404
  $ brz not-a-command
 
405
  2> brz: ERROR: unknown command "not-a-command"
355
406
 
356
407
You can use ellipsis (...) to replace any piece of text you don't want to be
357
408
matched exactly::
358
409
 
359
 
  $ bzr branch not-a-branch
360
 
  2>bzr: ERROR: Not a branch...not-a-branch/".
 
410
  $ brz branch not-a-branch
 
411
  2>brz: ERROR: Not a branch...not-a-branch/".
361
412
 
362
413
This can be used to ignore entire lines too::
363
414
 
382
433
 
383
434
  $ cat file
384
435
 
 
436
You can run files containing shell-like scripts with::
 
437
 
 
438
  $ brz test-script <script>
 
439
 
 
440
where ``<script>`` is the path to the file containing the shell-like script.
 
441
 
385
442
The actual use of ScriptRunner within a TestCase looks something like
386
443
this::
387
444
 
388
 
        def test_unshelve_keep(self):
389
 
                # some setup here
390
 
                sr = ScriptRunner()
391
 
                sr.run_script(self, '''
392
 
        $ bzr add file
393
 
        $ bzr shelve --all -m Foo
394
 
        $ bzr shelve --list
395
 
        1: Foo
396
 
        $ bzr unshelve --keep
397
 
        $ bzr shelve --list
398
 
        1: Foo
399
 
        $ cat file
400
 
        contents of file
401
 
        ''')
402
 
 
 
445
    from breezy.tests import script
 
446
 
 
447
    def test_unshelve_keep(self):
 
448
        # some setup here
 
449
        script.run_script(self, '''
 
450
            $ brz add -q file
 
451
            $ brz shelve -q --all -m Foo
 
452
            $ brz shelve --list
 
453
            1: Foo
 
454
            $ brz unshelve -q --keep
 
455
            $ brz shelve --list
 
456
            1: Foo
 
457
            $ cat file
 
458
            contents of file
 
459
            ''')
 
460
 
 
461
You can also test commands that read user interaction::
 
462
 
 
463
    def test_confirm_action(self):
 
464
        """You can write tests that demonstrate user confirmation"""
 
465
        commands.builtin_command_registry.register(cmd_test_confirm)
 
466
        self.addCleanup(commands.builtin_command_registry.remove, 'test-confirm')
 
467
        self.run_script("""
 
468
            $ brz test-confirm
 
469
            2>Really do it? [y/n]: 
 
470
            <yes
 
471
            yes
 
472
            """)
 
473
 
 
474
To avoid having to specify "-q" for all commands whose output is
 
475
irrelevant, the run_script() method may be passed the keyword argument
 
476
``null_output_matches_anything=True``.  For example::
 
477
 
 
478
    def test_ignoring_null_output(self):
 
479
        self.run_script("""
 
480
            $ brz init
 
481
            $ brz ci -m 'first revision' --unchanged
 
482
            $ brz log --line
 
483
            1: ...
 
484
            """, null_output_matches_anything=True)
 
485
           
403
486
 
404
487
Import tariff tests
405
488
-------------------
406
489
 
407
 
`bzrlib.tests.test_import_tariff` has some tests that measure how many
 
490
`breezy.tests.test_import_tariff` has some tests that measure how many
408
491
Python modules are loaded to run some representative commands.
409
492
 
410
493
We want to avoid loading code unnecessarily, for reasons including:
418
501
 
419
502
* Some optional modules such as `testtools` are meant to be soft
420
503
  dependencies and only needed for particular cases.  If they're loaded in
421
 
  other cases then bzr may break for people who don't have those modules.
 
504
  other cases then brz may break for people who don't have those modules.
422
505
  
423
 
`test_import_tarrif` allows us to check that removal of imports doesn't
 
506
`test_import_tariff` allows us to check that removal of imports doesn't
424
507
regress.
425
508
 
426
509
This is done by running the command in a subprocess with
427
 
``--profile-imports``.  Starting a whole Python interpreter is pretty
428
 
slow, so we don't want exhaustive testing here, but just enough to guard
429
 
against distinct fixed problems.
 
510
``PYTHON_VERBOSE=1``.  Starting a whole Python interpreter is pretty slow,
 
511
so we don't want exhaustive testing here, but just enough to guard against
 
512
distinct fixed problems.
430
513
 
431
514
Assertions about precisely what is loaded tend to be brittle so we instead
432
515
make assertions that particular things aren't loaded.
433
516
 
434
517
Unless selftest is run with ``--no-plugins``, modules will be loaded in
435
518
the usual way and checks made on what they cause to be loaded.  This is
436
 
probably worth checking into, because many bzr users have at least some
 
519
probably worth checking into, because many brz users have at least some
437
520
plugins installed (and they're included in binary installers).
438
521
 
439
522
In theory, plugins might have a good reason to load almost anything:
440
523
someone might write a plugin that opens a network connection or pops up a
441
 
gui window every time you run 'bzr status'.  However, it's more likely
 
524
gui window every time you run 'brz status'.  However, it's more likely
442
525
that the code to do these things is just being loaded accidentally.  We
443
526
might eventually need to have a way to make exceptions for particular
444
527
plugins.
447
530
 
448
531
* non-GUI commands shouldn't load GUI libraries
449
532
 
450
 
* operations on bzr native formats sholudn't load foreign branch libraries
 
533
* operations on brz native formats sholudn't load foreign branch libraries
451
534
 
452
535
* network code shouldn't be loaded for purely local operations
453
536
 
462
545
a hook that is called when a write lock is: acquired, released or broken.
463
546
(Read locks also exist, they cannot be discovered in this way.)
464
547
 
465
 
A hook can be installed by calling bzrlib.lock.Lock.hooks.install_named_hook.
 
548
A hook can be installed by calling breezy.lock.Lock.hooks.install_named_hook.
466
549
The three valid hooks are: `lock_acquired`, `lock_released` and `lock_broken`.
467
550
 
468
551
Example::
480
563
 
481
564
The last part of the `lock_url` allows you to identify the type of object that is locked.
482
565
 
483
 
- BzrDir: `/branch-lock`
 
566
- brzDir: `/branch-lock`
484
567
- Working tree: `/checkout/lock`
485
568
- Branch: `/branch/lock`
486
569
- Repository: `/repository/lock`
489
572
 
490
573
    self.assertEndsWith(locks_acquired[0].lock_url, "/checkout/lock")
491
574
 
492
 
See bzrlib/tests/commands/test_revert.py for an example of how to use this for
 
575
See breezy/tests/commands/test_revert.py for an example of how to use this for
493
576
testing locks.
494
577
 
495
578
 
505
588
that relating to that.  ::
506
589
 
507
590
    try:
508
 
        return self.branch_format.initialize(repo.bzrdir)
 
591
        return self.branch_format.initialize(repo.brzdir)
509
592
    except errors.UninitializableFormat:
510
593
        raise tests.TestSkipped('Uninitializable branch format')
511
594
 
516
599
Several different cases are distinguished:
517
600
 
518
601
TestSkipped
519
 
        Generic skip; the only type that was present up to bzr 0.18.
 
602
        Generic skip; the only type that was present up to brz 0.18.
520
603
 
521
604
TestNotApplicable
522
605
        The test doesn't apply to the parameters with which it was run.
559
642
like merges to the mainline and releases where we want to make sure that
560
643
everything that can be tested has been tested.  Lax mode is for use by
561
644
developers who want to temporarily tolerate some known failures.  The
562
 
default behaviour is obtained by ``bzr selftest`` with no options, and
 
645
default behaviour is obtained by ``brz selftest`` with no options, and
563
646
also (if possible) by running under another unittest harness.
564
647
 
565
648
======================= ======= ======= ========
603
686
actually instances not classses they're now given instance-style names
604
687
like ``apport``.
605
688
 
606
 
Features already defined in ``bzrlib.tests`` and ``bzrlib.tests.features``
 
689
Features already defined in ``breezy.tests`` and ``breezy.tests.features``
607
690
include:
608
691
 
609
692
 - apport
624
707
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
625
708
 
626
709
New features for use with ``_test_needs_features`` or ``requireFeature``
627
 
are defined by subclassing ``bzrlib.tests.Feature`` and overriding the
 
710
are defined by subclassing ``breezy.tests.Feature`` and overriding the
628
711
``_probe`` and ``feature_name`` methods.  For example::
629
712
 
630
713
    class _SymlinkFeature(Feature):
640
723
A helper for handling running tests based on whether a python
641
724
module is available. This can handle 3rd-party dependencies (is
642
725
``paramiko`` available?) as well as stdlib (``termios``) or
643
 
extension modules (``bzrlib._groupcompress_pyx``). You create a
 
726
extension modules (``breezy._groupcompress_pyx``). You create a
644
727
new feature instance with::
645
728
 
646
 
    # in bzrlib/tests/features.py
 
729
    # in breezy/tests/features.py
647
730
    apport = tests.ModuleAvailableFeature('apport')
648
731
 
649
732
 
650
 
    # then in bzrlib/tests/test_apport.py
 
733
    # then in breezy/tests/test_apport.py
651
734
    class TestApportReporting(TestCaseInTempDir):
652
735
 
653
736
        _test_needs_features = [features.apport]
654
737
 
655
738
 
 
739
Testing translations
 
740
-----------------------
 
741
 
 
742
Translations are disabled by default in tests.  If you want to test
 
743
that code is translated you can use the ``ZzzTranslations`` class from
 
744
``test_i18n``::
 
745
 
 
746
    self.overrideAttr(i18n, '_translations', ZzzTranslations())
 
747
 
 
748
And check the output strings look like ``u"zz\xe5{{output}}"``.
 
749
 
 
750
To test the gettext setup and usage you override i18n.installed back
 
751
to self.i18nInstalled and _translations to None, see
 
752
test_i18n.TestInstall.
 
753
 
 
754
 
 
755
Testing deprecated code
 
756
-----------------------
 
757
 
 
758
When code is deprecated, it is still supported for some length of time,
 
759
usually until the next major version. The ``applyDeprecated`` helper
 
760
wraps calls to deprecated code to verify that it is correctly issuing the
 
761
deprecation warning, and also prevents the warnings from being printed
 
762
during test runs.
 
763
 
 
764
Typically patches that apply the ``@deprecated_function`` decorator should
 
765
update the accompanying tests to use the ``applyDeprecated`` wrapper.
 
766
 
 
767
``applyDeprecated`` is defined in ``breezy.tests.TestCase``. See the API
 
768
docs for more details.
 
769
 
 
770
 
656
771
Testing exceptions and errors
657
772
-----------------------------
658
773
 
673
788
 
674
789
2. Tests that when an api is called in a particular situation, it raises
675
790
   an error of the expected class.  You should typically use
676
 
   ``assertRaises``, which in the Bazaar test suite returns the exception
 
791
   ``assertRaises``, which in the Breezy test suite returns the exception
677
792
   object to allow you to examine its parameters.
678
793
 
679
794
In some cases blackbox tests will also want to check error reporting.  But
705
820
Interface implementation testing and test scenarios
706
821
---------------------------------------------------
707
822
 
708
 
There are several cases in Bazaar of multiple implementations of a common
 
823
There are several cases in Breezy of multiple implementations of a common
709
824
conceptual interface.  ("Conceptual" because it's not necessary for all
710
825
the implementations to share a base class, though they often do.)
711
826
Examples include transports and the working tree, branch and repository
715
830
fulfils the interface requirements.  For example, every Transport should
716
831
support the ``has()`` and ``get()`` and ``clone()`` methods.  We have a
717
832
sub-suite of tests in ``test_transport_implementations``.  (Most
718
 
per-implementation tests are in submodules of ``bzrlib.tests``, but not
 
833
per-implementation tests are in submodules of ``breezy.tests``, but not
719
834
the transport tests at the moment.)
720
835
 
721
836
These tests are repeated for each registered Transport, by generating a
731
846
whether a test should be added for that particular implementation,
732
847
or for all implementations of the interface.
733
848
 
734
 
The multiplication of tests for different implementations is normally
735
 
accomplished by overriding the ``load_tests`` function used to load tests
736
 
from a module.  This function typically loads all the tests, then applies
737
 
a TestProviderAdapter to them, which generates a longer suite containing
738
 
all the test variations.
739
 
 
740
849
See also `Per-implementation tests`_ (above).
741
850
 
742
851
 
743
 
Test scenarios
744
 
--------------
 
852
Test scenarios and variations
 
853
-----------------------------
745
854
 
746
855
Some utilities are provided for generating variations of tests.  This can
747
856
be used for per-implementation tests, or other cases where the same test
752
861
values to which the test should be applied.  The test suite should then
753
862
also provide a list of scenarios in which to run the tests.
754
863
 
755
 
Typically ``multiply_tests_from_modules`` should be called from the test
756
 
module's ``load_tests`` function.
 
864
A single *scenario* is defined by a `(name, parameter_dict)` tuple.  The
 
865
short string name is combined with the name of the test method to form the
 
866
test instance name.  The parameter dict is merged into the instance's
 
867
attributes.
 
868
 
 
869
For example::
 
870
 
 
871
    load_tests = load_tests_apply_scenarios
 
872
 
 
873
    class TestCheckout(TestCase):
 
874
 
 
875
        scenarios = multiply_scenarios(
 
876
            VaryByRepositoryFormat(), 
 
877
            VaryByTreeFormat(),
 
878
            )
 
879
 
 
880
The `load_tests` declaration or definition should be near the top of the
 
881
file so its effect can be seen.
757
882
 
758
883
 
759
884
Test support
767
892
TestCase and its subclasses
768
893
~~~~~~~~~~~~~~~~~~~~~~~~~~~
769
894
 
770
 
The ``bzrlib.tests`` module defines many TestCase classes to help you
 
895
The ``breezy.tests`` module defines many TestCase classes to help you
771
896
write your tests.
772
897
 
773
898
TestCase
780
905
    interfere with your test.  All tests should use this base class
781
906
    (whether directly or via a subclass).  Note that we are trying not to
782
907
    add more assertions at this point, and instead to build up a library
783
 
    of ``bzrlib.tests.matchers``.
 
908
    of ``breezy.tests.matchers``.
784
909
 
785
910
TestCaseWithMemoryTransport
786
911
    Extends TestCase and adds methods like ``get_transport``,
788
913
    stored in a MemoryTransport that is discarded at the end of the test.
789
914
    This class is good for tests that need to make branches or use
790
915
    transports, but that don't require storing things on disk.  All tests
791
 
    that create bzrdirs should use this base class (either directly or via
 
916
    that create brzdirs should use this base class (either directly or via
792
917
    a subclass) as it ensures that the test won't accidentally operate on
793
918
    real branches in your filesystem.
794
919
 
832
957
testing how we work with disk objects should, of course, use a real
833
958
``WorkingTree``.
834
959
 
835
 
Please see bzrlib.branchbuilder for more details.
 
960
Please see breezy.branchbuilder for more details.
836
961
 
837
962
If you're going to examine the commit timestamps e.g. in a test for log
838
963
output, you should set the timestamp on the tree, rather than using fuzzy
856
981
method of ``TestCaseWithMemoryTransport``) or ``make_branch_and_tree`` (a
857
982
method of ``TestCaseWithTransport``).
858
983
 
859
 
Please see bzrlib.treebuilder for more details.
 
984
Please see breezy.treebuilder for more details.
 
985
 
 
986
PreviewTree
 
987
~~~~~~~~~~~
 
988
 
 
989
PreviewTrees are based on TreeTransforms.  This means they can represent
 
990
virtually any state that a WorkingTree can have, including unversioned files.
 
991
They can be used to test the output of anything that produces TreeTransforms,
 
992
such as merge algorithms and revert.  They can also be used to test anything
 
993
that takes arbitrary Trees as its input.
 
994
 
 
995
::
 
996
 
 
997
  # Get an empty tree to base the transform on.
 
998
  b = self.make_branch('.')
 
999
  empty_tree = b.repository.revision_tree(_mod_revision.NULL_REVISION)
 
1000
  tt = TransformPreview(empty_tree)
 
1001
  self.addCleanup(tt.finalize)
 
1002
  # Empty trees don't have a root, so add it first.
 
1003
  root = tt.new_directory('', ROOT_PARENT, 'tree-root')
 
1004
  # Set the contents of a file.
 
1005
  tt.new_file('new-file', root, 'contents', 'file-id')
 
1006
  preview = tt.get_preview_tree()
 
1007
  # Test the contents.
 
1008
  self.assertEqual('contents', preview.get_file_text('file-id'))
 
1009
 
 
1010
PreviewTrees can stack, with each tree falling back to the previous::
 
1011
 
 
1012
  tt2 = TransformPreview(preview)
 
1013
  self.addCleanup(tt2.finalize)
 
1014
  tt2.new_file('new-file2', tt2.root, 'contents2', 'file-id2')
 
1015
  preview2 = tt2.get_preview_tree()
 
1016
  self.assertEqual('contents', preview2.get_file_text('file-id'))
 
1017
  self.assertEqual('contents2', preview2.get_file_text('file-id2'))
 
1018
 
 
1019
 
 
1020
Temporarily changing state
 
1021
~~~~~~~~~~~~~~~~~~~~~~~~~~
 
1022
 
 
1023
If your test needs to temporarily mutate some global state, and you need
 
1024
it restored at the end, you can say for example::
 
1025
 
 
1026
    self.overrideAttr(osutils, '_cached_user_encoding', 'latin-1')
 
1027
 
 
1028
This should be used with discretion; sometimes it's better to make the
 
1029
underlying code more testable so that you don't need to rely on monkey
 
1030
patching.
 
1031
 
 
1032
 
 
1033
Observing calls to a function
 
1034
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
1035
 
 
1036
Sometimes it's useful to observe how a function is called, typically when
 
1037
calling it has side effects but the side effects are not easy to observe
 
1038
from a test case.  For instance the function may be expensive and we want
 
1039
to assert it is not called too many times, or it has effects on the
 
1040
machine that are safe to run during a test but not easy to measure.  In
 
1041
these cases, you can use `recordCalls` which will monkey-patch in a
 
1042
wrapper that records when the function is called.
 
1043
 
 
1044
 
 
1045
Temporarily changing environment variables
 
1046
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
1047
 
 
1048
If yout test needs to temporarily change some environment variable value
 
1049
(which generally means you want it restored at the end), you can use::
 
1050
 
 
1051
    self.overrideEnv('brz_ENV_VAR', 'new_value')
 
1052
 
 
1053
If you want to remove a variable from the environment, you should use the
 
1054
special ``None`` value::
 
1055
 
 
1056
    self.overrideEnv('PATH', None)
 
1057
 
 
1058
If you add a new feature which depends on a new environment variable, make
 
1059
sure it behaves properly when this variable is not defined (if applicable) and
 
1060
if you need to enforce a specific default value, check the
 
1061
``TestCase._cleanEnvironment`` in ``breezy.tests.__init__.py`` which defines a
 
1062
proper set of values for all tests.
 
1063
 
 
1064
Cleaning up
 
1065
~~~~~~~~~~~
 
1066
 
 
1067
Our base ``TestCase`` class provides an ``addCleanup`` method, which
 
1068
should be used instead of ``tearDown``.  All the cleanups are run when the
 
1069
test finishes, regardless of whether it passes or fails.  If one cleanup
 
1070
fails, later cleanups are still run.
 
1071
 
 
1072
(The same facility is available outside of tests through
 
1073
``breezy.cleanup``.)
 
1074
 
 
1075
 
 
1076
Manual testing
 
1077
==============
 
1078
 
 
1079
Generally we prefer automated testing but sometimes a manual test is the
 
1080
right thing, especially for performance tests that want to measure elapsed
 
1081
time rather than effort.
 
1082
 
 
1083
Simulating slow networks
 
1084
------------------------
 
1085
 
 
1086
To get realistically slow network performance for manually measuring
 
1087
performance, we can simulate 500ms latency (thus 1000ms round trips)::
 
1088
 
 
1089
  $ sudo tc qdisc add dev lo root netem delay 500ms
 
1090
 
 
1091
Normal system behaviour is restored with ::
 
1092
 
 
1093
  $ sudo tc qdisc del dev lo root
 
1094
 
 
1095
A more precise version that only filters traffic to port 4155 is::
 
1096
 
 
1097
    tc qdisc add dev lo root handle 1: prio
 
1098
    tc qdisc add dev lo parent 1:3 handle 30: netem delay 500ms 
 
1099
    tc filter add dev lo protocol ip parent 1:0 prio 3 u32 match ip dport 4155 0xffff flowid 1:3 
 
1100
    tc filter add dev lo protocol ip parent 1:0 prio 3 u32 match ip sport 4155 0xffff flowid 1:3 
 
1101
 
 
1102
and to remove this::
 
1103
 
 
1104
    tc filter del dev lo protocol ip parent 1: pref 3 u32
 
1105
    tc qdisc del dev lo root handle 1:
 
1106
 
 
1107
You can use similar code to add additional delay to a real network
 
1108
interface, perhaps only when talking to a particular server or pointing at
 
1109
a VM.  For more information see <http://lartc.org/>.
860
1110
 
861
1111
 
862
1112
.. |--| unicode:: U+2014
863
1113
 
864
1114
..
865
 
   vim: ft=rst tw=74 ai
 
1115
   vim: ft=rst tw=74 ai et sw=4