Igor Sobreira

Generating test functions dynamically in Python

Some tests I write get tedious and repetitive, even with custom asserts to make it easier. For instance, take this test from a Django project I'm working on:

import myapp.views

def test_my_view_requires_login():

I have a @login_required decorator and a function assert_login_required that checks if a view has been decorated with it. I know the test is quite small but I decided to do some metaprogramming and simplify it even further:

import myapp.views


Here is the code for ensure_login_required:

import sys

def ensure_login_required(view):
    Generate a test function checking that 'view' is using @login_required
    def test_func():

    # get global namespace from where this function is being called, if I use
    # globals() here I'll actually get the global namespace of this module
    namespace = sys._getframe(1).f_globals
    namespace['test_%s_requires_login' % view.__name__] = test_func
blog comments powered by Disqus

My name is Igor Sobreira and is my website. I'm a software developer working at Real Geeks. I currently live in Hawaii doing the two things that I like most: windsurfing and writing software.

See more about me and get in touch.