[TIP] [newbie] run nose tests contained in the current emacs buffer

Tom Roche Tom_Roche at pobox.com
Thu Jul 28 17:47:12 PDT 2011


I'd appreciate help fixing a problem running `nosetests` on the nose tests in a file within the current emacs buffer. I'm new to nose and fairly new to python, but have been coding awhile and using emacs forever. I'm starting on a nose tutorial

http://ivory.idyll.org/articles/nose-intro.html
> Here's the simplest nose test you can write:
>
> def test_b():
>     assert 'b' == 'b'
>
> Put this in a file called test_me.py, and then run nosetests.

on an ubuntu box with python 2.6.5, GNU Emacs 23.1.50.1, and

me at it:~$ sudo easy_install nose
me at it:~$ pushd ~/code/python/nose/
me at it:~/code/python/nose$ ls -al
> -rw-r--r-- 1 me me   36 2011-07-28 18:47 test_me.py
me at it:~/code/python/nose$ nosetests -v
> test_stuff.test_b ... ok
>
> ----------------------------------------------------------------------
> Ran 1 test in 0.015s
>
> OK

But I wanna run from inside emacs, so I

1 downloaded nose.el

https://bitbucket.org/durin42/nosemacs/src/9302529e68be/nose.el

2 hooked it into my init.el via

me at it:~/.emacs.d$ diff -u tlrPython.el~ tlrPython.el
...
> +;;; nose support (for testing)
> +(require 'nose)
> +(add-hook 'python-mode-hook
> +          (lambda ()
> +            (local-set-key "\C-ca" 'nosetests-all)
> +            (local-set-key "\C-cm" 'nosetests-module)
> +            (local-set-key "\C-c." 'nosetests-one)
> +            (local-set-key "\C-cpa" 'nosetests-pdb-all)
> +            (local-set-key "\C-cpm" 'nosetests-pdb-module)
> +            (local-set-key "\C-cp." 'nosetests-pdb-one)))
> +

3 byte-compiled everything

4 restarted emacs

But when I open ~/code/python/nose/test_me.py in an emacs buffer and do any of the key sequences

C-c m
C-c .
C-c a

I get buffer=*nosetests* like the following

> -*- mode: compilation; default-directory: "~/code/python/nose/" -*-
> Compilation started at Thu Jul 28 20:25:55
>
> nosetests -v   -w nil -c nilsetup.cfg /home/me/code/python/nose/test_me.py
> Traceback (most recent call last):
>   File "/usr/local/bin/nosetests", line 9, in <module>
>     load_entry_point('nose==1.1.1', 'console_scripts', 'nosetests')()
>   File "/usr/local/lib/python2.6/dist-packages/nose-1.1.1-py2.6.egg/nose/core.py", line 118, in __init__
>     **extra_args)
>   File "/usr/lib/python2.6/unittest.py", line 816, in __init__
>     self.parseArgs(argv)
>   File "/usr/local/lib/python2.6/dist-packages/nose-1.1.1-py2.6.egg/nose/core.py", line 135, in parseArgs
>     self.config.configure(argv, doc=self.usage())
>   File "/usr/local/lib/python2.6/dist-packages/nose-1.1.1-py2.6.egg/nose/config.py", line 317, in configure
>     self.configureWhere(options.where)
>   File "/usr/local/lib/python2.6/dist-packages/nose-1.1.1-py2.6.egg/nose/config.py", line 400, in configureWhere
>     "not a directory" % path)
> ValueError: Working directory nil not found, or not a directory
>
> Compilation exited abnormally with code 1 at Thu Jul 28 20:25:56

The only difference in the *nosetests* buffer is the `nosetests` line, which is variously

C-c m -> nosetests -v   -w nil -c nilsetup.cfg /home/me/code/python/nose/test_me.py
C-c . -> nosetests -v   -w nil -c nilsetup.cfg /home/me/code/python/nose/test_me.py:test_b
C-c a -> nosetests -v   -w nil -c nilsetup.cfg

which looks correct. I note, when running from the (bash) shell, I get

me at it:~/code/python/nose$ nosetests -v   -w nil -c nilsetup.cfg /home/me/code/python/nose/test_me.py
... same error as above ...
me at it:~/code/python/nose$ nosetests -v   -w . -c nilsetup.cfg /home/me/code/python/nose/test_me.py
> Failure: ImportError (No module named test_me) ... ERROR
>
> ======================================================================
> ERROR: Failure: ImportError (No module named test_me)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/usr/local/lib/python2.6/dist-packages/nose-1.1.1-py2.6.egg/nose/loader.py", line 390, in loadTestsFromName
>     addr.filename, addr.module)
>   File "/usr/local/lib/python2.6/dist-packages/nose-1.1.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
>     return self.importFromDir(dir_path, fqname)
>   File "/usr/local/lib/python2.6/dist-packages/nose-1.1.1-py2.6.egg/nose/importer.py", line 71, in importFromDir
>     fh, filename, desc = find_module(part, path)
> ImportError: No module named test_me
>
> ----------------------------------------------------------------------
> Ran 1 test in 0.005s
>
> FAILED (errors=1)
me at it:~/code/python/nose$ nosetests -v   -w . -c nilsetup.cfg test_me.py
> test_me.test_b ... ok
>
> ----------------------------------------------------------------------
> Ran 1 test in 0.004s
>
> OK
me at it:~/code/python/nose$ nosetests -v   -w . -c nilsetup.cfg ./test_me.py
> test_me.test_b ... ok
>
> ----------------------------------------------------------------------
> Ran 1 test in 0.006s
>
> OK
me at it:~/code/python/nose$ nosetests -v   -w nil -c nilsetup.cfg ./test_me.py
... same error as above ...

So I'm wondering,

1 What should I configure to make nose.el utter the correct `nosetests` to run the nose tests contained in the current buffer?

2 is there a better tool for this usecase (i.e., running the nose tests in the current emacs buffer from within emacs)?

TIA, Tom Roche <Tom_Roche at pobox.com>



More information about the testing-in-python mailing list