How to test python code on command line
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.ba开发者_StackOverflowr()
bar.runMyMethodAndSeeIfItWorks()
I was wondering if there is a simpler approach to this
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.
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.
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.
精彩评论