add test times to the JSON results
diff --git a/typ/json_results.py b/typ/json_results.py
index bb693a2..3f20531 100644
--- a/typ/json_results.py
+++ b/typ/json_results.py
@@ -90,8 +90,7 @@
full_results['tests'] = OrderedDict()
for test_name in all_test_names:
- value = OrderedDict()
- value['actual'] = _actual_results_for_test(test_name, results)
+ value = _results_for_test(test_name, results)
if test_name in skipped_tests:
value['expected'] = 'SKIP'
else:
@@ -141,8 +140,10 @@
return set(r.name for r in results.results if r.actual == ResultType.Pass)
-def _actual_results_for_test(test_name, results):
+def _results_for_test(test_name, results):
+ value = OrderedDict()
actuals = []
+ times = []
for r in results.results:
if r.name == test_name:
if r.actual == ResultType.Failure:
@@ -151,10 +152,18 @@
actuals.append('PASS')
elif r.actual == ResultType.Skip:
actuals.append('SKIP')
+
+ # The time a test takes is a floating point number of seconds;
+ # if we were to encode this unmodified, then when we converted it
+ # to JSON it might make the file significantly larger. Instead
+ # we truncate the file to ten-thousandths of a second, which is
+ # probably more than good enough for most tests.
+ times.append(round(r.took, 4))
if not actuals: # pragma: untested
actuals.append('SKIP')
- return ' '.join(actuals)
-
+ value['actual'] = ' '.join(actuals)
+ value['times'] = times
+ return value
def _add_path_to_trie(trie, path, value):
if TEST_SEPARATOR not in path:
diff --git a/typ/tests/json_results_test.py b/typ/tests/json_results_test.py
index 5dfab61..76446f9 100644
--- a/typ/tests/json_results_test.py
+++ b/typ/tests/json_results_test.py
@@ -70,14 +70,14 @@
result_set = json_results.ResultSet()
result_set.add(
json_results.Result('foo_test.FooTest.test_fail',
- json_results.ResultType.Failure, 0, 0, 0,
+ json_results.ResultType.Failure, 0, 0.1, 0,
unexpected=True))
result_set.add(json_results.Result('foo_test.FooTest.test_pass',
json_results.ResultType.Pass,
- 0, 0, 0))
+ 0, 0.2, 0))
result_set.add(json_results.Result('foo_test.FooTest.test_skip',
json_results.ResultType.Skip,
- 0, 0, 0, unexpected=False))
+ 0, 0.3, 0, unexpected=False))
full_results = json_results.make_full_results(
['foo=bar'], 0, test_names, result_set)
@@ -96,12 +96,18 @@
'test_fail': {
'expected': 'PASS',
'actual': 'FAIL',
- 'is_unexpected': True},
+ 'times': [0.1],
+ 'is_unexpected': True,
+ },
'test_pass': {
'expected': 'PASS',
- 'actual': 'PASS'},
+ 'actual': 'PASS',
+ 'times': [0.2],
+ },
'test_skip': {
'expected': 'SKIP',
- 'actual': 'SKIP'}}}},
+ 'actual': 'SKIP',
+ 'times': [0.3],
+ }}}},
'version': 3}
self.assertEqual(full_results, expected_full_results)
diff --git a/typ/tests/main_test.py b/typ/tests/main_test.py
index 771e987..eb21ec4 100644
--- a/typ/tests/main_test.py
+++ b/typ/tests/main_test.py
@@ -706,6 +706,14 @@
results = json.loads(files['results.json'])
self.assertEqual(results['interrupted'], False)
self.assertEqual(results['path_delimiter'], '.')
+
+ # The time it takes to run the test varies, so we test that
+ # we got a single entry greater than zero, but then delete it from
+ # the result so we can do an exact match on the rest of the trie.
+ result = results['tests']['pass_test']['PassingTest']['test_pass']
+ self.assertEqual(len(result['times']), 1)
+ self.assertGreater(result['times'][0], 0)
+ result.pop('times')
self.assertEqual(results['tests'],
{u'pass_test': {
u'PassingTest': {