Allure Pytest Adaptor
=====================

.. image:: https://travis-ci.org/allure-framework/allure-python.svg?branch=master
        :alt: Build Status
        :target: https://travis-ci.org/allure-framework/allure-python/
.. image:: https://pypip.in/v/pytest-allure-adaptor/badge.png
        :alt: Release Status
        :target: https://pypi.python.org/pypi/pytest-allure-adaptor
.. image:: https://pypip.in/d/pytest-allure-adaptor/badge.png
        :alt: Downloads
        :target: https://pypi.python.org/pypi/pytest-allure-adaptor

This repository contains a plugin for ``py.test`` which automatically prepares input data used to generate ``Allure Report``.
**Note:** this plugin currently supports only Allure 1.4.x series.

Installation and Usage
======================
.. code:: python

 py.test --alluredir [path_to_report_dir]
 # WARNING [path_to_report_dir] will be purged at first run


This plugin gets automatically connected to ``py.test`` via ``entry point`` if installed.

Connecting to IDE:

.. code:: python

 pytest_plugins = 'allure.pytest_plugin',\


Allure Features
===============

Attachments
===========

To attach some content to test report:

.. code:: python

 import allure

 def test_foo():
     allure.attach('my attach', 'Hello, World')


Steps
=====

To divide a test into steps:

.. code:: python

 import pytest

 def test_foo():
     with pytest.allure.step('step one'):
         # do stuff

     with pytest.allure.step('step two'):
         # do more stuff


Can also be used as decorators. By default step name is generated from method name:

.. code:: python

 import pytest

 @pytest.allure.step
 def make_test_data_foo():
     # do stuff

 def test_foo():
     assert make_some_data_foo() is not None

 @pytest.allure.step('make_some_data_foo')
 def make_some_data_bar():
     # do another stuff

 def test_bar():
     assert make_some_data_bar() is not None


Steps can also be used without pytest. In that case instead of ``pytest.allure.step`` simply use ``allure.step``:

.. code:: python

 import allure

 @allure.step('some operation')
 def do_operation():
     # do stuff


Steps support is limited when used with fixtures.


Severity
========

Any test, class or module can be marked with different severity:

.. code:: python

 import pytest

 @pytest.allure.severity(pytest.allure.severity_level.MINOR)
 def test_minor():
     assert False


 @pytest.allure.severity(pytest.allure.severity_level.CRITICAL)
 class TestBar:

     # will have CRITICAL priority
     def test_bar(self):
         pass

     # will have BLOCKER priority via a short-cut decorator
     @pytest.allure.BLOCKER
     def test_bar(self):
         pass


To run tests with concrete priority:

.. code:: rest

 py.test my_tests/ --allure_severities=critical,blocker


Issues
======
Issues can be set for test.

.. code:: python

 import pytest

 @pytest.allure.issue('http://jira.lan/browse/ISSUE-1')
 def test_foo():
     assert False


 import allure

 @allure.issue('http://jira.lan/browse/ISSUE-2')
 class TestBar:

     # test will have ISSUE-2 and ISSUE-3 label
     @allure.issue('http://jira.lan/browse/ISSUE-3')
     def test_bar1(self):
         pass

     # test will have only ISSUE-2 label
     def test_bar2(self):
         pass


Features & Stories
==================

Feature and Story can be set for test.

.. code:: python

 import allure


 @allure.feature('Feature1')
 @allure.story('Story1')
 def test_minor():
     assert False


 @allure.feature('Feature2')
 @allure.story('Story2', 'Story3')
 @allure.story('Story4')
 class TestBar:

     # will have 'Feature2 and Story2 and Story3 and Story4'
     def test_bar(self):
         pass


To run tests by Feature or Story:

.. code:: rest

 py.test my_tests/ --allure_features=feature1,feature2
 py.test my_tests/ --allure_features=feature1,feature2 --allure_stories=story1,story2


Environment Parameters
======================

You can provide test environment parameters such as report name, browser or test server address to allure test report.

.. code:: python

 import allure
 import pytest


 def pytest_configure(config):
     allure.environment(report='Allure report', browser=u'Я.Браузер')


 @pytest.fixture(scope="session")
 def app_host_name():
     host_name = "my.host.local"
     allure.environment(hostname=host_name)
     return host_name


 @pytest.mark.parametrize('country', ('USA', 'Germany', u'Россия', u'Япония'))
 def test_minor(country):
     allure.environment(country=country)
     assert country


More details about allure environment you can know from documentation_. 

.. _documentation: https://github.com/allure-framework/allure-core/wiki/Environment


Development
===========

Use ``allure.common.AllureImpl`` class to bind your logic to this adapter.
