Skip to content

Commit bf203b5

Browse files
jcharummitechie
authored andcommitted
Add summary page for test results
Conflicts: src/tests/regression.py
1 parent 65989b5 commit bf203b5

File tree

1 file changed

+129
-15
lines changed

1 file changed

+129
-15
lines changed

src/tests/regression.py

Lines changed: 129 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
TESTDIR = os.path.dirname(__file__)
2121
TEST_DATA_PATH = os.path.join(TESTDIR, 'test_data')
2222
TEST_OUTPUT_PATH = os.path.join(TESTDIR, 'test_output')
23+
TEST_SUMMARY_PATH = os.path.join(TEST_OUTPUT_PATH, 'index.html')
2324

2425

2526
class ReadabilityTest:
@@ -73,9 +74,12 @@ def make_readability_test(dir_path, name, spec_dict):
7374

7475

7576
def load_test_data(test):
76-
orig = open(test.orig_path, 'r').read()
77-
rdbl = open(test.rdbl_path, 'r').read()
78-
return ReadabilityTestData(test, orig, rdbl)
77+
if test.enabled:
78+
orig = open(test.orig_path, 'r').read()
79+
rdbl = open(test.rdbl_path, 'r').read()
80+
return ReadabilityTestData(test, orig, rdbl)
81+
else:
82+
return None
7983

8084

8185
def load_readability_tests(dir_path, files):
@@ -90,14 +94,122 @@ def load_readability_tests(dir_path, files):
9094

9195

9296
def execute_test(test_data):
93-
doc = readability.Document(test_data.orig_html)
94-
summary = doc.summary_with_metadata()
95-
benchmark_doc = (test_data.rdbl_html, 'benchmark')
96-
result_doc = (summary.html, 'result')
97-
# diff = lxml.html.diff.html_annotate([benchmark_doc, result_doc])
98-
diff = lxml.html.diff.htmldiff(test_data.rdbl_html, summary.html)
99-
# diff = test_data.orig_html
100-
return ReadabilityTestResult(test_data, summary.html, diff)
97+
if test_data is None:
98+
return None
99+
else:
100+
doc = readability.Document(test_data.orig_html)
101+
summary = doc.summary()
102+
benchmark_doc = (test_data.rdbl_html, 'benchmark')
103+
result_doc = (summary.html, 'result')
104+
diff = lxml.html.diff.htmldiff(test_data.rdbl_html, summary.html)
105+
return ReadabilityTestResult(test_data, summary.html, diff)
106+
107+
108+
SUMMARY_CSS = '''
109+
table, th, td {
110+
border: 1px solid black;
111+
border-collapse: collapse;
112+
font-family: Georgia, 'Times New Roman', serif;
113+
}
114+
table {
115+
margin: auto;
116+
}
117+
.skipped {
118+
color: gray;
119+
}
120+
td, th {
121+
font-size: 1.2em;
122+
border: 1px solid black;
123+
padding: 3px 7px 2px 7px;
124+
}
125+
th {
126+
font-size: 16px;
127+
text-align: left;
128+
padding-top: 5px;
129+
padding-bottom: 4px;
130+
}
131+
'''
132+
133+
134+
def element_string_lengths(elems):
135+
return [len(e.xpath('string()')) for e in elems]
136+
137+
138+
class ResultSummary():
139+
140+
def __init__(self, result):
141+
doc = lxml.html.fragment_fromstring(result.diff_html)
142+
insertions = doc.xpath('//ins')
143+
insertion_lengths = element_string_lengths(insertions)
144+
deletions = doc.xpath('//del')
145+
deletion_lengths = element_string_lengths(deletions)
146+
self.insertions = sum(insertion_lengths)
147+
self.insertion_blocks = len(insertions)
148+
self.deletions = sum(deletion_lengths)
149+
self.deletion_blocks = len(deletions)
150+
pass
151+
152+
153+
def make_summary_row(test, result):
154+
def data(suffix):
155+
return os.path.join('..', TEST_DATA_PATH, test.name + suffix)
156+
def output(suffix):
157+
return test.name + suffix
158+
if test.enabled:
159+
s = ResultSummary(result)
160+
return B.TR(
161+
B.TD(test.name),
162+
B.TD('%d (%d)' % (s.insertions, s.insertion_blocks)),
163+
B.TD('%d (%d)' % (s.deletions, s.deletion_blocks)),
164+
B.TD(
165+
B.A('original', href = data(ORIGINAL_SUFFIX)),
166+
' ',
167+
B.A('benchmark', href = output(READABLE_SUFFIX)),
168+
' ',
169+
B.A('result', href = output(RESULT_SUFFIX)),
170+
' ',
171+
B.A('diff', href = output(DIFF_SUFFIX))
172+
)
173+
)
174+
else:
175+
return B.TR(
176+
B.CLASS('skipped'),
177+
B.TD('%s (SKIPPED)' % test.name),
178+
B.TD('N/A'),
179+
B.TD('N/A'),
180+
B.TD('N/A')
181+
)
182+
183+
184+
def make_summary_doc(tests_w_results):
185+
tbody = B.TBODY(
186+
B.TR(
187+
B.TH('Test Name'),
188+
B.TH('Inserted (in # of blocks)'),
189+
B.TH('Deleted (in # of blocks)'),
190+
B.TH('Links')
191+
)
192+
)
193+
for (test, result) in tests_w_results:
194+
row = make_summary_row(test, result)
195+
tbody.append(row)
196+
return B.HTML(
197+
B.HEAD(
198+
B.TITLE('Readability Test Summary'),
199+
B.STYLE(SUMMARY_CSS, type = 'text/css')
200+
),
201+
B.BODY(
202+
B.TABLE(
203+
tbody
204+
)
205+
)
206+
)
207+
208+
209+
def write_summary(path, tests_w_results):
210+
doc = make_summary_doc(tests_w_results)
211+
with open(path, 'w') as f:
212+
f.write(lxml.html.tostring(doc))
101213

102214

103215
CSS = '''
@@ -158,6 +270,7 @@ def write_output_fragment(fragment, output_dir_path, test_name, suffix):
158270
def write_result(output_dir_path, result):
159271
test_name = result.test_data.test.name
160272
specs = [
273+
(result.test_data.rdbl_html, READABLE_SUFFIX),
161274
(result.diff_html, DIFF_SUFFIX),
162275
(result.result_html, RESULT_SUFFIX)
163276
]
@@ -176,12 +289,13 @@ def print_test_info(test):
176289
def run_readability_tests():
177290
files = os.listdir(TEST_DATA_PATH)
178291
tests = load_readability_tests(TEST_DATA_PATH, files)
179-
for test in tests:
292+
test_datas = [load_test_data(t) for t in tests]
293+
results = [execute_test(t) for t in test_datas]
294+
for (test, result) in zip(tests, results):
180295
print_test_info(test)
181-
if test.enabled:
182-
test_data = load_test_data(test)
183-
result = execute_test(test_data)
296+
if result:
184297
write_result(TEST_OUTPUT_PATH, result)
298+
write_summary(TEST_SUMMARY_PATH, zip(tests, results))
185299

186300
def main():
187301
if len(sys.argv) > 1 and sys.argv[1] == 'unittest':

0 commit comments

Comments
 (0)