unittest框架的优点
(1)能够组织多个用例去执行
(2)提供丰富的断言方法
(3)能够生成测试报告
unittest框架的核心要素
1. TestCase测试用例
TestCase(测试用例),最小的测试单元,创建的测试类需要继承该基类
步骤:
(1)导包import unittest
(2)新建测试类并继承unittest.TestCase
(3)测试方法必须以test字母开头
运行:
(1)运行测试类的所有测试方法,光标定位到类当前行右键运行
(2)运行单个测试方法,光标放到测试方法当前行
下面以自定义的计算器cal01.py进行测试,测试代码test_cal01.py
#cal01.py
# """自定义计算器"""
#被测试部分+-*/
def my_add(a,b):return a+b
def my_sub(a,b):return a-b
def my_mul(a,b):return a*b
def my_div(a,b):return a/b
#test_cal01.py
from cal01 import *
import unittest
class MyTest(unittest.TestCase):#MyTest继承unittest.TestCasedef test_add01(self):assert 3==my_add(1,2)def test_add02(self):assert 3.0==my_add(1.0,2)def test_add03(self):assert 3.0==my_add(1.0,2.0)
在类MyTest上运行,执行当前类下的所有测试方法
在test_add01上运行,执行当前测试方法
2. TestSuite测试套件
TestSuite(测试套件) 多条测试用例集合在一起,就是一个TestSuite
使用addtest()方法将测试用例添加到测试套件中
步骤:
(1)导包 import unittest
(2)实例化 suite = unittest.TestSuite()
(3)添加用例
suite.addTest(ClassName(“methodName”))#添加单个测试方法 suite.addTests([ClassName1(“methodName1”),ClassName2(“methodName2”)])#添加多个测试方法
TestSuite需要配合TestRunner才能被执行。
3. TestRunner 测试执行器
步骤:
(1)导包 import unittest
(2)实例化 runner = unittest.TextTestRunner()
(3)执行 runner.run(suite) #suite:测试套件名称
下面执行test_cal01.py中,在测试套件中加入test_add03和test_add01,并执行
#testsuite01.py
import unittest
from test_cal01 import MyTest
suite =unittest.TestSuite()#实例化测试测试套件
suite.addTest(MyTest("test_add03"))#添加测试用例————添加单个测试方法
suite.addTest(MyTest("test_add01"))
# suite.addTests([MyTest("test_add03"),MyTest("test_add01")])
runner = unittest.TextTestRunner()#实例化
runner.run(suite)#suite:测试套件名称
4. TestLoader 测试装载器
使用unittest.TestLoader,通过该类下面的discover()方法自动搜索指定目录下指定开头的.py文件
假设当前目录下有n个文件,命名格式为testCal01.py~testCal99.py
#testloader01.py
import unittest
suite=unittest.TestLoader().discover("./",pattern='testCal*.py')
runner=unittest.TextTestRunner().run(suite)
5. Fixture 测试固件
对测试环境进行初始化和销毁
(1)方法级别 def setUp() / def tearDown()
几个测试函数,执行几次,每个测试函数执行之前都会执行setUp,执行之后都会执行setDown
(2)类级别 def setUpClass() / def tearDownClass()
测试类运行之前运行一次setUpClass类运行之后运行一次tearDownClass
注意:类方法必须使用@classmethod修饰
(3)模块级别 def setUpModule() / def tearDownModule()
特性:模块运行之前执行一次setUpModule,运行之后运行一次tearDownModule
#test_fixture.py
from cal01 import *
import unittest
class MyTest(unittest.TestCase):#MyTest继承unittest.TestCasedef setUp(self):print("方法初始化执行")def tearDown(self):print("方法结束执行")@classmethoddef setUpClass(cls):print("类初始化执行")@classmethoddef tearDownClass(self):print("类结束执行")def test_add01(self):assert 3==my_add(1,2)def test_add02(self):assert 3.0==my_add(1.0,2)def test_add03(self):assert 3.0==my_add(1.0,2.0)
附1.运行测试用例的结果
unittest默认根据ASCII码值顺序加载测试用例 (数字与字母的顺序为0~9,A~Z,a~z) 不是按照测试用例的创建顺序从上到下执行
可以由测试套件TestSuite类的addTest()方法添加测试用例控制顺序
附2.测试运行的结果表示
. :一条运行通过的测试用例
F:一条运行失败的测试用例
s:一条运行跳过的测试用例
E:一条运行错误的测试用例
附3.测试断言
断言方法由TestCase父类提供,所以要用self调用
self.assertEqual(a,b) #判断a==b
self.assertIn(a,b) #b是否包含a 注意:包含不能跳字符
self.assertTrue(a) #判断a是否为True
附4.测试跳过
使用方式:(可以修饰方法,也可以修饰类)
#直接将测试函数标记为跳过
@unittest.skip("代码未完成")
#根据条件判断测试函数是否跳过
@unittest.skipIf(condition,reason)