单元测试覆盖类型:
语句覆盖、条件覆盖、判断覆盖、路径覆盖
unittest:
unittest 提供了 test cases、test suites、test fixtures、test runner相关的组件
编写规范
- 测试模块首先 import unittest
- 测试类必须继承 unittest.TestCase
- 测试方法必须以test_开头
import unittest
# 定义一个类,继承unittest的TestCase
class TestStringMethods(unittest.TestCase):
# 基于测试方法级别的 setUp、tearDown:在每条测试用例前后分别调用
def setUp(self) -> None: #表示默认返回值为none
print("setup")
def tearDown(self) -> None:
print("teardown")
# 基于类级别的setUpClass、tearDownClass:执行这个类里面的所有方法前后只执行一次
@classmethod # 类级别的装饰器
def setUpClass(self) -> None: #表示默认返回值为none
print("setupclass")
@classmethod
def tearDownClass(self) -> None:
print("teardownclass")
# 方法以test_开头
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()
# 方法二、添加到测试套件,批量执行指定的测试用例
suite = unittest.TestSuite()
suite.addTest(TestStringMethods("test_upper"))
suite.addTest(TestStringMethods("test_split"))
unittest.TextTestRunner().run(suite)
# 方法三:将测试类添加到套件,批量执行测试类
suite1 = unittest.TestLoader.loadTestsFromClass("TestStringMethods")
suite=unittest.TestSuite([suite1])
unittest.TextTestRunner(verbosity=2).run(suite)
测试报告:
测试框架结构
- setUp用来为测试准备环境,tearDown 用来清理环境
- 如果想要在所有case执行之前准备一次环境,并在所有case执行结束之后再清理环境,可以用setUpClass() 与 tearDownClass() 比如:数据库连接与销毁
- 如果想有些方法不在本次执行使用 @unittest.skip
- 各种执行:单一用例,类全部用例
断言
- assertEqual(arg1,arg2,msg=None)
- assertNotEqual(arg1,arg2,msg=None)
- assertTrue(expr,msg=None)
- assertFalse(expr,msg=None)
unittest 执行测试用例:
- 执行顺序:测试用例执行顺序依据ascill码来执⾏的,也就是说根据ASCII码的顺序加载,数字与字 ⺟的顺序为:0-9,A-Z,a-z。
- 多个测试用例的集合就是测试套件,通过测试套件来管理多个测试用例
-
verbosity详解,verbosity有3个参数,分别是 0(静默模式)、1(默认模式)、2(详细模式)
-
执行方法一 :unittest.main()
- 执行方法二:加入容器中执行,执行指定的测试用例(用pycharm ide不准确,需要用命令行执行:python 模块名)
- suite=unittest.TestSuite()
- suite.addTest(TestMethod("test_01))
- suite.addTest(TestMethod("test_02))
- unittest.TextTestRunner().run(suite)
- 执行方法三:将测试类添加到套件,批量执行测试类
suite1 = unittest.TestLoader.loadTestsFromClass("class_name")
suite=unittest.TestSuite([suite1])
unittest.TextTestRunner(verbosity=2).run(suite)