diff --git a/django_slowtests/testrunner.py b/django_slowtests/testrunner.py index 7600b70..ccbfbf3 100644 --- a/django_slowtests/testrunner.py +++ b/django_slowtests/testrunner.py @@ -246,16 +246,16 @@ def suite_result(self, suite, result): # Filter tests by threshold test_results = [] - for result in by_time: + for timing in by_time: # Convert test time from seconds to miliseconds for comparison - result_time_ms = result[1] * 1000 + result_time_ms = timing[1] * 1000 # If the test was under the threshold # don't show it to the user if result_time_ms < SLOW_TEST_THRESHOLD_MS: continue - test_results.append(result) + test_results.append(timing) self.generate_report(test_results, result) return return_value diff --git a/django_slowtests/tests/tests.py b/django_slowtests/tests/tests.py index 452c4cc..fd0aadb 100644 --- a/django_slowtests/tests/tests.py +++ b/django_slowtests/tests/tests.py @@ -1,7 +1,8 @@ -from django.test import TestCase +from django.test import TestCase, override_settings +from django.test.runner import DiscoverRunner from mock import patch from unittest import TestResult -from ..testrunner import TimingSuite +from ..testrunner import DiscoverSlowestTestsRunner, TimingSuite class TimingSuiteTests(TestCase): @@ -45,3 +46,24 @@ def test_timing_is_correct_when_freezegun_sets_time_in_future(self): self.assertEqual(mock.call_args_list[0][0][0], test_name) self.assertTrue(mock.call_args_list[0][0][1] > 0) self.assertTrue(mock.call_args_list[0][0][1] < 1) + + +class SuiteResultTests(TestCase): + @override_settings(SLOW_TEST_THRESHOLD_MS=100000, ALWAYS_GENERATE_SLOW_REPORT=False) + def test_result_object_is_not_replaced_when_threshold_filtering_runs(self): + # Regression test: suite_result used to iterate `for result in by_time`, + # which shadowed the `result` TestResult argument with a (name, duration) + # tuple and crashed generate_report with + # AttributeError: 'tuple' object has no attribute 'testsRun'. + runner = DiscoverSlowestTestsRunner(generate_report=True) + result = TestResult() + result.testsRun = 3 + + with patch.object(DiscoverRunner, 'suite_result', return_value=0), \ + patch.object(runner, 'get_timings', return_value=[('slow_test', 0.5)]), \ + patch.object(runner, 'generate_report') as mock_generate_report: + runner.suite_result(suite=None, result=result) + + mock_generate_report.assert_called_once() + _, passed_result = mock_generate_report.call_args[0] + self.assertIs(passed_result, result)