Skip to content

Commit 4d657f6

Browse files
committed
Improvements to tool test driver script.
- Run all tests for a tool by default. - Gather a couple more things into output JSON needed to emulate what Planemo produces by combining JSON and XUnit produces from nose. - Add --verbose flag, default to quiter testing. - Add --append flag to gather multiple test runs together into a single test JSON file that can be converted to HTML, XUnit, or Markdown with Planemo (galaxyproject/planemo#799).
1 parent c673a73 commit 4d657f6

2 files changed

Lines changed: 79 additions & 28 deletions

File tree

lib/galaxy/tools/verify/interactor.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ def _verify_extra_files_content(extra_files, hda_id, dataset_fetcher, test_data_
622622
_verify_composite_datatype_file_content(filepath, hda_id, base_name=filename, attributes=attributes, dataset_fetcher=dataset_fetcher, test_data_path_builder=test_data_path_builder, keep_outputs_dir=keep_outputs_dir)
623623

624624

625-
def verify_tool(tool_id, galaxy_interactor, resource_parameters={}, register_job_data=None, test_index=0, tool_version=None):
625+
def verify_tool(tool_id, galaxy_interactor, resource_parameters={}, register_job_data=None, test_index=0, tool_version=None, quiet=False):
626626
tool_test_dicts = galaxy_interactor.get_tool_tests(tool_id, tool_version=tool_version)
627627
tool_test_dict = tool_test_dicts[test_index]
628628
testdef = ToolTestDescription(tool_test_dict)
@@ -642,6 +642,7 @@ def verify_tool(tool_id, galaxy_interactor, resource_parameters={}, register_job
642642
job_output_exceptions = None
643643
tool_execution_exception = None
644644
expected_failure_occurred = False
645+
begin_time = time.time()
645646
try:
646647
try:
647648
tool_response = galaxy_interactor.run_tool(testdef, test_history, resource_parameters=resource_parameters)
@@ -662,7 +663,7 @@ def verify_tool(tool_id, galaxy_interactor, resource_parameters={}, register_job
662663
assert data_list or data_collection_list
663664

664665
try:
665-
job_stdio = _verify_outputs(testdef, test_history, jobs, tool_id, data_list, data_collection_list, galaxy_interactor)
666+
job_stdio = _verify_outputs(testdef, test_history, jobs, tool_id, data_list, data_collection_list, galaxy_interactor, quiet=quiet)
666667
except JobOutputsError as e:
667668
job_stdio = e.job_stdio
668669
job_output_exceptions = e.output_exceptions
@@ -671,16 +672,26 @@ def verify_tool(tool_id, galaxy_interactor, resource_parameters={}, register_job
671672
job_output_exceptions = [e]
672673
raise e
673674
finally:
674-
job_data = {}
675+
end_time = time.time()
676+
job_data = {
677+
"tool_id": tool_id,
678+
"tool_version": tool_version,
679+
"test_index": test_index,
680+
"time_seconds": end_time - begin_time,
681+
}
675682
if tool_inputs is not None:
676683
job_data["inputs"] = tool_inputs
677684
if job_stdio is not None:
678685
job_data["job"] = job_stdio
679686
if job_output_exceptions:
680687
job_data["output_problems"] = [str(_) for _ in job_output_exceptions]
688+
job_data["status"] = "failure"
681689
if tool_execution_exception:
682690
job_data["execution_problem"] = str(tool_execution_exception)
691+
job_data["status"] = "error"
683692
if register_job_data is not None:
693+
if "status" not in job_data:
694+
job_data["status"] = "success"
684695
register_job_data(job_data)
685696

686697
galaxy_interactor.delete_history(test_history)
@@ -698,7 +709,7 @@ def _handle_def_errors(testdef):
698709
raise Exception("Test parse failure")
699710

700711

701-
def _verify_outputs(testdef, history, jobs, tool_id, data_list, data_collection_list, galaxy_interactor):
712+
def _verify_outputs(testdef, history, jobs, tool_id, data_list, data_collection_list, galaxy_interactor, quiet=False):
702713
assert len(jobs) == 1, "Test framework logic error, somehow tool test resulted in more than one job."
703714
job = jobs[0]
704715

@@ -713,7 +724,7 @@ def _verify_outputs(testdef, history, jobs, tool_id, data_list, data_collection_
713724
found_exceptions = []
714725

715726
def register_exception(e):
716-
if not found_exceptions:
727+
if not found_exceptions and not quiet:
717728
# Only print this stuff out once.
718729
for stream in ['stdout', 'stderr']:
719730
if stream in job_stdio:

lib/galaxy/tools/verify/script.py

Lines changed: 63 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
#!/usr/bin/env python
2+
from __future__ import print_function
3+
24
import argparse
35
import json
46
import sys
57

68
from galaxy.tools.verify.interactor import GalaxyInteractorApi, verify_tool
79

8-
DESCRIPTION = "Script to quickly run a tool test against a running Galaxy instance."
10+
DESCRIPTION = """Script to quickly run a tool test against a running Galaxy instance."""
11+
ALL_TESTS = "*all_tests*"
912

1013

1114
def main(argv=None):
@@ -20,35 +23,70 @@ def main(argv=None):
2023
"keep_outputs_dir": args.output,
2124
}
2225
tool_id = args.tool_id
23-
test_index = int(args.test_index)
2426
tool_version = args.tool_version
2527

2628
galaxy_interactor = GalaxyInteractorApi(**galaxy_interactor_kwds)
29+
raw_test_index = args.test_index
30+
if raw_test_index == ALL_TESTS:
31+
tool_test_dicts = galaxy_interactor.get_tool_tests(tool_id, tool_version=tool_version)
32+
test_indices = [i for i in range(len(tool_test_dicts))]
33+
else:
34+
test_indices = [int(raw_test_index)]
2735

2836
test_results = []
2937

30-
def _register_job_data(job_data):
31-
test_results.append({
32-
'id': tool_id + "-" + str(test_index),
33-
'has_data': True,
34-
'data': job_data,
35-
})
36-
37-
try:
38-
verify_tool(
39-
tool_id, galaxy_interactor, test_index=test_index, tool_version=tool_version, register_job_data=_register_job_data
40-
)
41-
finally:
42-
report_obj = {
43-
'version': '0.1',
44-
'tests': test_results,
45-
}
46-
output_json = args.output_json
47-
if output_json:
38+
if args.append:
39+
with open(args.output_json, "r") as f:
40+
previous_results = json.load(f)
41+
test_results = previous_results["tests"]
42+
43+
exceptions = []
44+
verbose = args.verbose
45+
for test_index in test_indices:
46+
if tool_version:
47+
tool_id_and_version = "%s/%s" % (tool_id, tool_version)
48+
else:
49+
tool_id_and_version = tool_id
50+
51+
test_identifier = "tool %s test # %d" % (tool_id_and_version, test_index)
52+
53+
def register(job_data):
54+
test_results.append({
55+
'id': tool_id + "-" + str(test_index),
56+
'has_data': True,
57+
'data': job_data,
58+
})
59+
60+
try:
61+
verify_tool(
62+
tool_id, galaxy_interactor, test_index=test_index, tool_version=tool_version,
63+
register_job_data=register, quiet=not verbose
64+
)
65+
66+
if verbose:
67+
print("%s passed" % test_identifier)
68+
69+
except Exception as e:
70+
if verbose:
71+
print("%s failed, %s" % (test_identifier, e))
72+
exceptions.append(e)
73+
74+
report_obj = {
75+
'version': '0.1',
76+
'tests': test_results,
77+
}
78+
output_json = args.output_json
79+
if output_json:
80+
if args.output_json == "-":
81+
assert not args.append
82+
print(json.dumps(report_obj))
83+
else:
4884
with open(args.output_json, "w") as f:
49-
print(report_obj)
5085
json.dump(report_obj, f)
5186

87+
if exceptions:
88+
raise exceptions[0]
89+
5290

5391
def _arg_parser():
5492
parser = argparse.ArgumentParser(description=DESCRIPTION)
@@ -57,9 +95,11 @@ def _arg_parser():
5795
parser.add_argument('-a', '--admin-key', default=None, help='Galaxy Admin API Key')
5896
parser.add_argument('-t', '--tool-id', default=None, help='Tool ID')
5997
parser.add_argument('--tool-version', default=None, help='Tool Version')
60-
parser.add_argument('-i', '--test-index', default=0, help='Tool Test Index (starting at 0)')
98+
parser.add_argument('-i', '--test-index', default=ALL_TESTS, help='Tool Test Index (starting at 0) - by default all tests will run.')
6199
parser.add_argument('-o', '--output', default=None, help='directory to dump outputs to')
62-
parser.add_argument('-j', '--output_json', default=None, help='output metadata json')
100+
parser.add_argument('--append', default=False, action="store_true", help="Extend a test record json (created with --output-json) with additional tests.")
101+
parser.add_argument('-j', '--output-json', default=None, help='output metadata json')
102+
parser.add_argument('--verbose', default=False, action="store_true", help="Verbose logging.")
63103
return parser
64104

65105

0 commit comments

Comments
 (0)