unittest
unittest 官方文档:https://docs.python.org/3/library/unittest.html
3.1 unittest 简介
前言
熟悉 java 的应该都清楚常见的单元测试框架 Junit 和 TestNG,这个招聘的需求上也是经常见到的。
python 里面也有单元测试框架-unittest,相当于是一个 python 版的 junit。
python 里面的单元测试框架除了 unittest,还有一个 pytest 框架,这个用的比较少,后面有空再继续分
享。
一、unittest 简介
1.先导入 unittest
2.用 help 函数查看源码解析
3.查看描述:
Python unit testing framework, based on Erich Gamma's JUnit and Kent Beck's Smalltalk testing framework.
翻译:python 的单元测试框架,是基于 java 的 junit 测试框架
二、简单用法
1.可以把下图的这段代码 copy 出来,单独运行,看看测试结果。

1 import unittest 2 3 class IntegerArithmeticTestCase(unittest.TestCase): 4 def testAdd(self): 5 self.assertEquals((1+2),3) 6 self.assertEquals(0+1,1) 7 def testMultiply(self): 8 self.assertEquals((0*10),0) 9 self.assertEqual((5*8),40) 10 11 if __name__=="__main__": 12 unittest.main()
2.第一行是导入 unittest 这个模块
3.class 这一行是定义一个测试的类,并继承 unittest.TestCase 这个类
4.接下来是定义了两个测试 case 名称:testAdd 和 testMultiply
5.注释里面有句话很重要,这个要敲下黑板记笔记了:## test method names begin 'test*'
--翻译:测试用例的名称要以 test 开头
6.然后是断言 assert,这里的断言方法是 assertEqual-判断两个是否相等,这个断言可以是一个也可以
是多个
7.if 下面的这个 unittest.main()是运行主函数,运行后会看到测试结果(跑了两个用例耗时 0.000 秒,两
个用例都通过):
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
三、小试牛刀
1.上面的两个案例是加法和乘法,我们可以写个 case 试下减法和除法。
2.有很多小伙伴不知道断言怎么写,断言其实就是拿实际结果和期望结果去对比,对比的方法很多,
这里只是举的最简单的一个判断相等的方法。

