Проект, над которым я сейчас работаю, запускает тесты для оборудования на сервере. Эти тесты записывают в файлы журналов и файл отчета (сводная информация о выполнении теста). Теперь я добавляю функциональность, чтобы также написать файл отчета в виде HTML. Цель состоит в том, чтобы сделать HTML-версию очень похожей на файл отчета .txt. Это также означает форматирование стековых трасс.
Причиной html-отчета является то, что я могу создавать ссылки на определенные файлы или изображения, если, скажем, тест прошел не так.
Редактировать: функция, в которую я пишуfile:
def end_run(self, current_run, total_runs, errors, statistics):
# this breakline correctly writes to file
self.file.write("<br>")
# this breakline correctly writes to file
self.file.write(self.width * "=" + "<br>")
for e in errors:
# this breakline correctly writes to file
exception = "Exception #%d: (%s) %s<br>  Stacktrace: " % (e.seq_nr,
e.exception.__class__.__name__,
str(e.exception))
# HERE I FORMAT
exception += r" ".join(self.format_stacktrace(traceback.format_list(e.traceback)))
# SHOWS <br> tags
print exception
# THIS WRITE DOES NOT WRITE <br> tag
self.file.write(exception)
if e.occurances > 1:
# this breakline correctly writes to file
self.file.write(" (occured %d times)<br>" % (e.occurances))
else:
# this breakline correctly writes to file
self.file.write("<br>")
if len(e.parameter_set) > 0:
# this breakline correctly writes to file
self.file.write("Active parameter set:<br>")
for k, v in e.parameter_set.items():
# this breakline correctly writes to file
self.file.write(" %-20s: %s<br>" % (str(k), str(v)))
self.file.write("Traceback:<br>")
traceback.print_list(e.traceback, file=self.file)
# this breakline correctly writes to file
self.file.write(self.width * "-" + "<br>")
self.file.write(self.html_end)
# flush after printing the exception tracebacks so the file will be updated
self.file.flush()
Функция форматирования:
def format_stacktrace(self, stacktrace):
"""
formats stack trace for html.
@param stacktrace: stacktrace already formatted by traceback.format_list(stacktrace)
"""
return map(lambda x: x.replace("\n", "<br>"), stacktrace)
оператор вывода выводит следующее:
' File "../common/ip/pyart/testrunner.py", line 259, in _run_function<br /> function(**parameter_set)<br />'
' File "../common/ip/pyart/testrunner.py", line 96, in __call__<br /> return getattr(self._function.im_self, self._function.func_name)(**self._parameter_set)<br />'
' File "testcases/art/case_270_video_dvi_edid.py", line 87, in test_000_set_and_clear_edid_resolution<br /> self.fail("test")<br />'
Что кажется правильным, но некоторые <br />
отсутствуют в конечном html-файле.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf_8">
<title>Basic Report</title>
<meta name="author" content="Technolution">
</head>
<body style="font-family: courier">Starting suite 'SigmaXG Testcases'<br>  Starting case 'EDID test case'<br>    Running test 'set and clear EDID to video source for 1920x1080p60.0'................................................... <a href="exception_log_1.txt">FAIL (#1)</a><br>  Ending case (FAIL: 1 tests failed)<br>Ending suite (FAIL: 1 test cases failed)<br><br>================================================================================================================================================================<br>Exception #1: (PyARTTestFailException) test<br> 
<!-- relevant part --> Stacktrace: File "../common/ip/pyart/testrunner.py", line 259, in _run_function
function(**parameter_set)
File "../common/ip/pyart/testrunner.py", line 96, in __call__
return getattr(self._function.im_self, self._function.func_name)(**self._parameter_set)
File "testcases/art/case_270_video_dvi_edid.py", line 87, in test_000_set_and_clear_edid_resolution
self.fail("test")
<br>Active parameter set:<br> input_mode : 1920x1080p60.0<br>Traceback:<br> File "../common/ip/pyart/testrunner.py", line 259, in _run_function
function(**parameter_set)
File "../common/ip/pyart/testrunner.py", line 96, in __call__
return getattr(self._function.im_self, self._function.func_name)(**self._parameter_set)
File "testcases/art/case_270_video_dvi_edid.py", line 87, in test_000_set_and_clear_edid_resolution
self.fail("test")
----------------------------------------------------------------------------------------------------------------------------------------------------------------<br></body></html>
Например, тег <br />
между function(**parameter_set)
и File ...
отображается в выводе на печать, но не в результирующем HTML-файле. Что мне здесь не хватает?