Show More
@@ -60,6 +60,14 b' import Queue as queue' | |||
|
60 | 60 | from xml.dom import minidom |
|
61 | 61 | import unittest |
|
62 | 62 | |
|
63 | try: | |
|
64 | if sys.version_info < (2, 7): | |
|
65 | import simplejson as json | |
|
66 | else: | |
|
67 | import json | |
|
68 | except ImportError: | |
|
69 | json = None | |
|
70 | ||
|
63 | 71 | processlock = threading.Lock() |
|
64 | 72 | |
|
65 | 73 | # subprocess._cleanup can race with any Popen.wait or Popen.poll on py24 |
@@ -186,6 +194,8 b' def getparser():' | |||
|
186 | 194 | " (default: $%s or %d)" % defaults['timeout']) |
|
187 | 195 | parser.add_option("--time", action="store_true", |
|
188 | 196 | help="time how long each test takes") |
|
197 | parser.add_option("--json", action="store_true", | |
|
198 | help="store test result data in 'report.json' file") | |
|
189 | 199 | parser.add_option("--tmpdir", type="string", |
|
190 | 200 | help="run tests in the given temporary directory" |
|
191 | 201 | " (implies --keep-tmpdir)") |
@@ -1419,6 +1429,37 b' class TextTestRunner(unittest.TextTestRu' | |||
|
1419 | 1429 | finally: |
|
1420 | 1430 | xuf.close() |
|
1421 | 1431 | |
|
1432 | if self._runner.options.json: | |
|
1433 | if json is None: | |
|
1434 | raise ImportError("json module not installed") | |
|
1435 | jsonpath = os.path.join(self._runner._testdir, 'report.json') | |
|
1436 | fp = open(jsonpath, 'w') | |
|
1437 | try: | |
|
1438 | timesd = {} | |
|
1439 | for test, cuser, csys, real in result.times: | |
|
1440 | timesd[test] = real | |
|
1441 | ||
|
1442 | outcome = {} | |
|
1443 | for tc in result.successes: | |
|
1444 | testresult = {'result': 'success', | |
|
1445 | 'time': ('%0.3f' % timesd[tc.name])} | |
|
1446 | outcome[tc.name] = testresult | |
|
1447 | ||
|
1448 | for tc, err in sorted(result.faildata.iteritems()): | |
|
1449 | testresult = {'result': 'failure', | |
|
1450 | 'time': ('%0.3f' % timesd[tc])} | |
|
1451 | outcome[tc] = testresult | |
|
1452 | ||
|
1453 | for tc, reason in result.skipped: | |
|
1454 | testresult = {'result': 'skip', | |
|
1455 | 'time': ('%0.3f' % timesd[tc.name])} | |
|
1456 | outcome[tc.name] = testresult | |
|
1457 | ||
|
1458 | jsonout = json.dumps(outcome, sort_keys=True, indent=4) | |
|
1459 | fp.writelines(("testreport =", jsonout)) | |
|
1460 | finally: | |
|
1461 | fp.close() | |
|
1462 | ||
|
1422 | 1463 | self._runner._checkhglib('Tested') |
|
1423 | 1464 | |
|
1424 | 1465 | self.stream.writeln('# Ran %d tests, %d skipped, %d warned, %d failed.' |
@@ -369,3 +369,40 b" Missing skips or blacklisted skips don't" | |||
|
369 | 369 | Skipped test-failure.t: blacklisted |
|
370 | 370 | # Ran 0 tests, 2 skipped, 0 warned, 0 failed. |
|
371 | 371 | |
|
372 | test for --json | |
|
373 | ================== | |
|
374 | ||
|
375 | $ $TESTDIR/run-tests.py --with-hg=`which hg` --json | |
|
376 | ||
|
377 | --- $TESTTMP/test-failure.t | |
|
378 | +++ $TESTTMP/test-failure.t.err | |
|
379 | @@ -1,4 +1,4 @@ | |
|
380 | $ echo babar | |
|
381 | - rataxes | |
|
382 | + babar | |
|
383 | This is a noop statement so that | |
|
384 | this test is still more bytes than success. | |
|
385 | ||
|
386 | ERROR: test-failure.t output changed | |
|
387 | !.s | |
|
388 | Skipped test-skip.t: skipped | |
|
389 | Failed test-failure.t: output changed | |
|
390 | # Ran 2 tests, 1 skipped, 0 warned, 1 failed. | |
|
391 | python hash seed: * (glob) | |
|
392 | [1] | |
|
393 | ||
|
394 | $ cat report.json | |
|
395 | testreport ={ | |
|
396 | "test-failure.t": [\{] (re) | |
|
397 | "result": "failure", | |
|
398 | "time": "\s*[\d\.]{5}" (re) | |
|
399 | }, | |
|
400 | "test-skip.t": { | |
|
401 | "result": "skip", | |
|
402 | "time": "\s*[\d\.]{5}" (re) | |
|
403 | }, | |
|
404 | "test-success.t": [\{] (re) | |
|
405 | "result": "success", | |
|
406 | "time": "\s*[\d\.]{5}" (re) | |
|
407 | } | |
|
408 | } (no-eol) |
General Comments 0
You need to be logged in to leave comments.
Login now