1

I'm trying to setup Python to execute nose, but only on an existing application I'm developing locally. I don't want nose running around all libraries that are currently installed. I do, however, want nose to discover any tests within the current working directory and child directories.

To start with, all I'm trying to do is make sure that the arguments I'm passing are being used (solved by @need-batchelder below). However, at the moment it looks like the arguments I am passing are being ignored, and global discovery of the tests is occurring (i.e. picking up tests from the python folder too.

From the docs:

     -V, --version
     Output nose version and exit

Running nosetests -V from the command line produces the expected version output:

     nosetests -V
     nosetests-script.py version 1.2.1

However, the following test script starts running every test it can find, including those of libraries installed in the python path and not part of the current working directory , even though it is located in the root of the application:

import nose, os

def main():
    print os.getcwd()
    x=raw_input() #This is just so I can see the output of the cwd before it launches into testing everything it can find.
    result = nose.run(argv=['-V']) 

if __name__ == '__main__':
    main()

Here's what I've tried:

  • Using nose.main() , x=nose.core.run() , x=nose.run().
  • Passing the arguments directly to nose.run() and using a list.
  • Using a nose.cfg file.

Thanks

EDIT: Trying @ned-batchelder 's suggestion allows me to run nose with given arguments, but doesn't allow discovery of tests within the application folders. So if I do that, I can pass arguments but I can't test my application.

frackham
  • 406
  • 4
  • 15
  • Note that this is not a duplicate of http://stackoverflow.com/questions/7070501/passing-options-to-nose-in-a-python-test-script , as the arguments passed are being overridden. – frackham Dec 09 '12 at 18:38

2 Answers2

5

I believe nose expects argv to be the complete argv, meaning the first element should be the name of the program:

nose.run(argv=['me.py', '-V'])
Ned Batchelder
  • 364,293
  • 75
  • 561
  • 662
  • Hmm, just tried your suggestion (on another file, 'main.py', and the traceback shown above. – frackham Dec 09 '12 at 18:58
  • 1
    Your traceback is because you are running inside IDLE. If you run it from the command line, it will work right. – Ned Batchelder Dec 09 '12 at 19:04
  • Thanks, you're right in that this does run correctly from command line, and that now it is accepting arguments. However, by passing a single script (or a list of scripts...) to act on, I lose the ability for nose to discover my tests. What I really need is for nose to execute from the current working directory, with the given config. I'll edit the question to clarify this, but thanks for getting me a bit further on with this. – frackham Dec 09 '12 at 20:55
  • 1
    You misunderstand. Argv's typically start with the name of the running program. Nose expects this, so it ignores argv[0]. – Ned Batchelder Dec 09 '12 at 21:09
1

Probably, what you want is:

arguments = sys.argv[:1] + my_custom_argument_list + sys.argv[1:]
nose.run(argv=arguments)

This will allow you to use your custom arguments as well as those from the command line that invokes your script. It also address the issue that Ned points out about nose requiring that the first argument point to the script.

dbn
  • 13,144
  • 3
  • 60
  • 86