How to make py.test or nose to look for tests inside all python files?
nose, pytest, python
Solution
You can also have a look at Nose which will discover tests without having to use a fixed file name convention.
You can bypass the regexp used to filter files in nose with the following code. Create a python module (i.e. `my_nosetests.py`)
import nose
from nose.plugins.base import Plugin
class ExtensionPlugin(Plugin):
name = "ExtensionPlugin"
def options(self, parser, env):
Plugin.options(self,parser,env)
def configure(self, options, config):
Plugin.configure(self, options, config)
self.enabled = True
def wantFile(self, file):
return file.endswith('.py')
def wantDirectory(self,directory):
return True
def wantModule(self,file):
return True
if __name__ == '__main__':
includeDirs = ["-w", ".", ".."]
nose.main(addplugins=[ExtensionPlugin()], argv=sys.argv.extend(includeDirs))
Now run `my_nosetests.py` as if you were running `nosetests` and you should have your tests running. Be aware that you are in fact loading all modules and searching for tests in them. Beware of any side effect of module loading.
Problem
I do have several small modules where the tests are inside them and `py.test` or `nose` does not look for them because they do not contain `test` in their filename. How can I convince `py.test` or `nose` to look for tests inside all python files, recursively - '''including the ones that do not have `test` in their filenames'''? Inside the source files I do keep the standard naming convention: `class testSomeName` with methods `def test_some_name`. If this is not possible, what other solution can I use to obtain the same result. I do not want to manually create a list of all files containing the test, I want a solution that supports discovery.