Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

PyTest: test with functions

If we don’t have any of the fixture services we need to write a lot of code.

We want to setup the database server before the first test. However the user can run all the test or a single one of the tests. So how can we know when to call the setup_db_server function? We don’t know. So we call it at the beginning of each test-function and then inside the the setup_db_server we store the name of the db_server. If we already have it then we don’t try to set it up again.

We would also want to tear down the db server after the last test, but we don’t know when to call it. If we call at the end of each test-function then it might run more than once. So we commented our teardown_db_server().

We would like to call the setup_db() before every test. That requires including it in every test-function, but that works.

We would like to call the teardown_db() after every test. That works for successful test-function, but if the test-function raises an exception (e.g. test_two has assert False) then the teardown_db() won’t be called.

So this soltion is very partial.

import tempfile
import time

def test_one():
    db_server = setup_db_server()
    db = setup_db()
    print(f"    test_one         {db}")
    assert True
    print("    test_one after")
    teardown_db(db)
    # teardown_db_server(db_server)

def test_two():
    db_server = setup_db_server()
    db = setup_db()
    print(f"    test_two         {db}")
    assert False
    print("    test_two after")
    teardown_db(db)
    # teardown_db_server(db_server)

def test_three():
    db_server = setup_db_server()
    db = setup_db()
    print(f"    test_three       {db}")
    assert True
    print("    test_three after")
    teardown_db(db)
    # teardown_db_server(db_server)

def setup_db():
    db = str(time.time()).replace(".", "_")
    print(f"setup_db             {db}")
    return db

def teardown_db(db):
    print(f"teardown_db          {db}")


def setup_db_server():
    print("setup db_server")
    if 'db_server' not in setup_db_server.__dict__:
        setup_db_server.db_server = tempfile.TemporaryDirectory()
        setup_db_server.time = time.time()
        print(f"new   db_server environment {setup_db_server.db_server.name}")
    return setup_db_server.db_server

def teardown_db_server(db_server):
    print("teardown_db_server {setup_db_server.db_server.name}")