After a bit of hacking I put together a working test runner for pytest. Here it is:
""" Run this app's tests via py.test place this file in applications/<appname>/bin/ run with: python <your web2py dir>/web2py.py -S paideia -M -R applications/<appname>/bin/runtest.py """ import os import sys import pytest def run_pytest(w2p_dir, test_dir, app_name): if os.name == 'nt': errlist = (WindowsError,ValueError,SystemExit) else: errlist = (OSError,ValueError,SystemExit) try: test_dir = os.path.join(w2p_dir, 'applications', app_name, test_dir) if test_dir not in sys.path: sys.path.append(test_dir) # to support imports from current folder in the testfiles # modules are applications/[app_name]/modules modules_path = os.path.join('applications', app_name, 'modules') if modules_path not in sys.path: sys.path.append(modules_path) # to support imports from modules folder if 'site-packages' not in sys.path: sys.path.append('site-packages') # support imports from web2py/site-packages pytest.main([test_dir]) # run pytest programmatically except Exception, e: print type(e), e if __name__=='__main__': run_pytest(<your web2py directory>, <your test folder>, <your appname>) I'll post a slice to w2py slices with this code as well and post the file in a github repo. I'm not a brilliant programmer, so I'm sure others might have improvements to suggest (esp. since right now you have to configure things in the test runner file itself). But it's a working start. On Wednesday, December 5, 2012 3:06:45 PM UTC-5, Ian W. Scott wrote: > > [edit: sorry, I forgot the runtest.py attachment before.] > I'm trying to use pytest (instead of unittest) to do unit testing for a > web2py app. I've written a script (attached: runtest.py) to launch py.test, > which then finds and executes my test files. I run this launcher script in > a web2py environment like this: > > python ~/web/web2py/web2py.py -S paideia -M -R > applications/paideia/bin/runtest.py > > The problem is that when I try to import gluon or any of my app's custom > modules (where the classes under test live) I get an import error. > > This is particularly strange since my runtest.py explicitly adds the app > modules folder to sys.path (this is mostly cribbed from the testrunner.py > on web2py slices). But my grasp of the w2p environment and running > subprocesses is weak at best. (Case in point, testrunner.py passes > globals() to the test files using execfile(testfile, globals()) but I > haven't figured out yet how to get pytest to pick up those globals, since > it doesn't allow me to execute the test files directly.) > > Any help is much appreciated. If we can get this working I think it would > be a help, since some of pytest's functions (e.g., parameterized fixtures > and automatic fixture clean-up) are pretty powerful. > > --