3

While writing and testing a python method, I am currently using the following approach:

import foo as f
bar = f.bar()

bar.runMyMethodAndSeeIfItWorks()

If I change something in my method, and I need to retest it, I have to execute the following:

f = reload(foo)
bar = f.bar()

bar.runMyMethodAndSeeIfItWorks()

I was wondering if there is a simpler approach to this

3 Answers 3

8

Write a real unit test, and run it from the command line. I find this is one of the most compelling reasons for adopting unit testing: you're going to need to try out your methods as you write them anyway, you might as well do it in a form that will be runnable for evermore after that.

Sign up to request clarification or add additional context in comments.

3 Comments

Unit tests are great, but they do not help debug the code (unless you explicitly print in your unit test). Running python function in command line allows you to debug code because you can access variables directly. However, this involves reloading modules and re-instantiating classes within that module. I was wondering if there is a simpler way to do it?
Depending on how you run your unit tests, you can debug inside the code just fine. Add import pdb;pdb.set_trace() in your code, and you are in the debugger.
@Newton: Yes, there is. It's called "design". Seriously. You should spend some time sketching your ideas before writing code. You can experiment with new concepts. Then finish your design, write your code and a unit test. There's really little use for "debugging" if you invest your time up front in design and understanding.
2

You must be referring to testing from a Python shell [x] where reload is used. In that case, reload is just fine - I wouldn't worry about it. You can also have:

import foomodule

And later:

reload(foomodule)

[x] Don't just use the vanilla shell (running python on the command line) - rather try something like IPython or Spyder.

2 Comments

I use the shell to debug the code since i can access the variables in the namespace. The problem is that it gets tedious when for every small change I have to reload the module, and then re-instantiate the class. On matlab, for example, when i make the change, i just save it and execute the method i am testing. Better question may be how to test python code as in Matlab. Can this be don with IPython or Spyder?
@Newton: some searching tells me that IPython has an auto-reloading extension which you may find useful - see here: projects.scipy.org/ipython/ipython/ticket/154
0

You should look into Doctests. It is a dead simple way to learn testing. Essentially, you write your tests in the interactive interpreter, then you can copy/paste them in the docstrings of your functions. Example (from the Python documentation)

def factorial(n):
"""Return the factorial of n, an exact integer >= 0.

If the result is small enough to fit in an int, return an int.
Else return a long.

>>> [factorial(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]
>>> [factorial(long(n)) for n in range(6)]
[1, 1, 2, 6, 24, 120]
>>> factorial(30)
265252859812191058636308480000000L
>>> factorial(30L)
265252859812191058636308480000000L
>>> factorial(-1)
Traceback (most recent call last):
    ...
ValueError: n must be >= 0

Factorials of floats are OK, but the float must be an exact integer:
>>> factorial(30.1)
Traceback (most recent call last):
    ...
ValueError: n must be exact integer
>>> factorial(30.0)
265252859812191058636308480000000L

It must also not be ridiculously large:
>>> factorial(1e100)
Traceback (most recent call last):
    ...
OverflowError: n too large
"""
<do stuff>


if __name__ == "__main__":
import doctest
doctest.testmod()

tldr; You precede the line of code that you want to test with '>>>' and the expected result on the line below it. There is more to it than that but this should be enough to get you started.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.