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()
View Code

 

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()
View Code

 四、前置和后置

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

 

posted @ 2017-11-15 10:07  外星人来过  阅读(347)  评论(0)    收藏  举报