Bug 1227367 - Report when mach python-tests collects no tests; r?gps draft
authorMaja Frydrychowicz <mjzffr@gmail.com>
Tue, 22 Mar 2016 18:53:57 -0400
changeset 346162 59aa2b3b4dc10ce38a97bc46a2ea4c6a1d341af7
parent 346161 88b3d2c08bf307f5dc1c45a88ca38d84c3b9d170
child 346163 a5af35dbd081b116f1078838833a2ba5f486bb14
push id14264
push usermjzffr@gmail.com
push dateThu, 31 Mar 2016 05:20:28 +0000
reviewersgps
bugs1227367
milestone48.0a1
Bug 1227367 - Report when mach python-tests collects no tests; r?gps MozReview-Commit-ID: GDlshUUjO7C
python/mach_commands.py
--- a/python/mach_commands.py
+++ b/python/mach_commands.py
@@ -74,17 +74,18 @@ class MachCommands(MachCommandBase):
         action='store_true',
         help='Verbose output.')
     @CommandArgument('--stop',
         default=False,
         action='store_true',
         help='Stop running tests after the first error or failure.')
     @CommandArgument('tests', nargs='*',
         metavar='TEST',
-        help='Tests to run. Each test can be a single file or a directory.')
+        help=('Tests to run. Each test can be a single file or a directory. '
+              'Tests must be part of PYTHON_UNIT_TESTS.'))
     def python_test(self,
                     tests=[],
                     test_objects=None,
                     subsuite=None,
                     verbose=False,
                     stop=False):
         self._activate_virtualenv()
         # Some tests may require pytest
@@ -93,30 +94,32 @@ class MachCommands(MachCommandBase):
         # Python's unittest, and in particular discover, has problems with
         # clashing namespaces when importing multiple test modules. What follows
         # is a simple way to keep environments separate, at the price of
         # launching Python multiple times. Most tests are run via mozunit,
         # which produces output in the format Mozilla infrastructure expects.
         # Some tests are run via pytest, and these should be equipped with a
         # local mozunit_report plugin to meet output expectations.
         return_code = 0
+        found_tests = False
         if test_objects is None:
             # If we're not being called from `mach test`, do our own
             # test resolution.
             from mozbuild.testing import TestResolver
             resolver = self._spawn(TestResolver)
             if tests:
                 # If we were given test paths, try to find tests matching them.
                 test_objects = resolver.resolve_tests(paths=tests,
                                                       flavor='python')
             else:
                 # Otherwise just run all Python tests.
                 test_objects = resolver.resolve_tests(flavor='python')
 
         for test in test_objects:
+            found_tests = True
             f = test['path']
             file_displayed_test = []  # Used as a boolean.
 
             def _line_handler(line):
                 if not file_displayed_test and line.startswith('TEST-'):
                     file_displayed_test.append(True)
 
             inner_return_code = self.run_process(
@@ -137,16 +140,23 @@ class MachCommands(MachCommandBase):
                     self.log(logging.INFO, 'python-test', {'file': f},
                              'Test failed: {file}')
                 else:
                     self.log(logging.INFO, 'python-test', {'file': f},
                              'Test passed: {file}')
             if stop and return_code > 0:
                 return 1
 
+        if not found_tests:
+            self.log(logging.WARN, 'python-test', {},
+                     'TEST-UNEXPECTED-FAIL | No tests collected '
+                     '(not in PYTHON_UNIT_TESTS?)')
+
+            return 1
+
         return 0 if return_code == 0 else 1
 
     @Command('eslint', category='devenv',
         description='Run eslint or help configure eslint for optimal development.')
     @CommandArgument('-s', '--setup', default=False, action='store_true',
         help='configure eslint for optimal development.')
     @CommandArgument('-e', '--ext', default='[.js,.jsm,.jsx,.xml,.html]',
         help='Filename extensions to lint, default: "[.js,.jsm,.jsx,.xml,.html]".')