单元测试覆盖类型:

语句覆盖、条件覆盖、判断覆盖、路径覆盖

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)