diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2019-04-05 00:56:36 +0200 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2019-04-05 00:56:36 +0200 |
commit | a5360cc01f1418571d15d320431ade025265ca58 (patch) | |
tree | eeeac8f0185888d0e2391a8a76abdb7d1f114432 | |
parent | c367b51a70819c6f7328ef2f435d8536067f1199 (diff) | |
download | psutil-a5360cc01f1418571d15d320431ade025265ca58.tar.gz |
fix #1478: add make command to re-run tests failed on last run
-rw-r--r-- | HISTORY.rst | 1 | ||||
-rw-r--r-- | Makefile | 5 | ||||
-rwxr-xr-x | psutil/tests/runner.py | 27 | ||||
-rwxr-xr-x | scripts/internal/winmake.py | 10 |
4 files changed, 41 insertions, 2 deletions
diff --git a/HISTORY.rst b/HISTORY.rst index b5e1e6a0..b01d8fea 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -10,6 +10,7 @@ the number of physical CPUs in case /proc/cpuinfo does not provide this info. - 1458_: provide coloured test output. Also show failures on KeyboardInterrupt. - 1464_: various docfixes (always point to python3 doc, fix links, etc.). +- 1478_: add make command to re-run tests failed on last run. **Bug fixes** @@ -49,6 +49,7 @@ clean: ## Remove all build files. *.egg-info \ *\$testfn* \ .coverage \ + .failed-tests.txt \ .tox \ build/ \ dist/ \ @@ -151,6 +152,10 @@ test-by-name: ## e.g. make test-by-name ARGS=psutil.tests.test_system.TestSyste ${MAKE} install @$(TEST_PREFIX) $(PYTHON) -m unittest -v $(ARGS) +test-failed: ## Re-run tests which failed on last run + ${MAKE} install + $(TEST_PREFIX) $(PYTHON) -c "import psutil.tests.runner as r; r.run(last_failed=True)" + test-coverage: ## Run test coverage. ${MAKE} install # Note: coverage options are controlled by .coveragerc file diff --git a/psutil/tests/runner.py b/psutil/tests/runner.py index 9e19d198..7d3a68b9 100755 --- a/psutil/tests/runner.py +++ b/psutil/tests/runner.py @@ -24,11 +24,13 @@ except ImportError: import psutil from psutil._common import memoize +from psutil.tests import safe_rmpath from psutil.tests import TOX HERE = os.path.abspath(os.path.dirname(__file__)) VERBOSITY = 1 if TOX else 2 +FAILED_TESTS_FNAME = '.failed-tests.txt' if os.name == 'posix': GREEN = 1 RED = 2 @@ -157,15 +159,36 @@ def get_suite(name=None): return suite -def run(name=None): +def get_suite_from_failed(): + # ...from previously failed test run + with open(FAILED_TESTS_FNAME, 'rt') as f: + names = f.read().split() + suite = unittest.TestSuite() + for n in names: + suite.addTest(unittest.defaultTestLoader.loadTestsFromName(n)) + return suite + + +def save_failed_tests(result): + if result.wasSuccessful(): + return safe_rmpath(FAILED_TESTS_FNAME) + with open(FAILED_TESTS_FNAME, 'wt') as f: + for t in result.errors + result.failures: + tname = str(t[0]) + f.write(tname + '\n') + + +def run(name=None, last_failed=False): setup_tests() runner = ColouredRunner(verbosity=VERBOSITY) + suite = get_suite_from_failed() if last_failed else get_suite(name) try: - result = runner.run(get_suite(name)) + result = runner.run(suite) except (KeyboardInterrupt, SystemExit) as err: print("received %s" % err.__class__.__name__, file=sys.stderr) runner.result.printErrors() sys.exit(1) else: + save_failed_tests(result) success = result.wasSuccessful() sys.exit(0 if success else 1) diff --git a/scripts/internal/winmake.py b/scripts/internal/winmake.py index cbdeebdc..75b4c348 100755 --- a/scripts/internal/winmake.py +++ b/scripts/internal/winmake.py @@ -318,6 +318,7 @@ def clean(): "*.~", "*__pycache__", ".coverage", + ".failed-tests.txt", ".tox", ) safe_rmtree("build") @@ -440,6 +441,15 @@ def test_by_name(): @cmd +def test_failed(): + """Re-run tests which failed on last run.""" + install() + test_setup() + sh('%s -c "import psutil.tests.runner as r; r.run(last_failed=True)"' % ( + PYTHON)) + + +@cmd def test_script(): """Quick way to test a script""" try: |