Skip to main content

Flask EZ Test

Making flask app’s that serve html and use a flasksqlalchemy backend engine easier to test

Setup

$ pip install flaskeztest3

Make sure you set the environemnt variable FLASK_APP to the file path of your main app module

$ export FLASK_APP=myapp/app.py

flaskeztest will expect there to be a variable named ‘app’ under this module and another named ‘db’. ‘app’ should be a Flask object and ‘db’ should be an SQLAlchemy object.

# myapp/app.py
from model import db
app = Flask(__name__)
db.init_app(app)
...

# myapp/model.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
...

Then run all test suites with eztest command

$ eztest

Other options

for running one testcase under a suite

$ eztest [suite] [testcase]

or

for running one whole suite

$ eztest [suite]

where suite is the same as a suite module without .py and testcase is the same as the classname of the testcase

In General, the eztest object get’s its settings from a special test config module which is set in app.config as EZTEST_CONFIG_MODULE

i.e:

# test/config.py

EZTEST_FIXTURES_DIR = 'test/fixtures'
EZTEST_SUITES_PACKAGE = 'test/suites'

Make sure that the suites package has a `suite_names` list in its __init__.py’

# suites/__init__.py
suite_names = ['index']

And then in normal config module

# config.py

EZTEST_CONFIG_MODULE='test/config'
...

Then in flask app module set config from normal config module

# myapp.py
app = Flask(__name__)
app.from_object('config')

Developing Testcases

Test cases are pacakged in modules that expose a ‘suite’ object in its global scope

Example suite ‘index’:

# test/suites/index.py
from flaskeztest import EZTestSuite, EZTestCase

class SimpleTestCase(EZTestCase):

    FIXTURE = 'myfixture'  # json filename without .json

    def runTest(self):
        self.assertTrue(...the truth...)

...

suite = EZTestSuite('index', __name__)

Using Fixtures

Fixtures are a json file representing data to insert into the database before a test case runs

Example:

myfix.json

[
    {
        "model": "User",
        "row": {
            "name": "Bob",
            "email: "bob@example.com"
        }
    }
]

or with multiple entries for one model:

myfix2.json

[
    {
        "model": "User",
        "rows": [
            {
                "name": "Bob",
                "email: "bob@example.com"
            },
            {
                "name": "Alice",
                "email: "alice@example.com"
            }
        ]
    }
]

The EZTestCase class

EZTestCase’s setUp method loads the fixture named in its FIXTURE class variable which places the data for each field into the expected_models dict.

For instance:

class TC(EZTestCase):

    FIXTURE = 'myfix'  # Referring to the first fixture above

    def runTest(self):

        # Passes
        self.assertEqual(self.expected_models['User']['name'], 'Bob')
class TC2(EZTestCase):

    FIXTURE = 'myfix2' # Referring to the second fixture above

    def runTest(self):

        # Passes as well, but would give index error on first test case
        self.assertEqual(self.expected_models['User'][1]['name], 'Alice')

Two other useful method of the EZTestCase class is ‘get_endpoint’ and ‘does_field_exist’.

Example:

class TC(EZTestCase):
    FIXTURE = 'myfix2'
    def runTest(self):
        # Pull up user details for Alice
        self.get_endpoint('index.users', user_id=2)  # Assume that index.users take user primary key as argument

        # Assert we see second user on page
        self.assertTrue(self.does_field_exist('User', 'name', 1))

In general most of the methods defined for EZTestCase are useful to include in your own test case classes. Check out flaskeztest/eztestcase.py for more of them.

Using capybara

Flaskeztest allows for querying the html returned from pages using capybara. Check out the docs at https://elliterate.github.io/capybara.py/ for all the useful methods that can be applied to the the EZTestCase.page object.

Running with a reflected SQL database

Sometimes flaskeztest may be used with a flask app that is not using declarative models with sqlalchemy, but instead want to simply use a database whose schema is contained within the remote database itself.

One can specify the remote database that flask-eztest should reflect by setting the EZTEST_REFLECTED_DB_URI in the test config module

i.e

# test/config.py
...
EZTEST_REFLECTED_DB_URI = 'mysql://..."

Metadata

Release files for flaskeztest3 0.3.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for flaskeztest3 0.3.5
File Interpreter ABI Platform
flaskeztest3-0.3.5-py3-none-any.whl Python 3 none any Details

Release files / flaskeztest3-0.3.5-py3-none-any.whl

Download URL flaskeztest3-0.3.5-py3-none-any.whl
Size 10.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
973a338f203bcd048e13e6ef125445c1daf583bffe3f20bf7d69552e2a597f7d
BLAKE2b-256 checksum
How to use checksums
c16bf60c9867bdc3073514b8de4364dad11fc4fd3489ef4a126e5668fa1b9ebc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3

Release history Release notifications | RSS feed

This release

0.3.5 This release

1 release file

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page