NIHVIVO-76 Tweak the output.
This commit is contained in:
parent
588ddb9530
commit
9072d93bb5
2 changed files with 239 additions and 220 deletions
|
@ -46,10 +46,10 @@ end
|
||||||
|
|
||||||
class Status
|
class Status
|
||||||
GOOD = 0
|
GOOD = 0
|
||||||
BAD = 1
|
FAIR = 1
|
||||||
FAIR = 2
|
BAD = 2
|
||||||
def self.html_class(status)
|
def self.html_class(status)
|
||||||
return %w{good bad fair}[status]
|
return %w{good fair bad}[status]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -91,212 +91,6 @@ class OutputManager
|
||||||
FileUtils::copy_file(source, dest)
|
FileUtils::copy_file(source, dest)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Write the beginning of the summary file.
|
|
||||||
# This includes the HTML header, and the banner.
|
|
||||||
#
|
|
||||||
# f -- a file, already open for output.
|
|
||||||
#
|
|
||||||
def write_summary_header(f)
|
|
||||||
if @osp.overall_status == Status::BAD
|
|
||||||
overall_status = "FAILURE"
|
|
||||||
else
|
|
||||||
overall_status = "SUCCESS"
|
|
||||||
end
|
|
||||||
|
|
||||||
f.print <<END_HEADER
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Summary of Acceptance Tests #{@osp.start_time}</title>
|
|
||||||
<link rel="stylesheet" type="text/css" href="summary.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div class="heading">
|
|
||||||
Acceptance test results: 3:45 p.m. March 10, 2010
|
|
||||||
<div class="#{Status::html_class(@osp.overall_status)} one-word">#{overall_status}</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
END_HEADER
|
|
||||||
end
|
|
||||||
|
|
||||||
# Write the first section of the summary file. This section contains
|
|
||||||
# nested tables with fixed formats, containing overall stats.
|
|
||||||
#
|
|
||||||
# f -- a file, already open for output.
|
|
||||||
#
|
|
||||||
def write_summary_stats_section(f)
|
|
||||||
how_many_tests = @osp.tests.length
|
|
||||||
how_many_pass = 0
|
|
||||||
how_many_fail = 0
|
|
||||||
how_many_ignore = 0
|
|
||||||
@osp.tests.each do |t|
|
|
||||||
how_many_pass += 1 if t.status == Status::GOOD
|
|
||||||
how_many_ignore += 1 if t.status == Status::FAIR
|
|
||||||
how_many_fail += 1 if t.status == Status::BAD
|
|
||||||
end
|
|
||||||
|
|
||||||
f.print <<END_STATS
|
|
||||||
<div class="section">Summary</div>
|
|
||||||
|
|
||||||
<table class="summary" cellspacing="0">
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<table cellspacing="0">
|
|
||||||
<tr><td>Start time:</td><td>#{@osp.start_time}</td></tr>
|
|
||||||
<tr><td>End time</td><td>#{@osp.end_time}</td></tr>
|
|
||||||
<tr><td>Elapsed time</td><td>#{@osp.elapsed_time}</td></tr>
|
|
||||||
</table>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<table cellspacing="0">
|
|
||||||
<tr><td>Suites</td><td>#{@osp.suites.length}</td></tr>
|
|
||||||
<tr><td>Total tests</td><td>#{@osp.tests.length}</td></tr>
|
|
||||||
<tr class="good"><td>Passing tests</td><td>#{how_many_pass}</td></tr>
|
|
||||||
<tr class="bad"><td>Failing tests</td><td>#{how_many_fail}</td></tr>
|
|
||||||
<tr class="fair"><td>Ignored tests</td><td>#{how_many_ignore}</td></tr>
|
|
||||||
</table>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
END_STATS
|
|
||||||
end
|
|
||||||
|
|
||||||
# Write a table of failed tests to the summary file, with links
|
|
||||||
# to the detailed output for each test.
|
|
||||||
#
|
|
||||||
# f -- a file, already open for output.
|
|
||||||
#
|
|
||||||
def write_summary_failure_section(f)
|
|
||||||
fails = []
|
|
||||||
@osp.tests.each do |t|
|
|
||||||
fails << t if t.status == Status::BAD
|
|
||||||
end
|
|
||||||
|
|
||||||
f.print " <div class=section>Failing tests</div>\n\n <table cellspacing=\"0\">\n"
|
|
||||||
f.print " <tr><th>Suite name</th><th>Test name</th></tr>\n"
|
|
||||||
|
|
||||||
if fails.empty?
|
|
||||||
f.print " <tr>\n"
|
|
||||||
f.print " <td colspan=\"2\">No tests failed.</td>\n"
|
|
||||||
f.print " </tr>\n"
|
|
||||||
else
|
|
||||||
fails.each do |t|
|
|
||||||
f.print " <tr class=\"#{Status::html_class(t.status)}\">\n"
|
|
||||||
f.print " <td>#{t.suite_name}</td>\n"
|
|
||||||
f.print " <td><a href=\"#{t.output_link}\">#{t.test_name}</a></td>\n"
|
|
||||||
f.print " </tr>\n"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
f.print " </table>\n\n"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Write a table of ignored tests to the summary file, with links
|
|
||||||
# to the detailed output for each test.
|
|
||||||
#
|
|
||||||
# f -- a file, already open for output.
|
|
||||||
#
|
|
||||||
def write_summary_ignore_section(f)
|
|
||||||
ignores = []
|
|
||||||
@osp.tests.each do |t|
|
|
||||||
ignores << t if t.status == Status::FAIR
|
|
||||||
end
|
|
||||||
|
|
||||||
f.print " <div class=section>Ignored tests</div>\n\n <table cellspacing=\"0\">\n"
|
|
||||||
f.print " <tr><th>Suite name</th><th>Test name</th></tr>\n"
|
|
||||||
|
|
||||||
if ignores.empty?
|
|
||||||
f.print " <tr>\n"
|
|
||||||
f.print " <td colspan=\"2\">No tests ignored.</td>\n"
|
|
||||||
f.print " </tr>\n"
|
|
||||||
else
|
|
||||||
ignores.each do |t|
|
|
||||||
f.print " <tr class=\"#{Status::html_class(t.status)}\">\n"
|
|
||||||
f.print " <td>#{t.suite_name}</td>\n"
|
|
||||||
f.print " <td><a href=\"#{t.output_link}\">#{t.test_name}</a></td>\n"
|
|
||||||
f.print " </tr>\n"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
f.print " </table>\n\n"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Write a table of any error messages or warnings found in the log file.
|
|
||||||
#
|
|
||||||
# f -- a file, already open for output.
|
|
||||||
#
|
|
||||||
def write_error_messages_section(f)
|
|
||||||
f.print " <div class=section>Errors and warnings</div>\n"
|
|
||||||
f.print " <table cellspacing=\"0\">"
|
|
||||||
|
|
||||||
if @osp.errors.empty? && @osp.warnings.empty?
|
|
||||||
f.print " <tr><td colspan=\"2\">No errors or warnings</td></tr>"
|
|
||||||
else
|
|
||||||
@osp.errors.each() do |e|
|
|
||||||
f.print " <tr class=\"bad\"><td>ERROR</td><td>#{e}</td></tr>"
|
|
||||||
end
|
|
||||||
@osp.warnings.each() do |w|
|
|
||||||
f.print " <tr class=\"fair\"><td>WARN</td><td>#{w}</td></tr>"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
f.print " </table>\n\n"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Write a table of the suites to the summary file, with links
|
|
||||||
# to the detailed output for each suite.
|
|
||||||
#
|
|
||||||
# f -- a file, already open for output.
|
|
||||||
#
|
|
||||||
def write_summary_suites_section(f)
|
|
||||||
f.print " <div class=section>Suites</div>\n"
|
|
||||||
f.print " <table cellspacing=\"0\">\n"
|
|
||||||
|
|
||||||
@osp.suites.each() do |s|
|
|
||||||
f.print " <tr class=\"#{Status::html_class(s.status)}\">\n"
|
|
||||||
f.print " <td><a href=\"#{s.output_link}\">#{s.name}</a></td>\n"
|
|
||||||
f.print " </tr>\n"
|
|
||||||
end
|
|
||||||
f.print " </table>\n\n"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Write a table of all tests to the summary file, with links
|
|
||||||
# to the detailed output for each test.
|
|
||||||
#
|
|
||||||
# f -- a file, already open for output.
|
|
||||||
#
|
|
||||||
def write_summary_all_tests_section(f)
|
|
||||||
f.print " <div class=section>All tests</div>\n\n <table cellspacing=\"0\">\n"
|
|
||||||
f.print " <tr><th>Suite name</th><th>Test name</th></tr>\n"
|
|
||||||
|
|
||||||
if @osp.tests.empty?
|
|
||||||
f.print " <tr>\n"
|
|
||||||
f.print " <td colspan=\"2\">No tests.</td>\n"
|
|
||||||
f.print " </tr>\n"
|
|
||||||
else
|
|
||||||
@osp.tests.each do |t|
|
|
||||||
f.print " <tr class=\"#{Status::html_class(t.status)}\">\n"
|
|
||||||
f.print " <td>#{t.suite_name}</td>\n"
|
|
||||||
f.print " <td><a href=\"#{t.output_link}\">#{t.test_name}</a></td>\n"
|
|
||||||
f.print " </tr>\n"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
f.print " </table>\n\n"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Copy the log to the summary file, and close the HTML tags.
|
|
||||||
#
|
|
||||||
# f -- a file, already open for output.
|
|
||||||
#
|
|
||||||
def write_summary_footer(f)
|
|
||||||
f.print " <div class=section>Log</div>\n <pre>\n"
|
|
||||||
File.open(@log_file) do |log|
|
|
||||||
FileUtils::copy_stream(log, f)
|
|
||||||
end
|
|
||||||
f.print " </pre>\n</body>\n</html>\n\n"
|
|
||||||
end
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------------
|
||||||
public
|
public
|
||||||
|
|
||||||
|
@ -323,10 +117,14 @@ END_STATS
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Where can we find the output for this suite?
|
||||||
|
#
|
||||||
def output_filename(suite_name)
|
def output_filename(suite_name)
|
||||||
File.expand_path("#{suite_name}_output.html", @output_directory)
|
File.expand_path("#{suite_name}_output.html", @output_directory)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Have we decided to ignore this test if it fails?
|
||||||
|
#
|
||||||
def ignore_test?(suite_name, test_name)
|
def ignore_test?(suite_name, test_name)
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
@ -339,15 +137,6 @@ END_STATS
|
||||||
File.open(@output_summary_file, File::CREAT | File::WRONLY) do |f|
|
File.open(@output_summary_file, File::CREAT | File::WRONLY) do |f|
|
||||||
osf = OutputSummaryFormatter.new(@osp, @log_file)
|
osf = OutputSummaryFormatter.new(@osp, @log_file)
|
||||||
osf.format(f)
|
osf.format(f)
|
||||||
|
|
||||||
write_summary_header(f)
|
|
||||||
write_summary_stats_section(f)
|
|
||||||
write_error_messages_section(f)
|
|
||||||
write_summary_failure_section(f)
|
|
||||||
write_summary_ignore_section(f)
|
|
||||||
write_summary_suites_section(f)
|
|
||||||
write_summary_all_tests_section(f)
|
|
||||||
write_summary_footer(f)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
|
@ -32,9 +32,231 @@ class OutputSummaryFormatter
|
||||||
private
|
private
|
||||||
# ------------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Confirm that the output directory parameter is reasonable.
|
# Write the beginning of the summary file.
|
||||||
|
# This includes the HTML header, and the banner.
|
||||||
#
|
#
|
||||||
def sanity_checks_on_parameters()
|
# f -- a file, already open for output.
|
||||||
|
#
|
||||||
|
def write_summary_header(f)
|
||||||
|
if @osp.overall_status == Status::BAD
|
||||||
|
status = "FAILURE"
|
||||||
|
html_class = Status::html_class(Status::BAD)
|
||||||
|
else
|
||||||
|
status = "SUCCESS"
|
||||||
|
html_class = Status::html_class(Status::GOOD)
|
||||||
|
end
|
||||||
|
|
||||||
|
f.print <<END_HEADER
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Summary of Acceptance Tests #{@osp.start_time}</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="summary.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="heading">
|
||||||
|
Acceptance test results: 3:45 p.m. March 10, 2010
|
||||||
|
<div class="#{html_class} one-word">#{status}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
END_HEADER
|
||||||
|
end
|
||||||
|
|
||||||
|
# Write the first section of the summary file. This section contains
|
||||||
|
# nested tables with fixed formats, containing overall stats.
|
||||||
|
#
|
||||||
|
# f -- a file, already open for output.
|
||||||
|
#
|
||||||
|
def write_summary_stats_section(f)
|
||||||
|
how_many_tests = @osp.tests.length
|
||||||
|
|
||||||
|
how_many_pass = 0
|
||||||
|
how_many_fail = 0
|
||||||
|
how_many_ignore = 0
|
||||||
|
@osp.tests.each do |t|
|
||||||
|
how_many_pass += 1 if t.status == Status::GOOD
|
||||||
|
how_many_ignore += 1 if t.status == Status::FAIR
|
||||||
|
how_many_fail += 1 if t.status == Status::BAD
|
||||||
|
end
|
||||||
|
|
||||||
|
if how_many_pass > 0
|
||||||
|
pass_class = Status::html_class(Status::GOOD)
|
||||||
|
else
|
||||||
|
pass_class = ''
|
||||||
|
end
|
||||||
|
|
||||||
|
if how_many_fail > 0
|
||||||
|
fail_class = Status::html_class(Status::BAD)
|
||||||
|
else
|
||||||
|
fail_class = ''
|
||||||
|
end
|
||||||
|
|
||||||
|
if how_many_ignore > 0
|
||||||
|
ignore_class = Status::html_class(Status::FAIR)
|
||||||
|
else
|
||||||
|
ignore_class = ''
|
||||||
|
end
|
||||||
|
|
||||||
|
f.print <<END_STATS
|
||||||
|
<div class="section">Summary</div>
|
||||||
|
|
||||||
|
<table class="summary" cellspacing="0">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<table cellspacing="0">
|
||||||
|
<tr><td>Start time:</td><td>#{@osp.start_time}</td></tr>
|
||||||
|
<tr><td>End time</td><td>#{@osp.end_time}</td></tr>
|
||||||
|
<tr><td>Elapsed time</td><td>#{@osp.elapsed_time}</td></tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<table cellspacing="0">
|
||||||
|
<tr><td>Suites</td><td>#{@osp.suites.length}</td></tr>
|
||||||
|
<tr><td>Total tests</td><td>#{@osp.tests.length}</td></tr>
|
||||||
|
<tr class="#{pass_class}"><td>Passing tests</td><td>#{how_many_pass}</td></tr>
|
||||||
|
<tr class="#{fail_class}"><td>Failing tests</td><td>#{how_many_fail}</td></tr>
|
||||||
|
<tr class="#{ignore_class}"><td>Ignored tests</td><td>#{how_many_ignore}</td></tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
END_STATS
|
||||||
|
end
|
||||||
|
|
||||||
|
# Write a table of failed tests to the summary file, with links
|
||||||
|
# to the detailed output for each test.
|
||||||
|
#
|
||||||
|
# f -- a file, already open for output.
|
||||||
|
#
|
||||||
|
def write_summary_failure_section(f)
|
||||||
|
fails = []
|
||||||
|
@osp.tests.each do |t|
|
||||||
|
fails << t if t.status == Status::BAD
|
||||||
|
end
|
||||||
|
|
||||||
|
f.print " <div class=section>Failing tests</div>\n\n <table cellspacing=\"0\">\n"
|
||||||
|
f.print " <tr><th>Suite name</th><th>Test name</th></tr>\n"
|
||||||
|
|
||||||
|
if fails.empty?
|
||||||
|
f.print " <tr>\n"
|
||||||
|
f.print " <td colspan=\"2\">No tests failed.</td>\n"
|
||||||
|
f.print " </tr>\n"
|
||||||
|
else
|
||||||
|
fails.each do |t|
|
||||||
|
f.print " <tr class=\"#{Status::html_class(t.status)}\">\n"
|
||||||
|
f.print " <td>#{t.suite_name}</td>\n"
|
||||||
|
f.print " <td><a href=\"#{t.output_link}\">#{t.test_name}</a></td>\n"
|
||||||
|
f.print " </tr>\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
f.print " </table>\n\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Write a table of ignored tests to the summary file, with links
|
||||||
|
# to the detailed output for each test.
|
||||||
|
#
|
||||||
|
# f -- a file, already open for output.
|
||||||
|
#
|
||||||
|
def write_summary_ignore_section(f)
|
||||||
|
ignores = []
|
||||||
|
@osp.tests.each do |t|
|
||||||
|
ignores << t if t.status == Status::FAIR
|
||||||
|
end
|
||||||
|
|
||||||
|
f.print " <div class=section>Ignored tests</div>\n\n <table cellspacing=\"0\">\n"
|
||||||
|
f.print " <tr><th>Suite name</th><th>Test name</th></tr>\n"
|
||||||
|
|
||||||
|
if ignores.empty?
|
||||||
|
f.print " <tr>\n"
|
||||||
|
f.print " <td colspan=\"2\">No tests ignored.</td>\n"
|
||||||
|
f.print " </tr>\n"
|
||||||
|
else
|
||||||
|
ignores.each do |t|
|
||||||
|
f.print " <tr class=\"#{Status::html_class(t.status)}\">\n"
|
||||||
|
f.print " <td>#{t.suite_name}</td>\n"
|
||||||
|
f.print " <td><a href=\"#{t.output_link}\">#{t.test_name}</a></td>\n"
|
||||||
|
f.print " </tr>\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
f.print " </table>\n\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Write a table of any error messages or warnings found in the log file.
|
||||||
|
#
|
||||||
|
# f -- a file, already open for output.
|
||||||
|
#
|
||||||
|
def write_error_messages_section(f)
|
||||||
|
f.print " <div class=section>Errors and warnings</div>\n"
|
||||||
|
f.print " <table cellspacing=\"0\">"
|
||||||
|
|
||||||
|
if @osp.errors.empty? && @osp.warnings.empty?
|
||||||
|
f.print " <tr><td colspan=\"2\">No errors or warnings</td></tr>"
|
||||||
|
else
|
||||||
|
@osp.errors.each() do |e|
|
||||||
|
f.print " <tr class=\"bad\"><td>ERROR</td><td>#{e}</td></tr>"
|
||||||
|
end
|
||||||
|
@osp.warnings.each() do |w|
|
||||||
|
f.print " <tr class=\"fair\"><td>WARN</td><td>#{w}</td></tr>"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
f.print " </table>\n\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Write a table of the suites to the summary file, with links
|
||||||
|
# to the detailed output for each suite.
|
||||||
|
#
|
||||||
|
# f -- a file, already open for output.
|
||||||
|
#
|
||||||
|
def write_summary_suites_section(f)
|
||||||
|
f.print " <div class=section>Suites</div>\n"
|
||||||
|
f.print " <table cellspacing=\"0\">\n"
|
||||||
|
|
||||||
|
@osp.suites.each() do |s|
|
||||||
|
f.print " <tr class=\"#{Status::html_class(s.status)}\">\n"
|
||||||
|
f.print " <td><a href=\"#{s.output_link}\">#{s.name}</a></td>\n"
|
||||||
|
f.print " </tr>\n"
|
||||||
|
end
|
||||||
|
f.print " </table>\n\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Write a table of all tests to the summary file, with links
|
||||||
|
# to the detailed output for each test.
|
||||||
|
#
|
||||||
|
# f -- a file, already open for output.
|
||||||
|
#
|
||||||
|
def write_summary_all_tests_section(f)
|
||||||
|
f.print " <div class=section>All tests</div>\n\n <table cellspacing=\"0\">\n"
|
||||||
|
f.print " <tr><th>Suite name</th><th>Test name</th></tr>\n"
|
||||||
|
|
||||||
|
if @osp.tests.empty?
|
||||||
|
f.print " <tr>\n"
|
||||||
|
f.print " <td colspan=\"2\">No tests.</td>\n"
|
||||||
|
f.print " </tr>\n"
|
||||||
|
else
|
||||||
|
@osp.tests.each do |t|
|
||||||
|
f.print " <tr class=\"#{Status::html_class(t.status)}\">\n"
|
||||||
|
f.print " <td>#{t.suite_name}</td>\n"
|
||||||
|
f.print " <td><a href=\"#{t.output_link}\">#{t.test_name}</a></td>\n"
|
||||||
|
f.print " </tr>\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
f.print " </table>\n\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Copy the log to the summary file, and close the HTML tags.
|
||||||
|
#
|
||||||
|
# f -- a file, already open for output.
|
||||||
|
#
|
||||||
|
def write_summary_footer(f)
|
||||||
|
f.print " <div class=section>Log</div>\n <pre>\n"
|
||||||
|
File.open(@log_file) do |log|
|
||||||
|
FileUtils::copy_stream(log, f)
|
||||||
|
end
|
||||||
|
f.print " </pre>\n</body>\n</html>\n\n"
|
||||||
end
|
end
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------------
|
||||||
|
@ -49,5 +271,13 @@ class OutputSummaryFormatter
|
||||||
end
|
end
|
||||||
|
|
||||||
def format(f)
|
def format(f)
|
||||||
|
write_summary_header(f)
|
||||||
|
write_summary_stats_section(f)
|
||||||
|
write_error_messages_section(f)
|
||||||
|
write_summary_failure_section(f)
|
||||||
|
write_summary_ignore_section(f)
|
||||||
|
write_summary_suites_section(f)
|
||||||
|
write_summary_all_tests_section(f)
|
||||||
|
write_summary_footer(f)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue