WebDriver + Python: генерация отчетов

Здравствуйте, Михаил. Спасибо, что помогаете разбираться в вопросах :smile:

У меня есть конкретные вопросы по данному топику:

  1. Есть файл xml вида:

<?xml version="1.0" encoding="utf-8"?><testsuite errors="0" failures="0" name="pytest" skips="0" tests="3" time="35.840"><testcase classname="test_Log_in_Wrong_Login_Pin.Untitled" name="test_untitled" time="12.0495848656"/><testcase classname="test_Log_in_successful.Untitled" name="test_Log_in_successful" time="13.5066812038"/><testcase classname="test_Login_Error_all_inputs_empty.Untitled" name="test_all_inputs_empty" time="9.69774913788"/></testsuite>

И голый, ненастроенный Jenkins. Не понял, где его вставлять. Нужно ли какие-то плагины подключать?

  1. Создаем билд план и в настройках запуска указываем все те же команды py.test

2.1 Билд план = job?

2.2 Все те же команды - какие именно и где это вообще указывается? :smile:

Спасибо!

Нужно создать job. И в шагах после сборки выбрать Publish JUnit test result report, а там указать путь в который у вас xml ки падают.

1 лайк

Как указал @akim это настраивается в Publish JUnit test results. Я просто покажу картинку.

Вновь принялся за настройку Jenkins, сейчас застрял на процессе запуска команды py.test.

Что есть:

  • тесты на python + selenium WD + py.test. Из eclipse или просто из консоли все работает.

  • тесты в репозитории, там же в корне лежит xml, сгенерированная py.test’ом

  • плагины поставил такие: Jenkins Selenium Plugin, Python Plugin

  • настройки Job:

Ошибка при сборке такая:

Путь к интерпретатору пытался ручками прописать и оставить пустым, результат тот же. Зашел под юзером jenkins, запустил терминал, ввел py.test - запустился, работает.

Помогите, пожалуйста, разобраться :smile:

Такое ощущение, что python нет в системных путях.
Для того, чтобы проверить.
Попробуйте добавить папку python и python\scripts в системные пути, как шаг в дженкинсе.
Или же укажите полный путь к исполняемому файлу py.test

Как вы устанавливали py.test на сервер, где стоит jenkins?

Не знаю, как это делается, если честно.

Устанавливал через pip. Насколько я понимаю, папка py.test вот тут лежит /Library/Python/2.7/site-packages/ Там есть файл pytest.py

Если указать полный путь к pytest.py вот так:

http://puu.sh/6sIdl.png

То будет ошибка:

Под руками сейчас есть только windows, так что пример соответствующий, для windows это делается так

А вообще по правильному, в jenkins есть настройка переменных окружения, пару ссылок для расширения кругозора:

Так на ошибке сказана, что из под jenkins юзера нет прав на запуск файл. Т.е. нужно дать ему chmod 777, чтобы все могли запускать этот файл.

Помогло прописать вот такой путь в шаге сборки /usr/local/bin/py.test Буду копать дальше уже по ошибкам самих тестов :smile:

Решил попробовать Ваш пример, но у меня ничего не получилось.
Посмотрите пожалуйста, что я не так делаю?

Для начала попробуйте запустить свой тест напрямую ,а не как юнит тест. В PyCharm - это нажатие правой кнопке в блоке if __name__ == '__main__': и выбор старта, т.е. что-то типа ‘run test’
А вы запускаете в другом блоке, либо кнопкой сверху, она запускает 'Run Unittest in test()'
После этого отпишите какой результат либо скрин приложите, но мне кажется ,что проблема именно в этом

UPD! Проблема с моей стороны ,я неправильно пример оформил. Просто я переименовывал файл HTMLTestRunner в class_HTMLTestRunner. Поэтому в примере замените в строчке runner = class_HTMLTestRunner.HTMLTestRunner на runner = HTMLTestRunner.HTMLTestRunner

