Revision: 7654
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7654&view=rev
Author:   astraw
Date:     2009-09-06 05:05:57 +0000 (Sun, 06 Sep 2009)

Log Message:
-----------
docs: describe how to write tests

Modified Paths:
--------------
    trunk/matplotlib/doc/devel/coding_guide.rst
    trunk/matplotlib/lib/matplotlib/testing/decorators.py

Modified: trunk/matplotlib/doc/devel/coding_guide.rst
===================================================================
--- trunk/matplotlib/doc/devel/coding_guide.rst 2009-09-06 03:39:42 UTC (rev 
7653)
+++ trunk/matplotlib/doc/devel/coding_guide.rst 2009-09-06 05:05:57 UTC (rev 
7654)
@@ -561,9 +561,8 @@
 
 
 
-.. _license-discussion:
+.. _sample-data:
 
-
 Writing examples
 ================
 
@@ -602,6 +601,9 @@
     print 'datafile', datafile
 
 
+.. _license-discussion:
+
+
 Licenses
 ========
 
@@ -669,4 +671,113 @@
 extensions for scientific computing: ipython, numpy, scipy, the
 enthought tool suite and python itself are all distributed under BSD
 compatible licenses.
->
\ No newline at end of file
+
+Testing
+=======
+
+Matplotlib has a testing infrastructure based on nose_, making it easy
+to write new tests. The tests are in :mod:`matplotlib.tests`, and
+customizations to the nose testing infrastructure are in
+:mod:`matplotlib.testing`. (There is other old testing cruft around,
+please ignore it while we consolidate our testing to these locations.)
+
+.. _nose: http://somethingaboutorange.com/mrl/projects/nose/
+
+
+Writing a simple test
+---------------------
+
+Many elements of Matplotlib can be tested using standard tests. For
+example, here is a test from :mod:`matplotlib.tests.test_basic`::
+
+  from nose.tools import assert_equal
+
+  def test_simple():
+      '''very simple example test'''
+      assert_equal(1+1,2)
+
+Nose determines which functions are tests by searching for functions
+beginning with "test" in their name.
+
+Writing an image comparison test
+--------------------------------
+
+Writing an image based test is only slightly more difficult than a
+simple test. The main consideration is that you must specify the
+"baseline", or expected, images in the
+:func:`~matplotlib.testing.decorators.image_comparison` decorator. For
+example, this test generates a single image and automatically tests
+it::
+
+  import numpy as np
+  import matplotlib
+  matplotlib.use('Agg')
+  from matplotlib.testing.decorators import image_comparison
+  import matplotlib.pyplot as plt
+
+  @image_comparison(baseline_images=['spines_axes_positions.png'])
+  def test_spines_axes_positions():
+      # SF bug 2852168
+      fig = plt.figure()
+      x = np.linspace(0,2*np.pi,100)
+      y = 2*np.sin(x)
+      ax = fig.add_subplot(1,1,1)
+      ax.set_title('centered spines')
+      ax.plot(x,y)
+      ax.spines['right'].set_position(('axes',0.1))
+      ax.yaxis.set_ticks_position('right')
+      ax.spines['top'].set_position(('axes',0.25))
+      ax.xaxis.set_ticks_position('top')
+      ax.spines['left'].set_color('none')
+      ax.spines['bottom'].set_color('none')
+      fig.savefig('spines_axes_positions.png')
+
+The mechanism for comparing images is extremely simple -- it compares
+an image saved in the current directory with one from the Matplotlib
+sample_data repository. The correspondence is done by matching
+filenames, so ensure that:
+
+ * The filename given to :meth:`~matplotlib.figure.Figure.savefig` is
+   exactly the same as the filename given to
+   :func:`~matplotlib.testing.decorators.image_comparison` in the
+   ``baseline_images`` argument.
+
+ * The correct image gets added to the sample_data respository with
+   the name ``test_baseline_<IMAGE_FILENAME.png>``. (See
+   :ref:`sample-data` above for a description of how to add files to
+   the sample_data repository.)
+
+
+Known failing tests
+-------------------
+
+If you're writing a test, you may mark it as a known failing test with
+the :func:`~matplotlib.testing.decorators.knownfailureif`
+decorator. This allows the test to be added to the test suite and run
+on the buildbots without causing undue alarm. For example, although
+the following test will fail, it is an expected failure::
+
+  from nose.tools import assert_equal
+  from matplotlib.testing.decorators import knownfailureif
+
+  @knownfailureif(True)
+  def test_simple_fail():
+      '''very simple example test that should fail'''
+      assert_equal(1+1,3)
+
+Note that the first argument to the
+:func:`~matplotlib.testing.decorators.knownfailureif` decorator is a
+fail condition, which can be a value such as True, False, or
+'indeterminate', or may be a dynamically evaluated expression.
+
+Creating a new module in matplotlib.tests
+-----------------------------------------
+
+Let's say you've added a new module named
+``matplotlib.tests.test_whizbang_features``.  For the buildbot slave
+machines to know to run a test, nose must look in that module. To add
+a module to the list searched, add the line::
+
+  args.append('matplotlib.tests.test_whizbang_features')
+
+into :file:`test/run-mpl-test.py`.

Modified: trunk/matplotlib/lib/matplotlib/testing/decorators.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/testing/decorators.py       2009-09-06 
03:39:42 UTC (rev 7653)
+++ trunk/matplotlib/lib/matplotlib/testing/decorators.py       2009-09-06 
05:05:57 UTC (rev 7654)
@@ -6,6 +6,14 @@
 from matplotlib.testing.compare import compare_images
 
 def knownfailureif(fail_condition, msg=None):
+    """
+
+    Assume a will fail if *fail_condition* is True. *fail_condition*
+    may also be False or the string 'indeterminate'.
+
+    *msg* is the error message displayed for the test.
+
+    """
     # based on numpy.testing.dec.knownfailureif
     if msg is None:
         msg = 'Test known to fail'
@@ -29,6 +37,13 @@
     return known_fail_decorator
 
 def image_comparison(baseline_images=None, tol=1e-3):
+    """
+    compare images generated by the test with those specified in
+    *baseline_images*, which must correspond within tolerance *tol*,
+    else an ImageComparisonFailure exception will be raised.
+
+    """
+
     if baseline_images is None:
         raise ValueError('baseline_images must be specified')
     def compare_images_decorator(func):


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to