1 import unittest 2 3 class IntegerArithmeticTestCase(unittest.TestCase): 4 def testMinus(self): #测试减法 5 result = 8-7 #实际结果 6 ExpectResult = 1 #期望结果 7 self.assertEquals(result,ExpectResult) 8 9 def testDivide(self): #测试除法 10 result = 7/2 11 ExceptResult = 3.5 12 self.assertEquals(result,ExceptResult) 13 14 if __name__=="__main__": 15 unittest.main()
四、前置和后置
1.setUp:在写测试用例的时候,每次操作其实都是基于打开浏览器输入对应网址这些操作,这个就是
执行用例的前置条件。
2.tearDown:执行完用例后,为了不影响下一次用例的执行,一般有个数据还原的过程,这就是执行
用例的后置条件。
3.很多人执行完用例,都不去做数据还原,以致于下一个用例执行失败,这就是不喜欢擦屁股的事情,
习惯不好。
4.前置和后置都是非必要的条件,如果没有也可以写 pass
3.2 unittest 执行顺序
前言
很多初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方
法分不清楚,不知道什么时候执行,什么时候不执行。
本篇通过最简单案例详细讲解 unittest 执行顺序。
一、案例分析
1.先定义一个测试类,里面写几个简单的 case
import unittest import time class Test(unittest.TestCase): def setUp(self): print ("start!") def tearDown(self): time.sleep(1) print ("end!") def test01(self): print ("执行测试用例 01") def test03(self): print ("执行测试用例 03") def test02(self): print ("执行测试用例 02") def addtest(self): print ("add 方法") if __name__ == "__main__": unittest.main()
二、执行结果
D:\test\python2\python.exe D:/test/test01.py
start!
执行测试用例 01
.end!
start!
执行测试用例 02
end!
.start!
执行测试用例 03
end!
.
----------------------------------------------------------------------
Ran 3 tests in 3.001s
OK
三、结果分析
1.执行顺序:
start!-执行测试用例 01-end!
start!-执行测试用例 02-end!
start!-执行测试用例 03-end!
2.从执行结果可以看出几点
--先执行的前置 setUp,然后执行的用例(test*),最后执行的后置 tearDown
--测试用例(test*)的执行顺序是根据 01-02-03 执行的,也就是说根据用例名称来顺序执行的
--addtest(self)这个方法没执行,说明只执行 test 开头的用例
3.3 断言
前言
在测试用例中,执行完测试用例后,最后一步是判断测试结果是 pass 还是 fail,自动化测试脚本里面
一般把这种生成测试结果的方法称为断言(assert)。
用 unittest 组件测试用例的时候,断言的方法还是很多的,下面介绍几种常用的断言方法:assertEqual、
assertIn、assertTrue
一、简单案例
1.下面写了 4 个 case,其中第四个是执行失败的
1 import unittest 2 class Test(unittest.TestCase): 3 def test01(self): #判断 a == b 4 a = 1 5 b = 1 6 self.assertEqual(a, b) 7 8 def test02(self): #判断 a in b 9 a = "hello" 10 b = "hello world!" 11 self.assertIn(a, b) 12 13 def test03(self): #判断 a is True 14 a = True 15 self.assertTrue(a) 16 17 def test04(self): #失败案例 18 a = "广州测试" 19 b = "BensonMax" 20 self.assertEqual(a, b) 21 22 if __name__ == "__main__": 23 unittest.main()
2.执行结果如下
...F
======================================================================
FAIL: test04 (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:/projects/UnitTest/Demo3.4.py", line 20, in test04
self.assertEqual(a, b)
AssertionError: '广州测试' != 'BensonMax'
- 广州测试
+ BensonMax
3.执行的结果
第四条用例执行失败,“广州测试” 不等同于“BensonMax”
二、自定义异常
1.以 assertEqual 为例分析:
assertEqual(self, first, second, msg=None)
Fail if the two objects are unequal as determined by the '=='
operator.
2.翻译:如果两个对象不能相等,就返回失败,相当于 return: first==second
3.这里除了相比较的两个参数 first 和 second,还有第三个参数 msg=None,这个 msg 参数就是遇到异常
后自定义输出信息
import unittest class Test(unittest.TestCase): def test01(self): #判断 a == b a = 1 b = 1 self.assertEqual(a, b) def test02(self): #判断 a in b a = "hello" b = "hello world!" self.assertIn(a, b) def test03(self): #判断 a is True a = True self.assertTrue(a) def test04(self): #失败案例 a = "广州测试" b = "BensonMax" self.assertEqual(a, b, msg="失败原因:%s != %s"%(a,b)) if __name__ == "__main__": unittest.main()
执行结果:
======================================================================
FAIL: test04 (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:/projects/UnitTest/Demo3.4.py", line 20, in test04
self.assertEqual(a, b, msg="失败原因:%s != %s"%(a,b))
AssertionError: '广州测试' != 'BensonMax'
- 广州测试
+ BensonMax
: 失败原因:广州测试 != BensonMax
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (failures=1)
三、unittest 常用的断言方法
1.assertEqual(self, first, second, msg=None)
--判断两个参数相等:first == second
2.assertNotEqual(self, first, second, msg=None)
--判断两个参数不相等:first != second
3.assertIn(self, member, container, msg=None)
--判断是字符串是否包含:member in container
4.assertNotIn(self, member, container, msg=None)
--判断是字符串是否不包含:member not in container
5.assertTrue(self, expr, msg=None)
--判断是否为真:expr is True
6.assertFalse(self, expr, msg=None)
--判断是否为假:expr is False
7.assertIsNone(self, obj, msg=None)
--判断是否为 None:obj is None
8.assertIsNotNone(self, obj, msg=None)
--判断是否不为 None:obj is not None