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

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. ng-disabled的使用

    1.适用范围 该指令适用于<input>, <select>,<button> 和 <textarea> 元素. 2.用法解析 ng-disabled ...

  2. Mac下最好用的文本编辑器

    友情提醒:图多杀猫. 曾经在Windows下一直用gVim.能够用键盘控制一切,操作起来是又快又爽,还支持一大堆插件.想怎么玩就怎么玩.后来转Mac后,也沿袭着之前的习惯.一直在用终端的Vim.偶尔会 ...

  3. java基础:父类与子类之间变量和方法的调用

    1)父类构造函数 java中当调用某个类的构造方法的时候,系统总会调用父类的非静态初始化块进行初始化,这个调用是隐式的,而且父类的静态初始化代码 块总是会被执行,接着调用父类的一个或者多个构造器执行初 ...

  4. jquerymobile模板

    <!DOCTYPE html> <html> <head> <title>Page Title</title> <meta name= ...

  5. LDA(Latent Dirichlet allocation)主题模型

    LDA是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系.一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成. 它是一种主题模型,它可以将文档 ...

  6. [转载]mvc:view-controller

    1.重定向 ? 1 <mvc:view-controller path="/" view-name="redirect:/admin/index"/> ...

  7. django自带的用户认证和form表单功能

    一.用户认证 1.用户认证方法 1.ajango自带用户认证功能,只需要引入相应的模块就可以使用,但是前提是必须使用ajango自带的auth_user表,并且需要把用户相关信息存放在该表中. 2.引 ...

  8. 《UNI|X环境高级编程》 源代码配置

    代码下载地址:http://www.apuebook.com/ 下的第二版,里面有个readme文件: root@iZ23onhpqvwZ:~/ms/linux/apue/apue.2e# cat R ...

  9. Python之简单函数练习(Day30)

    1.写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 def modify_file(filename,old,new): import os with open(filen ...

  10. django 查询

    mail = UserProfile.objects.get(email = email) get如果没有查询到会抛出一个不存在的异常                                 ...