Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Генерация allure report с помощью allure-cli и pytest

pytest
allure
python
Теги: #<Tag:0x00007fedc001f7d8> #<Tag:0x00007fedc001f4b8> #<Tag:0x00007fedc001f198>

(Andrew Zakordonets) #1

Я пытаюсь сгенерировать Allure report для наших py.test тестов. В документации указано что pytest adapter поддерживает только версию Allure 1.4.x . Allure-cli пытается сгенерировать репорт версии 2.0 и логично что у него это не получается. Я так и не смог найти быстро информацию о том как использовать allure-cli для версии 1.4.х

pytest-allure-adaptor 1.7.7
allure-cli version 2.3.1
python3

После генерации с текущим сетапом получаю репорт где все табы на странице отображаются с сообщением 404 Not found.

Я так понимаю что мне нужна более старая версия allure-cli или же нужно cli сказать что бы он генерировал репорт в старом формате.

Может @vania_pooh сможет оперативно подсказать ?


(Yaroslav Pernerovskyy) #2

Если открывать репорт в Фаерфоксе, такая же фигня?


Allure - подборка типичных проблем возникающих в процессе использования и их решения
(Artem Eroshenko) #3

@biercoff, нет allure 2.* полностью совместим со старыми адаптерами.
выполни команду:
allure serve path/to/allure-results


(Andrew Zakordonets) #4

@eroshenkoam к сожалению у меня отображается пустой отчет с Nan значениями . Вот пример xml файла который генерируется с помощью команды :

py.test  --alluredir report

<ns0:test-suite xmlns:ns0="urn:model.allure.qatools.yandex.ru" start="1501622494609" stop="1501622520147">
  <name>functional_tests.test_name</name>
  <labels/>
  <test-cases>
    <test-case start="1501622494609" status="passed" stop="1501622498914">
      <name>test_invalid_inputs_for_insurance_start_date[]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622498653" status="passed" stop="1501622498854">
          <name>enter &lt;pages.test_name.test_nameobject at 0x11147ee10&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x11147ee10&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622498854" status="passed" stop="1501622498914">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
    <test-case start="1501622498979" status="passed" stop="1501622501500">
      <name>test_invalid_inputs_for_insurance_start_date[123123123]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622501265" status="passed" stop="1501622501442">
          <name>enter &lt;pages.test_name.test_nameobject at 0x1115c3198&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x1115c3198&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622501442" status="passed" stop="1501622501500">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
    <test-case start="1501622501562" status="passed" stop="1501622504132">
      <name>test_invalid_inputs_for_insurance_start_date[-12.10.2017]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622503898" status="passed" stop="1501622504074">
          <name>enter &lt;pages.test_name.test_nameobject at 0x11149af28&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x11149af28&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622504074" status="passed" stop="1501622504132">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
    <test-case start="1501622504193" status="passed" stop="1501622506763">
      <name>test_invalid_inputs_for_insurance_start_date[hello world]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622506532" status="passed" stop="1501622506708">
          <name>enter &lt;pages.test_name.test_nameobject at 0x1115c3588&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x1115c3588&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622506708" status="passed" stop="1501622506763">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
    <test-case start="1501622506823" status="passed" stop="1501622509332">
      <name>test_invalid_inputs_for_insurance_start_date[12102017]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622509101" status="passed" stop="1501622509277">
          <name>enter &lt;pages.test_name.test_nameobject at 0x1115d6320&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x1115d6320&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622509277" status="passed" stop="1501622509332">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
    <test-case start="1501622509393" status="passed" stop="1501622512080">
      <name>test_invalid_inputs_for_insurance_start_date[12-10-2017]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622511821" status="passed" stop="1501622512020">
          <name>enter &lt;pages.test_name.test_nameobject at 0x1115cc128&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x1115cc128&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622512020" status="passed" stop="1501622512079">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
    <test-case start="1501622512143" status="passed" stop="1501622514730">
      <name>test_invalid_inputs_for_insurance_start_date[12.10.2017]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622514485" status="passed" stop="1501622514675">
          <name>enter &lt;pages.test_name.test_nameobject at 0x1115d65f8&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x1115d65f8&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622514675" status="passed" stop="1501622514730">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
    <test-case start="1501622514793" status="passed" stop="1501622517317">
      <name>test_invalid_inputs_for_insurance_start_date[12.10.17]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622517068" status="passed" stop="1501622517261">
          <name>enter &lt;pages.test_name.test_nameobject at 0x1115cc198&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x1115cc198&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622517261" status="passed" stop="1501622517317">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
    <test-case start="1501622517378" status="passed" stop="1501622520147">
      <name>test_invalid_inputs_for_insurance_start_date[12.10.2017 10:20]</name>
      <attachments/>
      <labels>
        <label name="severity" value="normal"/>
        <label name="thread" value="30838-MainThread"/>
        <label name="host" value="azakordonets"/>
      </labels>
      <steps>
        <step start="1501622519911" status="passed" stop="1501622520093">
          <name>enter &lt;pages.test_name.test_nameobject at 0x1115c32b0&gt; as field name</name>
          <title>enter &lt;pages.test_name.test_nameobject at 0x1115c32b0&gt; as field name</title>
          <attachments/>
          <steps/>
        </step>
        <step start="1501622520093" status="passed" stop="1501622520147">
          <name>Check that error message is displayed</name>
          <title>Check that error message is displayed</title>
          <attachments/>
          <steps/>
        </step>
      </steps>
    </test-case>
  </test-cases>
