Skip to main content

Helpers for creating functional tests in Django, with a unified API for WebTest and Selenium tests.

Project description

https://github.com/django-functest/django-functest/workflows/Python%20package/badge.svg https://readthedocs.org/projects/django-functest/badge/?version=latest

Helpers for creating high-level functional tests in Django, with a unified API for WebTest and Selenium tests.

Exploring django-functest makes me angry! Why? Because I’ve wasted so much time writing low-level, boilerplate-filled tests for the past few years instead of using it — jerivas

What is WebTest? Imagine a text-based, HTML-only browser that doesn’t load CSS, Javascript etc, operates directly on a WSGI interface in a synchronous fashion for performance and robustness, and is controlled programmatically.

What is Selenium? A tool that opens full browsers like Firefox and Chrome (with an isolated profile), and provides an API for controlling them.

For an idea of what writing tests with django-functest looks like in practice, you might be interested in the video in our writing tests interactively documentation.

Documentation

The full documentation is at https://django-functest.readthedocs.org.

Installation

Python 3.8 and later, Django 2.2 and later are required.

pip install django-functest

See also the dependencies documentation for important compatibility information.

Features

  • 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 and Selenium - write two tests at once!

  • Many of the gotchas and difficulties of using WebTest and Selenium ironed out for you.

  • Well tested - as well as its own test suite, which is run against Firefox and Chrome, it is also used by Wolf & Badger for tests covering many business critical functionalities.

  • Supports running with pytest (using pytest-django) as well as Django’s manage.py test

Typical usage

In your tests.py:

from django.test import LiveServerTestCase, TestCase
from django_functest import FuncWebTestMixin, FuncSeleniumMixin, FuncBaseMixin


class ContactTestBase(FuncBaseMixin):
    # Abstract class, doesn't inherit from TestCase

    def test_contact_form(self):
        self.get_url("contact_form")
        self.fill(
            {
                "#id_name": "Joe",
                "#id_message": "Hello",
            }
        )
        self.submit("input[type=submit]")
        self.assertTextPresent("Thanks for your message")


class ContactWebTest(ContactTestBase, FuncWebTestMixin, TestCase):
    pass


class ContactSeleniumTest(ContactTestBase, FuncSeleniumMixin, LiveServerTestCase):
    pass

In this way, you can write a single test with a high-level API, and run it in two ways - using a fast, WSGI-based method which emulates typical HTTP usage of a browser, and using a full browser that actually executes Javascript (if present) etc.

The approach taken by django-functest is ideal if your web app is mostly a “classic” app with server-side rendered HTML combined with a careful sprinkling of Javascript to enhance the UI, which you also need to be able to test. If such an approach seems old-fashioned to you, have a look at htmx.org or hotwire and get with the new kids! (OK most of are actually quite old but we make fast web sites…)

Under the hood, the WSGI-based method uses and builds upon WebTest and django-webtest.

django-functest provides its functionality as mixins, so that you can have your own base class for tests.

Contributing and tests

See CONTRIBUTING.rst for information about running the test suite and contributing to django-functest.

Building on Mac OS

While this lxml bug is in effect lxml cannot handle certain unicode characters in HTML (or XML!) documents on Mac OS, including the emoji used in one of the files in the test suite.

Therefore, if you are affected by this bug, you will find that certain tests fail with the error lxml.etree.ParserError: Document is empty.

You will also find that lxml’s own test suite fails on your machine.

A workaround is to compile libxml2 yourself, which lxml will take care of for you. To do this, run the following:

` STATICBUILD=true python -m pip install lxml --force-reinstall --no-binary=:all: `

Credits

This library was written originally by spookylukey, further improved by developers at Wolf & Badger, and released with the kind permission of that company.

Tools used in rendering this package:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_functest-1.6.2.tar.gz (78.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_functest-1.6.2-py3-none-any.whl (25.4 kB view details)

Uploaded Python 3

File details

Details for the file django_functest-1.6.2.tar.gz.

File metadata

  • Download URL: django_functest-1.6.2.tar.gz
  • Upload date:
  • Size: 78.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.0

File hashes

Hashes for django_functest-1.6.2.tar.gz
Algorithm Hash digest
SHA256 c0e7f74722500b77def45dcba21a4ec9b8e8697c17775b47ab7b0d89b43db71f
MD5 895f135d8e6f5b1ddb7b2d19e95a6400
BLAKE2b-256 920d0b240210c4fd70511b209e881b9873cb265ea2ad27502ad8746a5bc16708

See more details on using hashes here.

File details

Details for the file django_functest-1.6.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_functest-1.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 2f437ea8d46ecde4bef0a8c0336b600d74292734512ecbad452dc687e8094159
MD5 4900a7785a41506de68a9d21eefc105c
BLAKE2b-256 0f3186a4ad9619df380c4975b9f732ad2245486fb693898c36c6f7aec27672f0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page