Формат трассировки стека в HTML в Python - PullRequest
1 голос
/ 09 октября 2019

Проект, над которым я сейчас работаю, запускает тесты для оборудования на сервере. Эти тесты записывают в файлы журналов и файл отчета (сводная информация о выполнении теста). Теперь я добавляю функциональность, чтобы также написать файл отчета в виде 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>&ensp; 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>&emsp;&emsp;Starting case 'EDID test case'<br>&emsp;&emsp;&emsp;&emsp;Running test 'set and clear EDID to video source for 1920x1080p60.0'................................................... <a href="exception_log_1.txt">FAIL (#1)</a><br>&emsp;&emsp;Ending case (FAIL: 1 tests failed)<br>Ending suite (FAIL: 1 test cases failed)<br><br>================================================================================================================================================================<br>Exception #1: (PyARTTestFailException) test<br>&ensp; 

<!-- 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-файле. Что мне здесь не хватает?

...