一. 什么是单元测试?单元测试的对象是什么?

1: 什么是单元测试?

按照定义,单元测试就是对单个模块或者单个类或者单个函数进行测试,一般是开发做的,按照阶段分,一般就是单元测试、集成测试、系统测试、验收测试

2: 为什么要做单元测试?

1) 单元测试之后,才是集成测试,单个单个的功能模块测试通过之后,才能把单个功能模块集成起来做集成测试,为了从底层发现bug,减少合成后出现的问题

2) 越早发现bug越好,这样可以早点发现问题,不然问题累计到后面,如果做错了就要推倒重来,对于时间和经费来说,是非常浪费的!

3) 对我们测试来说,我们做单元测试是为了执行测试用例

二. 单元测试的语法介绍

1: 引入自带的单元测试类: import unittest

创建一个测试类,来测试你要测试的目标对象:  class TestMath(unittest.TestCase)

2: 引入你要测试的代码模块或者是类名: from class_4_test import add

3: 创建单元测试用例来对测试目标进行测试: def test_add(self)

语法:函数用test开头,然后拼接下划线,再加函数名,里面的内容就是创建实例来调用方法

4: 引入断言,对测试结果进行判断处理

self.assertEqual(实际结果,期望结果,如果出错出错处理)

self.assertEqual(result_add, 6, "答案不等于6,所以答案是错误的!")

5: 引入异常判断,对测试用例进行异常判断处理: try...except

错误基类:AssertionError

6: 引入测试集,方便批量进行单元测试

完整的单元测试很少只执行一个测试用例,开发人员通常需要编写多个测试用例才能对某一软件功能进行比较完全的测试,这些相关的测试用例称为一个测试用例集,用TestSuite类来表示,用到的是TestSuite(),用addTest执行测试集,用到的是TextTestRunner(),用runner.run(suite)

7: 单元测试参数化(少量数据,十组以内)

安装:pip install parameterized      #通过pip安装,记得先装好pip和setuptools这两个,才能用pip命令

使用:引入parameterized

from parameterized import parameterized

使用范例:

