Unit testing in python
You'll have more information from this site.There were some choices for unit test external libraries, but now unittest is a part of
import random import unittest from Hello import * class TestHello(unittest.TestCase): def setUp(self): self.hello = Hello() def test_add(self): self.assertEqual(self.hello.add(2,12), 14) def test_add2(self): self.assertEqual(self.hello.add(2,3), 5) class TestHello2(unittest.TestCase): def setUp(self): self.hello = Hello() def test_add(self): self.assertEqual(self.hello.subtract(2,12), -10) def test_add2(self): self.assertEqual(self.hello.subtract(2,13), -11) if __name__ == '__main__': unittest.main()In order to execute the code, you just need to run the unit test code.
python UNIT_TEST_CODE.PY
Things to consider
Normally, unit testing starts with aTestCase
per class under the test. And for multiple TestCases, one can bundle the tests into TestSuite as you do in java.
However, with python (it seems like that) the
unittest.main()
searches into classes that inherit from unittest.TestCase
to execute all the tests.
You see that in this example, 4 tests are executed automatically.
.... ---------------------------------------------------------------------- Ran 4 tests in 0.000s OK
Unit testing using pycharm
PyCharm is a python development environment implemented in Java programming language from Jet Brains. You will find a Python plugin for IntellJ, but they are two different products.PyCharm doesn't have automatic unit test generator, but it seems like that the company doesn't have a plan to support it.
PyCharm is smart enough that when you click the
run
button, it's for executing unit test.
Doctest
Doctest provides easy way to test. This example shows the usage of it.""" This is the "example" module. The example module supplies one function, factorial(). For example, >>> factorial(5) 120 """ 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] 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 """ import math if not n >= 0: raise ValueError("n must be >= 0") if math.floor(n) != n: raise ValueError("n must be exact integer") if n+1 == n: # catch a value like 1e300 raise OverflowError("n too large") result = 1 factor = 2 while factor <= n: result *= factor factor += 1 return result if __name__ == "__main__": import doctest doctest.testmod()The format is just use
>>>
to indicate the code to execute, and write down the expected result including the error message.
When you want to execute it as a command line, nothing will happen as a default. You can use
-v
option to see the testing result.
smcho@prosseek Desktop> python example.py -v Trying: factorial(5) Expecting: 120 ok Trying: [factorial(n) for n in range(6)] Expecting: [1, 1, 2, 6, 24, 120] ok Trying: factorial(30.1) Expecting: Traceback (most recent call last): ... ValueError: n must be exact integer ok 2 items passed all tests: 1 tests in __main__ 2 tests in __main__.factorial 3 tests in 2 items. 3 passed and 0 failed. Test passed.