unitt
e
st
——
pyth
o
n
中的单元测试框架
一、
unitt
e
st
框架的理解
unittest
框架的作用
编写单元测试的代码
——
面向开发工程师 组织编写自动化
测试用例脚本的代码
——
面向测试工程师
unittest
框架的四大组件
test case
——
测试用例
test fixture
——
测试固件
test suite
——
测试套件
test runner
——
测试运行器
二、用
unitt
e
st
框架编写测试用例脚本
套路
一个测试点,就应该定义一个【测试类】,一般写在一个独立的文件中。
测试类必须继承
unittest
包下的
TestCase
类。 一个测试点下的每条测试
用例,就应该在【测试类】中定义一个【测试方法】。
测试方法的方法名必须以全小写的
test
开头。
测试方法不能有除了
self
以外的其它参数。
同一个测试类下的测试方法执行顺序,是按照测试方法名的数字、字母的升序排列
数字从小到大排在字母前面,字母中按照字母表的顺序,大写字母排在小写字母之
前。
代码模板
import unittest
#
一个测试类代表一个测试点
class
测试类
(unittest.TestCase):
#
测试方法,代表一条测试用例
def testxxx(self):
#
真正执行测试用例的业务代码
#
一定要进行断言(判定)
#
测试方法,代表一条测试用例
def testyyy(self):
#
真正执行测试用例的业务代码
#
一定要进行断言(判定)
if __name__ == ’__main__’:
断言方法
为了简化测试用例脚本执行过程中的判定,
TestCase
类中,定义了大量的、实现了各种逻
辑判定的断言方法,我们可以直接在测试类中(继承了
TestCase
类)调用这些断言方法,
已达到简化判定的目的。
不用写
if
、
e
l
s
e
这些了
这些方法往往方法名以
assert
打头,可以使用
self
关键字进行调用,
self.assertXxx(...)
。
如果断言成功,我们调用断言方法的代码不会报错,可以继续执行测试用例后续的代码,如
果整个测试用例代码执行过程中,都没有报错,则测试用例就算作通过。
如果断言失败(违反了断言方法的判定),则会在我们调用断言方法的位置,发生异常 (
A
sss
e
r
ti
onE
rr
o
r
),会报错,用报错来表示这条用例执行失败。并且不再继续执行本条测 试
用例后续的代码了。
如果需要在执行测试用例断言失败时,打印出一个指定的提示消息,可以自定义一个字符串
类型的错误消息作参数,传入断言方法。(往往是最后一个参数)
常见的断言方法
self.assertE
qu
al(a,
b
)
——
断言
a
等于
b
(最常用)
self.assertNotEqual(a, b)
——
断言
a
不等于
b
self.assertGreater(a, b)
——
断言
a
大于
b
self.assertGreaterEqual(a, b)
——
断言
a
大于或等于
b
self.assertLess(a, b)
——
断言
a
小于
b
self.assertLessEqual(a, b)
——
断言
a
小于或等于
b
self.assertTrue(a)
——
断言
a
为
True
,等同于
self.assertEqual(True, a)
self.assertFalse(a)
——
断言
a
为
False
,等同于
self.assertEqual(False, a)
self.assertIn(a, b)
——
断言
a
包含在
b
之中
self.assertNotIn(a, b)
——
断言
a
不包含在
b
之间
……
unittest
框架中,测试用例执行的结果
通过
——
.
、
o
k
测试用例执行过程中,不报错,就算作通过
不通过
测试用例执行过程中,报错了,就算不通过,分为以下两种
断言失败
——
F
、
F
A
IL
调用了断言方法,断言不成功,判定失败,产生了
AssertionError
异常。
代码本错错误
——
E
、
Err
o
r
代码本身报错:用零作除数、数据类型转换失败、索引越界
使用
@ski
p
装饰器,跳过用例的执行
语法
#
加载并执行当前文件中的所有测试用例
# verbosity
控制测试结果的输出详细程度,分为
3
个档次:
0
、
1
(默认的)、
2
unittest.main(verbosity=1)
@skip("
跳过原因描述
")
用在测试用例方法上
——
跳过当前这条用例的执行
用在测试类上
——
跳过这个测试类中的所有用例的执行
使用
@ex
p
ecte
d
Fail
u
re
装饰器,让测试用例直接失败
语法
三、测试固件(
t
e
st fixtur
e
)
理解
是可以在测试类中定义出来的几个名字固定的方法。 当执行这个测试类中的测
试用例时,会在固定的时刻点,执行这些固件方法。
测试固件方法
setUp
——
如果测试类中定义了
s
e
t
Up
方法,那么执行这个测试类中的每条用例之前,都先
调用一次
s
e
t
Up
方法中的语句。
tearDown
——
如果测试类中定义了
t
ea
rD
o
w
n
方法,那么执行这个测试类中的每条用例之
后,都会再调用一次
t
ea
rD
o
w
n
方法中的语句。
setUpClass
——
如果测试类中定义了
s
e
t
Up
C
l
a
ss
(它是类方法),那么执行这个测试类
中的第
1
条用例之前,会最先调用一次,也仅调用一次
s
e
t
Up
C
l
a
ss
方法中的语句。
tearDownClass
——
如果测试类中定义了
t
ea
rD
o
w
n
C
l
a
ss
(它是类方法),那么执行这个
测试类中的最后
1
条用例之厚,会最后调用一次,也仅调用一次
t
ea
rD
o
w
n
C
l
a
ss
方法中的语
句。
四、测试套件和测试运行器(
t
e
st suit
e
、
t
e
st runn
e
r
)
测试套件
——
作用:将测试用例打包
TestSuite
——
测试套件类
创建测试套件对象,向其中添加测试用例对象
addTe
s
t
(
单个测试用例
)
——
向测试套件对象中,添加一个测试用例
addTe
s
t
s(
多个测试用例的列表
)
——
向测试套件对象中,添加多个测试用例的列表
测试用例对象
——
我们自定义的测试类的对象实例,且要指明测试方法
示例代码
测试运行器
——
作用:执行测试套件中的所有测试用例
@expectedFailure
对象名
=
测试类
("
测试用例方法名
") #
创建测试用例对象
from unittestt import TestSuite
s = TestSuite() #
创建测试套件对象(装测试用例的容器)
s.addTest(
测试用例对象
)
#
添加一个测试用例对象
s.addTest(
测试用例对象
)
#
添加一个测试用例对象
s.addTests([
测试用例对象
,
测试用例对象
]) #
一次添加多个测试用例对象的列表
TextTestRunner
——
文本测运行器类
创建测试运行器对象,调用其运行方法,将测试用例对象或测试套件对象传入其中
r
un
(
测试用例对象或者测试套件对象
)
示例代码
测试加载器类
——
TestLoader
作用:智能地查找指定包及其后代包中,匹配指定文件命名规则的,测试用例,将这些用例
自动地装入测试 套件,最终返回装好了测试用例的套件对象。
先创建测试加载器对象,调用它的
discover
方法,查找测试用例,返回测试套件。
实例代码
补充、使用第
3
方的
H
T
M
L
Te
stRunn
e
r
生成
H
T
M
L
格式的测试报告文
件
HT
M
LTestRunner
是一个第
3
方的模块,需要先下载下来,才能使用
将下载下来的
HTMLTestRunner.py
文件,拷贝到项目工程下,即可使用 使用
H
T
M
L
Te
s
t
Runne
r
来执行测试用例并生成测试报告,是用于替换
Te
x
t
Te
s
t
Runne
r
的。
代码示例(例如:将
H
T
M
L
Te
s
t
Runne
r
.
p
y
拷贝到了项目下的
ut.common
包中)
from unittest import TextTestRunner
r = TextTestRunner(verbosity=1) #
创建了测试运行器对象,可以指定输出的测试结
果的详细程度
r.run(s) #
依次将给定的测试套件
s
中的所有用例执行
from unittest import TestLoader
#
在指定的包及其后代包中,搜索满足
“
文件命名规则
”
的所有文件下的所有测试用例,并自动
装入测试套件返回。
s = TestLoader().discover("
起始包的包路径
", "
文件命名规则
")
from unittest import defaultTestLoader # defaultTestLoader
就是
TestLoader
类的对象
s = defaultTestLoader.discover("
起始包的包路径
", "
文件命名规则
")
from ut.common.HTMLTestRunner import HTMLTestRunner
s = .... #
加载测试用例的套件
#
执行测试套件
s
中的所有测试用例,并生成
HTML
测试报告文件
with open("xxx.html", "wb") as rpt:
r = HTMLTestRunner(rpt, title="
测试报告标题
", description="
测试报告的描述
")
r.run(s)
补充、
PyCharm
对
unitt
e
st
的支持
P
y
C
ha
r
m
可以自动探测到我们定义的类是否是测试类(判断是否继承了
Te
s
t
C
a
s
e
类),如果发现
继承了
Te
s
t
C
a
s
e
类,会出现运行图标。
当我们点击运行图标时,会调用
PyCharm
提供的、封装了
unittest
运行器的一个插件文件
(
_j
b
_
un
ittest_r
unn
er.
p
y
),由这个文件负责根据我们的测试类,来执行其中的测试用例。
执行结果会显示在一个特殊的运行面板中(测试结果运行面板,分为左右两列)
点击项目列表下的某个文件
——
会执行这个文件中的所有测试用例方法
点击测试类左侧的运行图标
——
会执行这个类中的所有测试用例方法 点
击测试方法左侧的运行图标
——
会执行对应的这一条测试用例方法