blob: 6c7467aaca71a63e2022eb86d162d7ab035b84f5 [file] [log] [blame]
#!/usr/bin/python
#
# Copyright 2010 Google Inc. All Rights Reserved.
"""Script to compare a baseline results file to a new results file."""
__author__ = "raymes@google.com (Raymes Khoury)"
import sys
from utils import logger
from utils import html_tools
PASS = "pass"
FAIL = "fail"
NOT_EXECUTED = "not executed"
class ResultsReport:
def __init__(self, report, num_tests_executed, num_passes, num_failures, num_regressions):
self.report = report
self.num_tests_executed = num_tests_executed
self.num_passes = num_passes
self.num_failures = num_failures
self.num_regressions = num_regressions
def GetReport(self):
return self.report
def GetNumExecuted(self):
return self.num_tests_executed
def GetNumPasses(self):
return self.num_passes
def GetNumFailures(self):
return self.num_failures
def GetNumRegressions(self):
return self.num_regressions
def GetSummary(self):
summary = "Tests executed: %s\n" % str(self.num_tests_executed)
summary += "Tests Passing: %s\n" % str(self.num_passes)
summary += "Tests Failing: %s\n" % str(self.num_failures)
summary += "Regressions: %s\n" % str(self.num_regressions)
return summary
def Usage():
print "Usage: %s baseline_results new_results" % sys.argv[0]
sys.exit(1)
def ParseResults(results_filename):
results = []
try:
results_file = open(results_filename, 'rb')
for line in results_file:
if line.strip() != "":
results.append(line.strip().split("\t"))
results_file.close()
except IOError:
logger.GetLogger().LogWarning("Could not open results file: " +
results_filename)
return results
def GenerateResultsReport(baseline_file, new_result_file):
baseline_results = ParseResults(baseline_file)
new_results = ParseResults(new_result_file)
test_status = {}
for new_result in new_results:
new_test_name = new_result[0]
new_test_result = new_result[1]
test_status[new_test_name] = (new_test_result, NOT_EXECUTED)
for baseline_result in baseline_results:
baseline_test_name = baseline_result[0]
baseline_test_result = baseline_result[1]
if baseline_test_name in test_status:
new_test_result = test_status[baseline_test_name][0]
test_status[baseline_test_name] = (new_test_result, baseline_test_result)
else:
test_status[baseline_test_name] = (NOT_EXECUTED, baseline_test_result)
regressions = []
for result in test_status.keys():
if test_status[result][0] != test_status[result][1]:
regressions.append(result)
num_tests_executed = len(new_results)
num_regressions = len(regressions)
num_passes = 0
num_failures = 0
for result in new_results:
if result[1] == PASS:
num_passes += 1
else:
num_failures += 1
report = html_tools.GetPageHeader("Test Summary")
report += html_tools.GetHeader("Test Summary")
report += html_tools.GetListHeader()
report += html_tools.GetListItem("Tests executed: " + str(num_tests_executed))
report += html_tools.GetListItem("Passes: " + str(num_passes))
report += html_tools.GetListItem("Failures: " + str(num_failures))
report += html_tools.GetListItem("Regressions: " + str(num_regressions))
report += html_tools.GetListFooter()
report += html_tools.GetHeader("Regressions", 2)
report += html_tools.GetTableHeader(["Test name", "Expected result",
"Actual result"])
for regression in regressions:
report += html_tools.GetTableRow([regression[:150], test_status[regression][1],
test_status[regression][0]])
report += "\n"
report += html_tools.GetTableFooter()
report += html_tools.GetHeader("All Tests", 2)
report += html_tools.GetTableHeader(["Test name", "Expected result", "Actual result"])
for result in test_status.keys():
report += html_tools.GetTableRow([result[:150], test_status[result][1],
test_status[result][0]])
report += "\n"
report += html_tools.GetTableFooter()
report += html_tools.GetFooter()
return ResultsReport(report, num_tests_executed, num_passes, num_failures, num_regressions)
def Main(argv):
if len(argv) < 2:
Usage()
print GenerateResultsReport(argv[1], argv[2])[0]
if __name__ == "__main__":
Main(sys.argv)