[Checkins] SVN: zope.testrunner/trunk/ Fix --shuffle nondeterminism when multiple test layers are present.

Marius Gedminas cvs-admin at zope.org
Fri Feb 8 09:20:54 UTC 2013


Log message for revision 129212:
  Fix --shuffle nondeterminism when multiple test layers are present.
  
  All tests now pass on all supported Python versions (except PyPy).
  
  

Changed:
  U   zope.testrunner/trunk/CHANGES.txt
  U   zope.testrunner/trunk/src/zope/testrunner/shuffle.py
  U   zope.testrunner/trunk/src/zope/testrunner/testrunner-shuffle.txt

-=-
Modified: zope.testrunner/trunk/CHANGES.txt
===================================================================
--- zope.testrunner/trunk/CHANGES.txt	2013-02-08 08:54:36 UTC (rev 129211)
+++ zope.testrunner/trunk/CHANGES.txt	2013-02-08 09:20:53 UTC (rev 129212)
@@ -6,12 +6,16 @@
 
 - Dropped use of zope.fixers (LP: #1118877).
 
-- Fixed tox test error reporting; fixed tests on Pythons 2.6, 3.1, and 3.2.
+- Fixed tox test error reporting; fixed tests on Pythons 2.6, 3.1, 3.2, and
+  3.3.
 
 - Fix --shuffle ordering on Python 3.2 to be the same as it was on older Python
   versions.
 
+- Fix --shuffle nondeterminism when multiple test layers are present.
+  Note: this will likely change the order of tests for the same --shuffle-seed.
 
+
 4.1.0 (2013-02-07)
 ==================
 

Modified: zope.testrunner/trunk/src/zope/testrunner/shuffle.py
===================================================================
--- zope.testrunner/trunk/src/zope/testrunner/shuffle.py	2013-02-08 08:54:36 UTC (rev 129211)
+++ zope.testrunner/trunk/src/zope/testrunner/shuffle.py	2013-02-08 09:20:53 UTC (rev 129212)
@@ -38,7 +38,8 @@
         if sys.version_info >= (3, 2):
             # in case somebody tries to use a string as the seed
             rng.seed(self.seed, version=1)
-        for layer, suite in list(self.runner.tests_by_layer_name.items()):
+        # Be careful to shuffle the layers in a deterministic order!
+        for layer, suite in sorted(self.runner.tests_by_layer_name.items()):
             # Test suites cannot be modified through a public API.  We thus
             # take a mutable copy of the list of tests of that suite, shuffle
             # that and replace the test suite instance with a new one of the

Modified: zope.testrunner/trunk/src/zope/testrunner/testrunner-shuffle.txt
===================================================================
--- zope.testrunner/trunk/src/zope/testrunner/testrunner-shuffle.txt	2013-02-08 08:54:36 UTC (rev 129211)
+++ zope.testrunner/trunk/src/zope/testrunner/testrunner-shuffle.txt	2013-02-08 09:20:53 UTC (rev 129212)
@@ -46,6 +46,12 @@
 seed number that was printed out and run it again using the ``--shuffle-seed``
 option. The order is guaranteed to be the same.
 
+    There was an issue with the guaranteed order in zope.testrunner before
+    4.0.2: the order could change depending on dictionary iteration order, if
+    you had multiple test layers.  This bug was fixed in 4.0.2, but a side
+    effect of the fix means that the new guaranteed order is likely to be
+    different from what you used to get with an older zope.testrunner.
+
 For example, using the seed number 0 will give us the following, stable, list of
 tests:
 
@@ -53,30 +59,30 @@
     >>> testrunner.run_internal(defaults, argv)
     Tests were shuffled using seed number 0.
     Listing zope.testrunner.layer.UnitTests tests:
-      test_y0 (sample1.sample13.sampletests.TestA)
       test_y0 (sample1.sampletestsf.TestA)
+      test_y0 (sample1.sampletests.test_one)
+      test_y0 (sample1.sampletests.test1.TestA)
       test_y0 (sample1.sampletestsf)
       test_y0 (sample1.sampletests.test_one.TestA)
-      test_y0 (sample1.sampletests.test_one)
+      test_y0 (sample1.sample13.sampletests)
+      test_y0 (sample1.sample13.sampletests.TestA)
+      test_y0 (sample1.sample11.sampletests)
+      test_y0 (sample1.sample11.sampletests.TestA)
       test_y0 (sample1.sampletests.test1)
-      test_y0 (sample1.sample11.sampletests.TestA)
-      test_y0 (sample1.sampletests.test1.TestA)
-      test_y0 (sample1.sample11.sampletests)
-      test_y0 (sample1.sample13.sampletests)
     False
     >>> testrunner.run_internal(defaults, argv)
     Tests were shuffled using seed number 0.
     Listing zope.testrunner.layer.UnitTests tests:
-      test_y0 (sample1.sample13.sampletests.TestA)
       test_y0 (sample1.sampletestsf.TestA)
+      test_y0 (sample1.sampletests.test_one)
+      test_y0 (sample1.sampletests.test1.TestA)
       test_y0 (sample1.sampletestsf)
       test_y0 (sample1.sampletests.test_one.TestA)
-      test_y0 (sample1.sampletests.test_one)
+      test_y0 (sample1.sample13.sampletests)
+      test_y0 (sample1.sample13.sampletests.TestA)
+      test_y0 (sample1.sample11.sampletests)
+      test_y0 (sample1.sample11.sampletests.TestA)
       test_y0 (sample1.sampletests.test1)
-      test_y0 (sample1.sample11.sampletests.TestA)
-      test_y0 (sample1.sampletests.test1.TestA)
-      test_y0 (sample1.sample11.sampletests)
-      test_y0 (sample1.sample13.sampletests)
     False
 
 Whereas using the seed number 42 will give us the following, different but
@@ -86,30 +92,30 @@
     >>> testrunner.run_internal(defaults, argv)
     Tests were shuffled using seed number 42.
     Listing zope.testrunner.layer.UnitTests tests:
+      test_y0 (sample1.sample13.sampletests.TestA)
       test_y0 (sample1.sample13.sampletests)
+      test_y0 (sample1.sampletests.test1)
+      test_y0 (sample1.sampletests.test1.TestA)
+      test_y0 (sample1.sample11.sampletests.TestA)
+      test_y0 (sample1.sampletestsf)
+      test_y0 (sample1.sampletests.test_one)
       test_y0 (sample1.sample11.sampletests)
-      test_y0 (sample1.sampletestsf)
-      test_y0 (sample1.sample13.sampletests.TestA)
+      test_y0 (sample1.sampletestsf.TestA)
       test_y0 (sample1.sampletests.test_one.TestA)
-      test_y0 (sample1.sample11.sampletests.TestA)
-      test_y0 (sample1.sampletestsf.TestA)
-      test_y0 (sample1.sampletests.test_one)
-      test_y0 (sample1.sampletests.test1.TestA)
-      test_y0 (sample1.sampletests.test1)
     False
     >>> testrunner.run_internal(defaults, argv)
     Tests were shuffled using seed number 42.
     Listing zope.testrunner.layer.UnitTests tests:
+      test_y0 (sample1.sample13.sampletests.TestA)
       test_y0 (sample1.sample13.sampletests)
+      test_y0 (sample1.sampletests.test1)
+      test_y0 (sample1.sampletests.test1.TestA)
+      test_y0 (sample1.sample11.sampletests.TestA)
+      test_y0 (sample1.sampletestsf)
+      test_y0 (sample1.sampletests.test_one)
       test_y0 (sample1.sample11.sampletests)
-      test_y0 (sample1.sampletestsf)
-      test_y0 (sample1.sample13.sampletests.TestA)
+      test_y0 (sample1.sampletestsf.TestA)
       test_y0 (sample1.sampletests.test_one.TestA)
-      test_y0 (sample1.sample11.sampletests.TestA)
-      test_y0 (sample1.sampletestsf.TestA)
-      test_y0 (sample1.sampletests.test_one)
-      test_y0 (sample1.sampletests.test1.TestA)
-      test_y0 (sample1.sampletests.test1)
     False
 
 Selecting a seed number without ``--shuffle``



More information about the checkins mailing list