Запускал как и советовали.
Вылетала ошибка на HTMLTestRunner что нет модуля StringIO

Изменил в testrunner:

import StringIO

на

from io import StringIO

Сейчас при запуске ошибка

Так же хотелось бы узнать как указать директорию, куда сохранить отчет

Запускал как и советовали. Вылетала ошибка на HTMLTestRunner что нет модуля StringIO Изменил в testrunner: import StringIO на from io import StringIO (Python 3) Так же хотелось бы узнать как указать директорию, куда сохранить отчет

Ошибка повторяется даже после замены на runner = HTMLTestRunner.HTMLTestRunner

При таком запуске понятна ошибка. Вся проблема в том, что я пишу на питоне 2, у вас 3й. Там убрана функция file. Вместо нее необходимо использовать open() Built-in Functions — Python v3.0 documentation
Но честно сказать не знаю ,как будет происходить генерация отчетов под 3им питоном, возможно будут и другие ошибки.
По поводу нахождения отчета. Это и есть путь с названием “TestReport” + “_” + dateTimeStamp + “.html”
Т.е. в данном случае отчет сохранится в текущей директории. А вот так: “D://TestReport” + “_” + dateTimeStamp + “.html”, он сохранится на диске D. А вот так “…/TestReport” + “_” + dateTimeStamp + “.html”, он сохранится на директорию выше вашего скрипта

Пробовал с open() появилась другая ошибка
AttributeError: type object ‘_io.StringIO’ has no attribute ‘StringIO’
Изменил в HTMLTestReport
self.outputBuffer = StringIO.StringIO()
на self.outputBuffer = StringIO()
Вроде бы и ошибок нет. Но формируются пустые html файлы.
У меня вопрос. Должен ли мой предыдущий тест делать запись в отчет. Или этих тестов должно быть несколько?

Опять ошибки:
AttributeError: ‘dict’ object has no attribute ‘has_key’
Нашел “решение”
Python 2.7

print {“a”:1}.has_key(“a”)
True
Python 3

print({“a”:1}.has_key(“a”))

Traceback (most recent call last):
File “tmp.py”, line 1, in
print({“a”:1}.has_key(“a”))
AttributeError: ‘dict’ object has no attribute ‘has_key’

Python 3

print(“a” in {“a”:1})
True

Вообщем большая проблема с совместимостью HTMLTestRunner c Python 3
Может кто знает есть ли HTMLTestRunner с поддержкой Python 3?

Проблему решил слегка поправив HTMLTestRunner под Python 3
Некоторые ошибки все же остаются, но отчет строится вполне себе читабельный
Пример оставшейся ошибки

   Traceback (most recent call last):
  File "C:/Users/z.sejfulaev/Desktop/SeleniumFolder/com_logon_google/LoginInGmail.py", line 34, in <module>
    runner.run(suite)
  File "C:\Users\z.sejfulaev\Desktop\SeleniumFolder\com_logon_google\HTMLTestRunner.py", line 631, in run
    print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)
TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and '_io.TextIOWrapper'

Если отсановились на дженкинс, также рекомендую “хак”. Подключить к джобе JUnit Attachments Plugin

И в “делателе скриншотов” написать что-то типа:

print("Screenshot taken: {0} for url: {1}".format(file_name, driver.current_url))
print("[[ATTACHMENT|{path}]]".format(path=file_location))  # for jenkins integration

Если все верно настроили у конкретного теста будет Attachment

В сочетании, с Screenshot on Fail - вещь! :slight_smile:

2 лайка

А обязательно с помощью py.test или nose? Я только изучаю автоматизацию и пишу пока с помощью unittest

Можно так: GitHub - xmlrunner/unittest-xml-reporting: unittest-based test runner with Ant/JUnit like XML reporting.
Но лучше учитесь сразу на py.test, к нему можно прикрутить красивые отчеты Allure и возможностей там по более )

Мы для отчетов используем Allure Jenkins Plugin. Вот пример отчета. + библиотека для питона.