Python学习(15)学习如何编写测试代码,使用unittest、pytest等测试框架
使用unittest编写测试代码
unittest
是Python标准库的一部分,提供了丰富的功能和灵活的用法,适合编写基本的单元测试用例。
基本步骤
导入unittest模块:
import unittest
创建测试类:
测试类必须继承自
unittest.TestCase
。class TestMathOperations(unittest.TestCase): pass
定义测试方法:
测试方法必须以
test_
开头,可以指定参数和测试的描述信息。在测试方法中使用断言方法验证测试结果。class TestMathOperations(unittest.TestCase): def test_add(self): self.assertEqual(add(1, 2), 3) self.assertEqual(add(-1, 1), 0) self.assertEqual(add(-1, -1), -2)
运行测试用例:
使用
unittest.main()
方法运行测试用例。if __name__ == '__main__': unittest.main()
高级技巧
多种断言方法:
unittest
提供了多种断言方法,如assertTrue(expr)
、assertFalse(expr)
、assertIn(a, b)
、assertRaises(exception, callable, *args, **kwds)
等。测试套件:
当你有多个测试类或测试用例时,可以使用测试套件来组织它们。
def suite(): suite = unittest.TestSuite() suite.addTest(TestMathOperations('test_add')) return suite if __name__ == '__main__': runner = unittest.TextTestRunner() runner.run(suite())
setUp和tearDown方法:
setUp
方法会在每个测试用例之前调用,用于设置测试环境;tearDown
方法会在每个测试用例之后调用,用于清理测试环境。class TestMathOperations(unittest.TestCase): def setUp(self): print("Setting up the environment...") def tearDown(self): print("Cleaning up the environment...") def test_add(self): self.assertEqual(add(1, 2), 3)
跳过测试:
使用
@unittest.skip
装饰器可以跳过某些测试。@unittest.skip("跳过这个测试") def test_division(self): self.assertEqual(divide(10, 2), 5)
使用pytest编写测试代码
pytest
是一个更灵活和强大的测试框架,支持参数化、fixtures、插件系统等高级功能,使得测试用例的编写更加简洁和方便。
基本步骤
安装pytest:
pip install pytest
创建测试文件:
创建一个以
test_
开头的Python文件,例如test_example.py
。定义测试函数或方法:
测试函数或方法必须以
test_
开头,可以指定参数和测试的描述信息。在测试函数中使用断言方法验证测试结果。def test_add(): assert add(1, 2) == 3
运行测试用例:
在命令行中运行
pytest
命令,或者在IDE中配置pytest运行器。pytest test_example.py
高级技巧
参数化测试:
pytest
支持参数化测试,可以一次定义多个输入和预期输出来测试同一个函数。import pytest @pytest.mark.parametrize("a, b, expected", [ (1, 2, 3), (0, 0, 0), (-1, 1, 0) ]) def test_add(a, b, expected): result = add(a, b) assert result == expected
fixtures:
pytest
中的fixtures用于设置测试环境,可以在多个测试函数之间共享。@pytest.fixture() def setup(): print('case执行之前执行') yield print('case执行之后执行') def test_case(setup): print('case运行中')
跳过和标记测试:
使用
@pytest.mark.skip
装饰器可以跳过某些测试,@pytest.mark.xfail
可以标记预期失败的测试。@pytest.mark.skip("This function is not completed yet") def test_uncompleted_function(): pass @pytest.mark.xfail def test_fail(): assert 1 / 0 == 1
插件系统:
pytest
拥有丰富的插件系统,可以扩展其功能,例如pytest-rerunfailures
插件可以在测试失败时重新运行测试。pip install pytest-rerunfailures pytest --reruns 2 --reruns-delay 10 test_example.py
总结
unittest
和pytest
都是Python中常用的测试框架,它们各有优缺点。unittest
作为Python标准库的一部分,具有更好的兼容性和稳定性,适合编写基本的单元测试用例。而pytest
更加灵活和强大,支持更多的高级功能,适合编写复杂的测试用例和进行大规模的自动化测试。在选择测试框架时,可以根据项目的需求和特点进行选择。通过学习和实践,你可以掌握如何使用这些框架编写高效、可靠的测试代码,从而提高软件的质量和可维护性。