Формирование собственного html отчета с результатами тестирования с помощью py.test

В ходе создания системы автотестов назрел вопрос рассылки красивых html отчетов с результатами тестирования. Запускаю тесты с помощью py.test, формирую xml отчет с помощью плагина junitxml, потом этот отчет отображает jenkins.

Решила сделать свой собственный отчет, используя данные полученного xml файла. Но хотелось бы там видеть и дату формирования отчета, и как-то сохранять там входные данные теста (в полученном xml файле этого нет) и может даже добавить краткое описание теста (что проверяем).

Может вы мне подскажете, как это можно добавить в junitxml, чтобы при формировании xml добавлялись эти строки? Или только редактировать исходный xml самой, а потом уже преобразовывать его в отчет?

В общем тема отчетов для меня сейчас очень-очень актуальна :slight_smile: Очень интересно какие шаблоны отчетов используете вы.

А что если при формировании html отчета вы будете основываться не только на xml, но и залазить в исходные данные, смотреть дату запуска тестов и все это выдавать уже в отчете.

Ну это почти тот же вариант, что добавлять эту дату и прочее в xml, а потом делать xslt преобразование, разве нет?. И подскажите, пожалуйста, где смотреть дату запуска тестов.

Вообще по большому счету хочется исправить один раз junitxml плагин, чтобы включались нужные данные, а не править каждый раз xml файл. Но не знаю как там правильно это сделать ((

Не смотря на то, что я когда-то сам игрался с XSLT преобразованиями для NUnit – скажу, что этот путь чрезвычайно ресурсоемкий и ограниченный.
Вместо этого, предлагаю создать отдельный класс, который бы писал логи в обычном текстовом формате:

#TestCase: Name
#TestId: Id001
#Steps:
S: Step1
E: Expected1
S: Step2
E: Expected  
---

Такие текстовые файлы читабельны сами по себе и очень легко парсятся и преобразовываются в HTML. Кроме того, в самом логировании, вы можете, например, использовать Markdown, что даст возможность сохранять читабельность в Блокноте + преобразовывать в HTML

тут есть несколько вариантов

  1. считать xml и переформатировать его с помощью средств python уже после формирования самого отчета 19.7. xml.etree.ElementTree — The ElementTree XML API — Python 2.7.18 documentation
  2. сделать тоже самое что и первый пункт только через http://lxml.de/ или же с подключением xslt трансформации
  3. можно посмотреть py.test и написать свой плагин который будет выполнять нужные изменения https://bitbucket.org/hpk42/pytest/src/5ac2e164e7b41350274ce40f0495f82817e3c68c/_pytest/junitxml.py (как работать с плагинами можно посмотреть тут How to install and use plugins — pytest documentation)
  4. можно сделать monkey patching т.е. поменять конкретный плагин у себя на машине. Нужно просто найти _pytest/junitxml.py и поменять нужную вам логику

Не знаешь как сделать код? Или что поменять в коде? Или от куда взять дату формирования отчета?

Не знаю как поменять это в коде, дату собиралась подставить текущую.

Спасибо большое за совет, попробую и этот вариант.

Михаил, большое спасибо, буду пробовать.

можешь вставить небольшой xml junit отчет и подсветить, куда именно ты хочешь вставить дату, чтобы я мог подсказать что тебе нужно исправить?

<?xml version="1.0" encoding="utf-8" ?> 
<testsuite errors="0" failures="0" name="" skips="0" tests="1" time="14.433" **date="DD/MM/GGGG"**>
 <testcase classname="test_UCC_Gateways" name="test_ext_page" time="7.12800002098" />
</testsuite>

Пример приложить можете?

Кривовато получилось вставить )) дата как атрибут testsuite, выделена **

Скажите, пожалуйста, а чем Markdown и текстовый формат, предпочтительнее логирования в xml формате, если так же формировать свой xml файл, а не использовать плагин py.test?

как код нужно вставлять можно почитать тут Ответы на вопросы - automated-testing.info

Нужно в файле <путь к python инсталяции>\Lib\site-packages_pytest\junitxml.py добавить формирование аттрибута через конструктор. В общем это всего одна строка :smile: Так как xml елементы и аттрибуты формируются автоматически на основании существующих аттрибутов экземпляра класса.

        logfile.write('<?xml version="1.0" encoding="utf-8"?>')
        logfile.write(Junit.testsuite(
            self.tests,
            name="",
            errors=self.errors,
            failures=self.failed,
            skips=self.skipped,
            tests=numtests,
            time="%.3f" % suite_time_delta,
            my_created_time=time.time()
        ).unicode(indent=0))
        logfile.close()

Тут я добавил новый аттрибут к элементу в xml. И после запуска теста

py.test --junitxml=output.xml sample.py

в результате мы получаем вот такой вот xml

<?xml version="1.0" encoding="utf-8"?>
<testsuite errors="0" failures="0" my_created_time="1380277811.32" name="" skips="0" tests="1" time="0.019">
    <testcase classname="sample" name="test_sometuion" time="0.0"/>
</testsuite>

Как видим my_created_time="1380277811.32" добавился отлично в отчет.

Нужно просто понимать цель, чего вы хотите от логирования. Если получить читабельные логи, то можно в каждом тесте делать описание в виде html или markdown (который тоже очень читабельный) и потом на основании этих описаний строить отчет.

Я когда-то помогал делать похожую задачу одной компании. Пример можно посмотреть тут http://poliarush.com/working/development/logging-and-decorators-in-python.html Это не совсем то, что вам нужно, но думаю ход мысли понятен. Описываем все методы через docstrings и потом их читаем, когда нужно и формируем отчет.

Спасибо большое, вставить дату-время получилось. Теперь по аналогии попробую добавить атрибуты testcase. А вообще тема интересная, попробую разные варианты, как будут результаты обязательно тут отпишусь и покажу отчеты.

Обязательно будем ждать.