--- a/python/mach_commands.py
+++ b/python/mach_commands.py
@@ -74,45 +74,48 @@ 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()
# 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. This also runs tests via mozunit,
# which produces output in the format Mozilla infrastructure expects.
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(
@@ -133,16 +136,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]".')