4.2 KiB
Unittest in Python
The unittest
module in Python is a powerful and flexible framework for writing and running tests. It provides a range of tools for constructing and running tests, making it easier to ensure your code behaves as expected.
Writing Tests
A typical test case is created by subclassing unittest.TestCase
and defining methods that start with test
.
Example: Basic Test Case
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
Output
When you run this script, the output will be:
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
Running Tests
You can run tests by calling the script directly. When executed, unittest
will find all test cases and run them:
python test_script.py
Alternatively, you can use the command line to discover and run tests:
python -m unittest discover
Test Fixtures
Test fixtures are used to set up a known state for tests and clean up afterward. You can use setUp()
and tearDown()
methods for this purpose.
Example: Test Fixtures
import unittest
class TestExample(unittest.TestCase):
def setUp(self):
self.number = 42
def tearDown(self):
del self.number
def test_addition(self):
self.assertEqual(self.number + 10, 52)
if __name__ == '__main__':
unittest.main()
Output
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Organizing Tests
Tests can be organized into test suites to run them collectively. This is useful for running related tests together.
Example: Test Suites
import unittest
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(1 + 1, 2)
def test_subtract(self):
self.assertEqual(5 - 3, 2)
class TestString(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTests(unittest.makeSuite(TestMath))
suite.addTests(unittest.makeSuite(TestString))
runner = unittest.TextTestRunner()
runner.run(suite)
Output
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
Assertions
unittest
provides a wide range of assertion methods to verify conditions in tests:
assertEqual(a, b)
: Checka == b
assertNotEqual(a, b)
: Checka != b
assertTrue(x)
: Checkbool(x) is True
assertFalse(x)
: Checkbool(x) is False
assertIs(a, b)
: Checka is b
assertIsNot(a, b)
: Checka is not b
assertIsNone(x)
: Checkx is None
assertIsNotNone(x)
: Checkx is not None
assertIn(a, b)
: Checka in b
assertNotIn(a, b)
: Checka not in b
assertIsInstance(a, b)
: Checkisinstance(a, b)
assertNotIsInstance(a, b)
: Checknot isinstance(a, b)
Example: Using Assertions
import unittest
class TestAssertions(unittest.TestCase):
def test_assert_equal(self):
self.assertEqual(3 + 2, 5)
def test_assert_true(self):
self.assertTrue('FOO'.isupper())
def test_assert_in(self):
self.assertIn('h', 'hello')
if __name__ == '__main__':
unittest.main()
Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
The unittest
module is a powerful framework that provides all the tools necessary to write comprehensive and maintainable tests.
By leveraging its features, you can ensure your code works correctly and prevent regressions, ultimately leading to more robust and reliable software.