</ns0:test-suite>

После этого я выполняю

allure generate -c
allure-results does not exists
send analytics
Report successfully generated to allure-report

И на выходе у меня :


Создается пустой отчет Allure после прохождения тестов
(Ильдар Бекмансуров) #5

Подтверждаю, у меня так же.
Python 3.5.1, pytest-3.1.3, allure-cli-2.3.1, pytest-allure-adaptor-1.7.7


(Artem Eroshenko) #6

Это означает что вы указываете директорию в которой нет результатов allure.

  1. Запускаем тесты и убеждаемся что есть директория allure-results в которой есть результаты тестов:
    ls allure-results - тут есть файлы
  2. Генерируем отчет allure serve allure-results.

(Ильдар Бекмансуров) #7

я запускаю из директории bin следующей командой:
allure generate C:\...\reports\report_mobile -o C:\...\reports\report_mobile (то есть результат помещаю в ту же директорию)
Вот что мне отвечает: Allure: Target directory C:\...\reports\report_mobile for the report is already in use, add a '--clean' option to overwrite

Соответственно запускаю ту же команду, но с --clean и получаю

C:\...\reports\report_mobile does not exists
send analytics
Report successfully generated to C:\...\reports\report_mobile

Отчет пустой, то есть директория зачищается и потом уже естественно не из чего строить отчет.

Вопрос, почему в самом начале при запуске мне выдаётся Target directory C:\...\reports\report_mobile for the report is already in use. С прошлым аллюром я делал все то же самое и работало.


(Andrew Zakordonets) #8

Вот моя последовательность шагов ( может я что то упускаю ? ) :
> py.test --alluredir reports

cd reports
ls -la 
    .
    ..
    package-lock.json
    49332177-7539-48dd-a2d8-c8f83d78d617-testsuite.xml    
allure generate
    allure-results does not exists
    send analytics
    Report successfully generated to allure-report
la
    .
    ..
    package-lock.json
    allure-report
    49332177-7539-48dd-a2d8-c8f83d78d617-testsuite.xml

Внутри allure-report лежит отчет , скриншот которого я уже указывал


(Artem Eroshenko) #9

Локально вот так лучше сделать

py.test --alluredir reports
allure serve reports

Можно сделать вот так

py.test --alluredir reports
allure generate reports

(Andrew Zakordonets) #10

Сделал
allure generate reports
Получил пустой репорт с 404 ошибкой.


(Ильдар Бекмансуров) #11

В общем у меня получилось сделать, если результат помещать не в ту же директорию в которой xml.
Если в ту же, то получаю Target directory for the report is already in use.


(Artem Eroshenko) #12

Выполни, пожалуйста, команду allure serve reports


(Artem Eroshenko) #13

не нужно результаты помещать в ту же директорию.
Есть результаты, по ним строится отчет.


(Andrew Zakordonets) #14

Allure server заработал :slight_smile: Вопрос тогда в следующем - как мне этот отчет сохранить ?


(Artem Eroshenko) #15

Все работало и так. allure serve поднимает web-сервер, вот и вся разница.
Некоторые браузеры (например, chrome) блокируют доступ из браузера к локальным json файлам.
Когда поднят web-сервер такой проблемы нет.

Можно настроить chrome или использовать другой браузер.


(Andrew Zakordonets) #16

Пока жив http сервер который поднимает allure serve, я могу читать отчет. Как только я убиваю сервер, то открытие того же отчета из /var/folders/t6/bwm48vv112n2vn943c825t980000gp/T/7567737615297653314/allure-report дает мне пустой отчет с 404 ошибкой.


(Artem Eroshenko) #17

Откройте отчет в Firefox


(Andrew Zakordonets) #18

Да, только что прочитал сообщение. Работает. Спасибо большое за оперативную помощь


(Artem Eroshenko) #19

Отчет не пустой, просто chrome вредный)


(Artem Eroshenko) #20

С тебя лайк :slight_smile:

ПС: это шутка