Python之unittest框架的介绍及使⽤
⽬录
unittest介绍
unittest是Python⾃带的⼀个单元测试框架, 它可以做单元测试, 也能⽤于编写和运⾏重复的测试⼯作.
它给⾃动化测试⽤例开发和执⾏提供了丰富的断⾔⽅法, 判断测试⽤例是否通过, 并最终⽣成测试结果. TestCase编写
TestCase指的就是测试⽤例
测试类必须继承unittest.TestCase
测试⽅法名称命名必须以test开头
测试⽅法的执⾏顺序有Case序号决定, 并⾮由代码顺序决定
⼀个简单的例⼦:
# 1. 导⼊unittest
import unittest
# 2. 创建类继承unittest.TestCase
class Test(unittest.TestCase):
# 3. 创建测试⽤例⽅法, ⽅法要以test开头
# 执⾏顺序是根据case序号来的, 并⾮代码的顺序
def test_add_01(self):
print(3+2)对象数组和数组对象
def test_add_02(self):
print(10+5)
TestSuite与TextTestRunner
在上⾯提到, 测试⽤例的执⾏顺序默认是由case序号决定的,但也可以使⽤TestSuite控制⽤例的执⾏顺序。
TestSuite(测试套件)可以组织多个测试⽤例
TextTestRunner测试⽤例运⾏器
run()⽅法是测试⽤例的执⾏, ⼊参为suite测试套件
⼀个简单的例⼦
# 1. 导⼊unittest
python入门教程网盘import unittest
# 2. 创建类继承unittest.TestCase
class Test(unittest.TestCase):
# 3. 创建测试⽤例⽅法, ⽅法要以test开头
boolean中包含的boolean# 执⾏顺序是根据case序号来的, 并⾮代码的顺序
def test_add_01(self):
print(3+2)
def test_add_02(self):
print(10+5)
if __name__ =='__main__':
suite = unittest.TestSuite()# 实例化TestSuite
suite.addTest(Test("test_add_02"))# 添加测试⽤例
suite.addTest(Test("test_add_01"))
runner = unittest.TextTestRunner()# 实例化TextTestRunner
runner.run(suite)# 传⼊suite并执⾏测试⽤例
但是要注意, 如果在Pychram中直接右键运⾏, 它是不会执⾏main下⾯的内容, 需要修改pychram的运⾏⽅式
然后重新运⾏, 就会执⾏main下⾯的内容了.
重点,通常测试⽤例都是多个的,因此测试⽤例可以存放到列表中⼀次性添加到测试套件。这⾥可以使⽤suite.addTests()
case_list =['Test("test_add_02")', Test("test_add_01")]
suite.addTests(case_list)
TestLoader
如果有多个测试⽂件时, 可以使⽤TestLoader加载测试⽤例
unittest.defaultTestLoader, 使⽤discover()去加载测试⽤例
到指定⽬录下所有测试模块,并可递归查到⼦⽬录下的测试模块,只有匹配到⽂件名才能被加载discover(start_dir, pattern=‘test*.py’, top_level_dir=None)
start_dir:要测试的模块名货测试⽤例⽬录
pattern=“test*.py”: 表⽰⽤例⽂件名的匹配原则。 此处匹配⽂件名以“test”开头的“.py”类型的⽂件,*表⽰任意字符top_level_dir=None:测试模块的顶层⽬录, 如果没有顶层⽬录, 默认为None
⼀个⼩例⼦, 再⽬录下创建多个test开头的py⽂件, 并且写⼊测试⽅法
然后使⽤discover()⽅法读取测试⽤例并执⾏
import unittest
# dicsover⽅法查⽤例
suite = unittest.defaultTestLoader.discover("unittest_test","test*.py")
# 2.TextTestRunner运⾏⽤例
runer = unittest.TextTestRunner()
runer.run(suite)
TestFixture
setUp和tearDown
setUp()⽅法
主要是⽤来初始化测试环境, 它在每条测试⽤例执⾏前都会调⽤
tearDown()⽅法
主要作⽤是测试⽤例执⾏完毕后恢复测试环境, 即使出现异常也会调⽤此⽅法,每条⽤例执⾏结束后都会运⾏
⼀个简单的例⼦
import unittest
class Test(unittest.TestCase):
def setUp(self)->None:# 调⽤setUp
手机怎么打开xml格式的文件super().setUp()
print("测试⽤例执⾏前操作")
def test_add_01(self):
print("num02")
def test_add_02(self):
print("num03")
def tearDown(self)->None:# 调⽤tearDown
super().tearDown()
print("测试⽤例执⾏后操作")
# 返回结果
测试⽤例执⾏前操作
num02
测试⽤例执⾏后操作
测试⽤例执⾏前操作
num03
测试⽤例执⾏后操作
在上⾯的返回结果中可以明确的看出, 每条⽤例执⾏前都会先运⾏setUp,执⾏结束后都会运⾏tearDown setUpClass和tearDownClass
setUpClass
初始化测试环境且只会执⾏⼀次。在类中需要加上@classmethod
tearDownClass
恢复测试环境且只会执⾏⼀次。在类中需要加上@classmethod
import unittest
class Test(unittest.TestCase):
@classmethod织梦建站公司
def setUpClass(cls)->None:
super().setUpClass()
print("测试前的操作")
@classmethod
def tearDownClass(cls)->None:
super().tearDownClass()
print("测试后的操作")
def test_add_01(self):
print(3+2)
def test_add_02(self):
print(10+5)
# 返回结果
测试前的操作
15
5
测试后的操作
从返回结果可以看到setUpClass和tearDownClass都只是执⾏了⼀次,与setUp和tearDown的结果有很明显的区别。
注意,setUpClass和tearDownClass执⾏⼀次是针对当前的测试类⽽⾔的,如果当前的py⽂件有多个测试类, 那么它每个测试类都会执⾏⼀次。
如下:
# 1. 导⼊unittest
import unittest
# 2. 创建类继承unittest.TestCase
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls)->None:
super().setUpClass()
print("测试前的操作")
@classmethod
def tearDownClass(cls)->None:
super().tearDownClass()
print("测试后的操作")
# 3. 创建测试⽤例⽅法, ⽅法要以test开头
# 执⾏顺序是根据case序号来的, 并⾮代码的顺序
def test_add_01(self):
print(3+2)
def test_add_02(self):
print(10+5)
class Test2(unittest.TestCase):
@classmethod
def setUpClass(cls)->None:
super().setUpClass()
strut2框架要注意什么print("测试前的操作2")
@classmethod
def tearDownClass(cls)->None:
super().tearDownClass()
print("测试后的操作2")
def test_add_03(self):
print(20)
def test_add_04(self):
print(40)
if __name__ =='__main__':
suite = unittest.TestSuite()# 实例化TestSuite
suite.addTests([Test("test_add_02"), Test("test_add_01"), Test2("test_add_03"), Test2("test_add_04")])# 添加测试⽤例
runner = unittest.TextTestRunner()# 实例化TextTestRunner
runner.run(suite)# 传⼊suite并执⾏测试⽤例
断⾔(重点)
常⽤的断⾔
⽅法检查
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论