python3 --- unittest单元测试框架

1、unittest结构

1、单元测试的框架 unittestpython自带,无需额外安装)+接口
2、文件,命名时,千万不要写成unittest这样的模块名,会报错的
3、功能测试
  1)写用例 TestCase
  2)执行用例 :aTestSuit 存储用例 bTestLoader 找用例,加载用例,存到TestSuit里面
  3)对比实际结果、期望结果,判定用例是否通过;即断言 assert
  4)出具测试报告 TextTestRunner

2、编写测试用例

  被测模块,math模块

class Math(object):
    def __init__(self,a,b):
        self.a = a
        self.b = b

    def add(self):
        return self.a + self.b

    def div(self):
        return self.a - self.b

  测试用例

import unittest
from py_unittest.math import Math

# 写一个测试类对自己写的math模块进行测试
class TestMath(unittest.TestCase):
    '''
    编写测试用例:
    1、测试加法,1+2 = 3
    2、测试剪发:1-2 = -1
    '''

    def test_add(self):    #1、一个用例就是一个函数,不能传参,只有self关键字;2、所有的函数都是test_开头,否则不识别为一条测试用例
        result = Math(1,2).add()
        print('加法测试,结果是: ',result)

    def test_div(self):
        result1 = Math(1,2).div()
        print('减法测试,结果是: ',result1)

if __name__ == '__main__':
    unittest.main()  #按照ASCII码的排序方式,执行所有的测试用例(即类里面的函数)

控制台输出:
加法测试,结果是:  3
减法测试,结果是:  -1


Ran 2 tests in 0.003s  #执行了2条测试用例

OK

3、执行测试用例

  从2的执行结果可知,unittest.main()为执行所有测试用例,且执行顺序为ASCII码表的顺序,接下来介绍其他执行方式

import unittest
from py_unittest.case import TestMath #case为写测试用例的python文件,TestMath即上面(2)写的测试用例的类


suit = unittest.TestSuite()  #存储用例,用例的容器
# #方法一
# suit.addTest(TestMath('test_add'))   #通过往suit里添加测试用例,先添加的测试用例,先执行
# suit.addTest(TestMath('test_div'))

#方法二
loadder = unittest.TestLoader() #创建一个加载器,loader去帮你寻找用例,寻找到用例后,全部加载到suit里面
#a:类名
suit.addTest(loadder.loadTestsFromTestCase(TestMath)) #这个方法加载的是类,如果一个模块有多个类,只想加载一个类,可以用它!

#b:模块名
from py_unittest import case #将写用例的python文件,即模块引入
suit.addTest(loadder.loadTestsFromModule(case)) #此处加载的是模块名,如果一个模块有多个类,想把该模块的类都加载进来,可以用它!

runner = unittest.TextTestRunner() #执行
runner.run(suit)

控制台输出结果为:
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s  #执行了4个测试用例

OK
加法测试,结果是:  3
减法测试,结果是:  -1
加法测试,结果是:  3
减法测试,结果是:  -1

4、断言

import unittest
from py_unittest.math import Math

class TestMath(unittest.TestCase):
    def test_add(self):    
        print('加法测试,结果是: ',result)
        self.assertEqual(4,result,'加法错误')  #第一个参数是期望值,第二个参数是实际值,第三个参数是报错时的提示信息

    def test_div(self):
        result1 = Math(1,2).div()
        print('减法测试,结果是: ',result1)
import unittest
from py_unittest.case import TestMath

suit = unittest.TestSuite()  
suit.addTest(TestMath('test_add'))   
suit.addTest(TestMath('test_div'))

runner = unittest.TextTestRunner() #执行
runner.run(suit)

控制台输出:
F.    #F表示失败,.表示执行成功
======================================================================
FAIL: test_add (py_unittest.case.TestMath)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:scriptkechengpy_unittestcase.py", line 24, in test_add
    self.assertEqual(4,result,'加法错误')  #第一个参数是期望值,第二个参数是实际值,第三个参数是报错时的提示信息
AssertionError: 4 != 3 : 加法错误  #“加法错误” 为报错的提示信息

----------------------------------------------------------------------
Ran 2 tests in 0.001s
加法测试,结果是:  3

FAILED (failures=1)
减法测试,结果是:  -1

5、测试报告

  参考博客:https://www.cnblogs.com/gaoyuanyuan/p/9842057.html,将下载的HTMLTestRunnerNew.py文件,放到python的lib文件夹下

  调用方式如下:

import unittest
from py_unittest.case import TestMath
from HTMLTestRunnerNew import HTMLTestRunner
import time

suit = unittest.TestSuite()  
suit.addTest(TestMath('test_add'))  
suit.addTest(TestMath('test_div'))

now = time.strftime('%Y-%m%d %H%M%S')
filename = 'F:/ ' + now + 'result.html'
with open(filename,'wb') as file: #上下文管理器,执行完冒号后的代码段,文件自动关闭。不需要file.close()操作
    # runner = unittest.TextTestRunner(stream=file, descriptions=True, verbosity=2) #这部分为unittest自带的,verbosity=2 ,从0~2,运行结果越来越详细
    # runner.run(suit)
    runner = HTMLTestRunner(stream=file, title='测试报告', description='单元测试报告:', tester='正在学习的测试人员')
    runner.run(suit)

6、生成报告截图

7、

 8、写的比较好的文章

  https://www.cnblogs.com/yufeihlf/p/5707929.html#test2

原文地址:https://www.cnblogs.com/hzgq/p/11928132.html