воскресенье, 30 марта 2014 г.

Как легко получить JUnit-отчеты в Django

Хороший все-таки фреймворк Django, удобный,  постоянно улучшающийся и развивающийся, отлично документированный и так далее.
Но есть у него как минимум одно место, которое некоторых разработчиков и тестировщиков не очень устраивает - это фреймворк для написания автотестов.
Разработчикам автотестов Django предлагает свой wrapper стандартного питоновского фреймворка PyUnit ( unittest ). Причем до версии django 1.6 у этой надстройки был один недостаток - довольно неудобное обнаружение автотестов (test discovey).
В версии этот недостаток устранили и мы получили возможность гибкой организации автотестов за счет более продвинутого их обнаружения джанговским запускальщиком тестов (test runner).

Но остался нерешенным еще один "недостаток". А именно невозможность "из коробки" генерировать отчеты о прогонах автотестов  в JUnit xml-формате . Это довольно странно, особенно ввиду большого числа CI-решений, которым нужен такой формат: jenkins/hudson, bamboo etc...

Для предыдущих версий django cторонние django-разработчики успели реализовать несколько приложений для решения задачи получения xml-отчета. Большинство этих приложений не работают с 1.6 версией и должны быть соответствующим образом доработаны.

Мы ждать не хотим, писать свое нет времени и ресурсов. Поэтом нам на помощь приходит никто иной как pytest. С его помощью можно генерировать junit-отчеты безо всякого изменения настроек django-проекта и без изменений в имеющихся автотестах. 

Для этого надо:
  1. поставить pytest-django
  2. для запуска тестов использовать py.test вместо django-ского  manage.py test ...
pip install pytest-django
cd /path/to/django/project
py.test --ds=DJANGO_SETTINGS_MODULE --junitxml=/path/to/junit/xml/report
Получив xml-отчет мы можем уже отображать его в любом CI-решении, которому нужен junit-формат. Например,  в bamboo  - используем встроенный компонент JUnit Parser, указав  в его параметрах , где искать xml-отчет о прогоне автотестов. Таким образом, мы можем использовать всю мощь и гибкость py.test и продолжать при этом писать тесты с помощью встроенных в django механизмов.
К слову, можно и сами django-тесты  писать в py.test - стиле. Но лично мне формат PyUnit нравится больше.

Ссылки по теме: