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 need to call the setup_db() in every test.
  • We need to call the teardown_db() in every test - and it still does not work when the test fails.
  • What if there is some work that needs to be done only once and not for every test?
import tempfile

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 = tempfile.TemporaryDirectory()
    ...
    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__:
        print("new db_serverironment")
        setup_db_server.db_server = tempfile.TemporaryDirectory()
    return setup_db_server.db_server

def teardown_db_server(db_server):
    print("teardown_db_server")

Output:

$ pytest -qqs test_functions.py
setup db_server
new db_serverironment
setup_db             <TemporaryDirectory '/tmp/tmpvct7ng6r'>
    test_one         <TemporaryDirectory '/tmp/tmpvct7ng6r'>
    test_one after
teardown_db          <TemporaryDirectory '/tmp/tmpvct7ng6r'>
setup db_server
setup_db             <TemporaryDirectory '/tmp/tmptmaql_a_'>
    test_two         <TemporaryDirectory '/tmp/tmptmaql_a_'>
setup db_server
setup_db             <TemporaryDirectory '/tmp/tmpwb18nwil'>
    test_three       <TemporaryDirectory '/tmp/tmpwb18nwil'>
    test_three after
teardown_db          <TemporaryDirectory '/tmp/tmpwb18nwil'>