|
15 | 15 | import argparse
|
16 | 16 | from collections import deque
|
17 | 17 | import configparser
|
| 18 | +import csv |
18 | 19 | import datetime
|
19 | 20 | import os
|
| 21 | +import pathlib |
20 | 22 | import platform
|
21 | 23 | import time
|
22 | 24 | import shutil
|
@@ -439,6 +441,7 @@ def main():
|
439 | 441 | parser.add_argument('--filter', help='filter scripts to run by regular expression')
|
440 | 442 | parser.add_argument("--nocleanup", dest="nocleanup", default=False, action="store_true",
|
441 | 443 | help="Leave bitcoinds and test.* datadir on exit or error")
|
| 444 | + parser.add_argument('--resultsfile', '-r', help='store test results (as CSV) to the provided file') |
442 | 445 |
|
443 | 446 |
|
444 | 447 | args, unknown_args = parser.parse_known_args()
|
@@ -471,6 +474,13 @@ def main():
|
471 | 474 |
|
472 | 475 | logging.debug("Temporary test directory at %s" % tmpdir)
|
473 | 476 |
|
| 477 | + results_filepath = None |
| 478 | + if args.resultsfile: |
| 479 | + results_filepath = pathlib.Path(args.resultsfile) |
| 480 | + # Stop early if the parent directory doesn't exist |
| 481 | + assert results_filepath.parent.exists(), "Results file parent directory does not exist" |
| 482 | + logging.debug("Test results will be written to " + str(results_filepath)) |
| 483 | + |
474 | 484 | enable_bitcoind = config["components"].getboolean("ENABLE_BITCOIND")
|
475 | 485 |
|
476 | 486 | if not enable_bitcoind:
|
@@ -557,9 +567,10 @@ def main():
|
557 | 567 | combined_logs_len=args.combinedlogslen,
|
558 | 568 | failfast=args.failfast,
|
559 | 569 | use_term_control=args.ansi,
|
| 570 | + results_filepath=results_filepath, |
560 | 571 | )
|
561 | 572 |
|
562 |
| -def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=False, args=None, combined_logs_len=0, failfast=False, use_term_control): |
| 573 | +def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=False, args=None, combined_logs_len=0, failfast=False, use_term_control, results_filepath=None): |
563 | 574 | args = args or []
|
564 | 575 |
|
565 | 576 | # Warn if bitcoind is already running
|
@@ -651,11 +662,14 @@ def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=
|
651 | 662 | break
|
652 | 663 |
|
653 | 664 | if "[Errno 28] No space left on device" in stdout:
|
654 |
| - sys.exit(f"Early exiting after test failure due to insuffient free space in {tmpdir}\n" |
| 665 | + sys.exit(f"Early exiting after test failure due to insufficient free space in {tmpdir}\n" |
655 | 666 | f"Test execution data left in {tmpdir}.\n"
|
656 | 667 | f"Additional storage is needed to execute testing.")
|
657 | 668 |
|
658 |
| - print_results(test_results, max_len_name, (int(time.time() - start_time))) |
| 669 | + runtime = int(time.time() - start_time) |
| 670 | + print_results(test_results, max_len_name, runtime) |
| 671 | + if results_filepath: |
| 672 | + write_results(test_results, results_filepath, runtime) |
659 | 673 |
|
660 | 674 | if coverage:
|
661 | 675 | coverage_passed = coverage.report_rpc_coverage()
|
@@ -702,6 +716,17 @@ def print_results(test_results, max_len_name, runtime):
|
702 | 716 | results += "Runtime: %s s\n" % (runtime)
|
703 | 717 | print(results)
|
704 | 718 |
|
| 719 | + |
| 720 | +def write_results(test_results, filepath, total_runtime): |
| 721 | + with open(filepath, mode="w", encoding="utf8") as results_file: |
| 722 | + results_writer = csv.writer(results_file) |
| 723 | + results_writer.writerow(['test', 'status', 'duration(seconds)']) |
| 724 | + all_passed = True |
| 725 | + for test_result in test_results: |
| 726 | + all_passed = all_passed and test_result.was_successful |
| 727 | + results_writer.writerow([test_result.name, test_result.status, str(test_result.time)]) |
| 728 | + results_writer.writerow(['ALL', ("Passed" if all_passed else "Failed"), str(total_runtime)]) |
| 729 | + |
705 | 730 | class TestHandler:
|
706 | 731 | """
|
707 | 732 | Trigger the test scripts passed in via the list.
|
|
0 commit comments