~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/developers/testing.txt

(gz) Change minimum required testtools version for selftest to 0.9.5 for
 unicode fixes (Martin [gz])

Show diffs side-by-side

added added

removed removed

Lines of Context:
329
329
We make selective use of doctests__.  In general they should provide
330
330
*examples* within the API documentation which can incidentally be tested.  We
331
331
don't try to test every important case using doctests |--| regular Python
332
 
tests are generally a better solution.  That is, we just use doctests to make
333
 
our documentation testable, rather than as a way to make tests. Be aware that
334
 
doctests are not as well isolated as the unit tests, if you need more
335
 
isolation, you're likely want to write unit tests anyway if only to get a
336
 
better control of the test environment.
 
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.
337
334
 
338
335
Most of these are in ``bzrlib/doc/api``.  More additions are welcome.
339
336
 
340
337
  __ http://docs.python.org/lib/module-doctest.html
341
338
 
342
 
There is an `assertDoctestExampleMatches` method in
343
 
`bzrlib.tests.TestCase` that allows you to match against doctest-style
344
 
string templates (including ``...`` to skip sections) from regular Python
345
 
tests.
346
 
 
347
339
 
348
340
Shell-like tests
349
341
----------------
865
857
 
866
858
    class TestCheckout(TestCase):
867
859
 
868
 
        scenarios = multiply_scenarios(
869
 
            VaryByRepositoryFormat(), 
870
 
            VaryByTreeFormat(),
871
 
            )
 
860
    variations = multiply_scenarios(
 
861
        VaryByRepositoryFormat(), 
 
862
        VaryByTreeFormat(),
 
863
        )
872
864
 
873
865
The `load_tests` declaration or definition should be near the top of the
874
866
file so its effect can be seen.
976
968
 
977
969
Please see bzrlib.treebuilder for more details.
978
970
 
979
 
PreviewTree
980
 
~~~~~~~~~~~
981
 
 
982
 
PreviewTrees are based on TreeTransforms.  This means they can represent
983
 
virtually any state that a WorkingTree can have, including unversioned files.
984
 
They can be used to test the output of anything that produces TreeTransforms,
985
 
such as merge algorithms and revert.  They can also be used to test anything
986
 
that takes arbitrary Trees as its input.
987
 
 
988
 
::
989
 
 
990
 
  # Get an empty tree to base the transform on.
991
 
  b = self.make_branch('.')
992
 
  empty_tree = b.repository.revision_tree(_mod_revision.NULL_REVISION)
993
 
  tt = TransformPreview(empty_tree)
994
 
  self.addCleanup(tt.finalize)
995
 
  # Empty trees don't have a root, so add it first.
996
 
  root = tt.new_directory('', ROOT_PARENT, 'tree-root')
997
 
  # Set the contents of a file.
998
 
  tt.new_file('new-file', root, 'contents', 'file-id')
999
 
  preview = tt.get_preview_tree()
1000
 
  # Test the contents.
1001
 
  self.assertEqual('contents', preview.get_file_text('file-id'))
1002
 
 
1003
 
PreviewTrees can stack, with each tree falling back to the previous::
1004
 
 
1005
 
  tt2 = TransformPreview(preview)
1006
 
  self.addCleanup(tt2.finalize)
1007
 
  tt2.new_file('new-file2', tt2.root, 'contents2', 'file-id2')
1008
 
  preview2 = tt2.get_preview_tree()
1009
 
  self.assertEqual('contents', preview2.get_file_text('file-id'))
1010
 
  self.assertEqual('contents2', preview2.get_file_text('file-id2'))
1011
 
 
1012
971
 
1013
972
Temporarily changing state
1014
973
~~~~~~~~~~~~~~~~~~~~~~~~~~
1018
977
 
1019
978
    self.overrideAttr(osutils, '_cached_user_encoding', 'latin-1')
1020
979
 
1021
 
Temporarily changing environment variables
1022
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1023
 
 
1024
 
If yout test needs to temporarily change some environment variable value
1025
 
(which generally means you want it restored at the end), you can use::
1026
 
 
1027
 
    self.overrideEnv('BZR_ENV_VAR', 'new_value')
1028
 
 
1029
 
If you want to remove a variable from the environment, you should use the
1030
 
special ``None`` value::
1031
 
 
1032
 
    self.overrideEnv('PATH', None)
1033
 
 
1034
 
If you add a new feature which depends on a new environment variable, make
1035
 
sure it behaves properly when this variable is not defined (if applicable) and
1036
 
if you need to enforce a specific default value, check the
1037
 
``TestCase._cleanEnvironment`` in ``bzrlib.tests.__init__.py`` which defines a
1038
 
proper set of values for all tests.
1039
 
 
1040
980
Cleaning up
1041
981
~~~~~~~~~~~
1042
982