.. image:: https://travis-ci.org/django-functest/django-functest.png?branch=master
.. image:: https://coveralls.io/repos/django-functest/django-functest/badge.svg?branch=master&service=github
.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
Helpers for creating high-level functional tests in Django, with a unified API
for WebTest and Selenium tests.
The full documentation is at https://django-functest.readthedocs.org.
pip install django-functest
See also the `dependencies documentation
for important compatibility information.
* A simplified API for writing functional tests in Django (tests that check the
behaviour of entire views, or sets of views, e.g. a checkout process).
* A unified API that abstracts over both `WebTest
<http://webtest.pythonpaste.org/en/latest/>`_ and `Selenium
<https://pypi.python.org/pypi/selenium>`_ - write two tests at once!
* Many of the gotchas and difficulties of using WebTest and Selenium ironed out
* Well tested - as well as its own test suite, which is run against Firefox,
Chrome, and PhantomJS, it is also used by `Wolf & Badger
<https://www.wolfandbadger.com/>`_ for tests covering many business critical
In your tests.py::
from django.test import LiveServerTestCase, TestCase
from django_functest import FuncWebTestMixin, FuncSeleniumMixin, FuncBaseMixin
self.assertTextPresent("Thanks for your message")
class ContactWebTest(FuncWebTestMixin, TestCase):
class ContactSeleniumTest(FuncSeleniumMixin, LiveServerTestCase):
In this way, you can write a single test with a high-level API, and run it in
two way - using a fast, WSGI-based method which emulates typical HTTP usage of a
Under the hood, the WSGI-based method uses and builds upon `WebTest
<http://webtest.pythonpaste.org/en/latest/>`_ and `django-webtest
django-functest provides its functionality as mixins, so that you can have your
own base class for tests.
To run the tests::
(myenv) $ ./setup.py develop
(myenv) $ ./runtests.py
Or, to run on all environments::
pip install tox
Firefox tests are currently failing due to incompatibilities with recent
Firefox versions (>= 47) and all published versions of Selenium (< 3.0).
This can be worked around by downloading an old version of Firefox from
using ``runtests.py --firefox-binary``
This library was built by developers at `Wolf & Badger
<https://www.wolfandbadger.com/>`_, released with the kind permission of that
Tools used in rendering this package:
.. _Cookiecutter: https://github.com/audreyr/cookiecutter
.. _`cookiecutter-djangopackage`: https://github.com/pydanny/cookiecutter-djangopackage
* Made :meth:`~django_functest.FuncCommonApi.get_literal_url` accept
absolute URLs for Selenium (WebTest already worked by accident).
* Added :meth:`~django_functest.FuncCommonApi.new_browser_session` and
:meth:`~django_functest.FuncCommonApi.switch_browser_session` to the common
API. These can be used to simulate multiple devices or users accessing the
site. See the docs for important usage information.
* Fix for scrolling to exactly the right place.
* Added docstrings everywhere, and a base class you can inherit from
for the purpose of providing autocomplete help.
* Django 1.10 compatibility
* Fixed performance/reliability issue caused by browsers attempting
to retrieve ``/favicon.ico`` after visiting ``emptypage``.
* Fixed bug where elements wouldn't scroll into view if html height is set to
* New method :meth:`~django_functest.FuncSeleniumMixin.get_webdriver_options`
for customizing WebDriver behaviour.
* Added get_session_data()
* Improved reliability of ``FuncSeleniumMixin.get_literal_url()``
* Allow ``<select>`` elements to be set using integers for values.
* Fixed issues with ``.value()`` for radio buttons and text areas
* Fixed bug with setting radio buttons when there are more than
one set of radio buttons in the form.
* Added support for file uploads
* Support for filling radio buttons
* More convenient support for quotes and apostrophes (" ') in text assertion methods.
* Fixed wheel building - again!
* Fixed packaging bug that caused wheels to fail on Python 3.
* First release on PyPI.
TODO: Brief introduction on what you do with files - including link to relevant help section.