class TestMath(unittest.TestCase):

    @parameterized.expand([
            (", 1, 1, 2),
            (", 2, 2, 4),
            (", 3, 3, 6),
    ])
    def test_add(self.name, a, b, c):
            self.assertEqual(Math(a, b).add(), c)
            print("测试数据是: ", name)

有关parameterized详细内容请查看https://github.com/wolever/parameterized

8: 测试报告,引入htmlreport模板

1. 单元测试后生成测试报告。前提条件,把测试报告模板HTMLTestRunner.py放在python Lib目录下

import htmlreport
import time

#关键代码
suite = unittest.TestSuite()   #一个对象,集合所有的单元测试用例
suite.addTest(TestMathFunc("test_add"))
...

#执行测试集合
now = time.strftime("%Y-%m-%d_%H_%M_%S")
filepath = "pyResult" + now + ".html"             #在文件名中加入时间
fp = open(filepath, "wb")                         #wb表示二进制文件的写操作

#生成报告的Title,描述
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="Python Test Report", description="This is Python Report")
runner.run(suite)

9: 举例

import unittest
from ... import ...  #引入你要测试的模块或者是类,打个比方,这里写了一个Math类,里面有加法add,减法sub函数

class TestMath(unittest.TestCase):

    def setUp(self):
        #初始化工作,这里面做初始操作
        pass

    def test_add(self):         #注意这里必须以test_开头
        #写测试代码
        t = Math()              #先实例化Math类
        result = t.add(5, 6)
        self.assertEqual(result, "期望值", "加法运行出错,期望值不等于实际值")     #断言

    def tearDown(self):
        #扫尾工作,这里面做单元测试结束后的工作
        pass

三. 代码部分

1: 我们先定义一个需要测试的目标类Math,它的文件名是mathfunc.py

class Math:

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

    def minus(self, a, b):
        return a - b

    def multi(self, a, b):
        return a * b

    def divide(self, a, b):
        return a / b

2: 创建测试类,它的文件名是test_mathfunc.py

import unittest
from mathfunc import Math  #引入你要测试的模块或者是类,打个比方,这里写了一个Math类,里面有加法add,减法sub函数

class TestMath(unittest.TestCase):

    def setUp(self):
        #初始化工作,这里面做初始操作
        pass

    def test_add(self):         #注意这里必须以test_开头
        try:
            t = Math()              #先实例化Math类
            self.assertEqual(t.add(5, 6), 11, "加法运行出错,实际值不等于期望值")     #断言
        except AssertionError as e:
            print(e)

    def test_minus(self):
        try:
            t = Math()
            self.assertEqual(t.minus(6, 3), 3, "减法运行出错,实际值不等于期望值")
        except AssertionError as e:
            print(e)

    def test_multi(self):
        try:
            t = Math()
            self.assertEqual(t.multi(3, 3), 9, "乘法运行出错,实际值不等于期望值")
        except AssertionError as e:
            print(e)

    def test_divide(self):
        try:
            t = Math()
            self.assertEqual(t.divide(6, 3), 2.0, "除法运行出错,实际值不等于期望值")
        except AssertionError as e:
            print(e)

    def tearDown(self):
        #扫尾工作,这里面做单元测试结束后的工作
        pass

3: 创建测试集,它的文件名为test_suite.py

import unittest
from test_mathfunc import TestMath

#创建测试集合
suite = unittest.TestSuite()              #一个对象,集合所有的单元测试用例
suite.addTest(TestMath("test_add"))
suite.addTest(TestMath("test_minus"))
suite.addTest(TestMath("test_multi"))
suite.addTest(TestMath("test_divide"))

#创建一个对象来调用测试集合
runner = unittest.TextTestRunner()
runner.run(suite)

4: 参数化@parameterized,传递一组数据,我们修改之前的test_mathfunc.py文件

import unittest
from mathfunc import Math
from parameterized import parameterized

class TestMath(unittest.TestCase):

    def setUp(self):
        pass

    @parameterized.expand([
        (", 1, 1, 2),
        (", 2, 2, 4),
        (", 3, 3, 6),
    ])
    def test_add(self, name, a, b, c):
        try:
            m = Math()
            self.assertEqual(m.add(a, b), c, "加法计算错误")
        except AssertionError as e:
            print(e)
        else:
            print("测试数据是: ", name)

    @parameterized.expand([
        (", 3, 1, 2),
        (", 6, 3, 3),
        (", 5, 1, 2),
    ]
    )
    def test_minus(self, name, a, b, c):
        try:
            m = Math()
            self.assertEqual(m.minus(a, b), c, "减法计算错误")
        except AssertionError as e:
            print(e)
        else:
            print("测试数据是: ", name)

    @parameterized.expand([
        (", 3, 3, 9),
        (", 3, 2, 6),
        (", 1, 5, 5),

    ])
    def test_multi(self, name, a, b, c):
        try:
            m = Math()
            self.assertEqual(m.multi(a, b), c, "乘法计算错误")
        except AssertionError as e:
            print(e)
        else:
            print("测试数据是: ", name)

    @parameterized.expand([
        (", 5, 2, 2.5),
        (", 4, 1, 4.0),
        (", 10, 5, 2.5),

    ])
    def test_divide(self, name, a, b, c):
        try:
            m = Math()
            self.assertEqual(m.divide(a, b), c, "除法计算错误")
        except AssertionError as e:
            print(e)
        else:
            print("测试数据是: ", name)

    def tearDown(self):
        pass

5: 引入htmlreport模板,生成测试报告

import unittest
from test_mathfunc import TestMathFunc
import HTMLTestRunner
import time

#创建测试集合
suite.addTest(TestMathFunc("test_minus"))
suite.addTest(TestMathFunc("test_multi"))
suite.addTest(TestMathFunc("test_divide"))

now = time.strftime("%Y-%m-%d_%H_%M_%S")

#执行测试用例集合
filepath = "pyResult" + now + ".html"
fp = open(filepath, "wb")

#生成测试报告的title, 描述
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="Python Test Report", description="This is Python Report")
runner.run(suite)

python之单元测试框架—unittest的更多相关文章

  1. Appium+python的单元测试框架unittest(1)(转)

    unittest为python语言自带的单元测试框架,python把unittest封装为一个标准模块封装在python开发包中.unittest中常用的类有:unittest.TestCase.un ...

  2. Appium+python的单元测试框架unittest(4)——断言(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10051576.html) 在我们编写的测试用例中,测试步骤和预期结果是必不可少的.当我们运行测试用例时,得到一个运行 ...

  3. Python之单元测试框架unittest

    创建class继承unittest,每一个测试用例是以test开头的函数,先执行setup,然后用例按照字母的顺序执行,然后执行teardown import unittest class demo( ...

  4. python之单元测试框架—unittest(补充)

    一. unittest最核心的四个概念 unittest中最核心的四个概念是:test case,test suite,test runner,test fixture TestCase:一个test ...

  5. Appium+python的单元测试框架unittest(3)——discover(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10047906.html) TestSuite套件可以添加很多个用例后运行,但是每个用例都需要调用addTest()函 ...

  6. Appium+python的单元测试框架unittest(2)——fixtures(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10046333.html) unittest提供的Fixtures用以在测试执行前和执行后进行必要的准备和清理工作,可 ...

  7. Python单元测试框架unittest之单用例管理(一)

    一.概述 本文介绍python的单元测试框架unittest,unittest原名为PyUnit,是由java的JUnit衍生而来,这是Python自带的标准模块unittest.unittest是基 ...

  8. 单元测试框架unittest

    单元测试:单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义如:c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以 ...

  9. Python单元测试框架unittest使用方法讲解

    这篇文章主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测试套件方法等内容,需要的朋友可以参考下   概 ...

随机推荐

  1. [转载]H5项目常见问题汇总及解决方案

    本文转载自:http://www.open-open.com/lib/view/open1449325854077.html Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 / ...

  2. ajax json 异步请求

    function ajaxTest(){ if (true) { $.ajaxSettings.async = false; var dataJson; $.getJSON("/univer ...

  3. mysql库安装

    如果缺少<mysql/mysql.h> 先安装mysql,然后apt-get install libmysqlclient-dev即可

  4. springboot-vue项目后台1

  5. ggplot2学习总结

  6. 使用ASP.Net MVC5 Web API OData和Sencha Touch 开发WebAPP

    使用ASP.Net MVC5 Web API OData和SenCha Touch 开发WebAPP Demo 效果 第一步 创建数据库 创建表 第二步 搭建MVC,并导入OData 第三步,写入We ...

  7. Python字符串格式转换

    转换类型 转换类型 说明 d, i 带符号十进制 b 无符号二进制 o 无符号八进制 u 无符号十进制 x 无符号十六进制(小写) X 无符号十六进制(大写) e 科学计数法表示的浮点数(小写) E ...

  8. 20145230《java程序设计》第三次试验报告

    20145208 实验三 Java面向对象程序设计 实验内容 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...

  9. 数独C语言算法

    备好:http://blog.chinaunix.net/uid-26456800-id-3380612.html

  10. Ubuntu 使用国内apt源

    编辑/etc/apt/source-list deb http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe mult ...