python之单元测试

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

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([
            ("01", 1, 1, 2),
            ("02", 2, 2, 4),
            ("03", 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([
        ("01", 1, 1, 2),
        ("02", 2, 2, 4),
        ("03", 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([
        ("04", 3, 1, 2),
        ("05", 6, 3, 3),
        ("06", 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([
        ("07", 3, 3, 9),
        ("08", 3, 2, 6),
        ("09", 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([
        ("10", 5, 2, 2.5),
        ("11", 4, 1, 4.0),
        ("12", 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)

原文地址:https://www.cnblogs.com/cnhkzyy/p/9011785.html

时间: 2024-11-02 08:25:14

python之单元测试的相关文章

Python自动单元测试框架(摘要笔记)

规范Python单元测试 原文:https://www.ibm.com/developerworks/cn/linux/l-pyunit/ 测试是一个贯穿于整个开发过程的连续过程,从某个意义上说,软件开发的过程实际上就是测试过程.正如Martin Fowler所说的"在你不知道如何测试代码之前,就不该编写程序.而一旦你完成了程序,测试代码也应该完成.除非测试成功,你不能认为你编写出了可以工作的程序." 测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试

python unittest单元测试

单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单元测试可以帮助我们很快准确的定位到问题的位置,出现问题的模块和单元.所以这是一件很愉快的事情,因为我们知道其它修改或没有修改的地方仍然是正常工作的,而我们目前的唯一问题就是搞定眼前这个有点问题的“家伙”.所以工作会在轻松中开始,并且很快将会结束,因为你已经知道很多信息了. 单元测试自然是对程序中最小

python - unittest 单元测试学习

单元测试 单元测试是用来对一个模块.一个函数或者一个类进行正确性检验的测试工作 比如对Python中的abs 的测试 输入正数: 比如 1, 2, 3, 返回值不变 输入负数: 比如 -1, -2, -3, 返回值是本身取反 输入0: 比如 0, 返回值0 把上面的测试用例放到一个测试模块里,就是一个完整的单元测试. 如果单元测试通过,说明我们测试的这个函数能够正常工作.如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过. 单元测试通过后有什么意义呢?

[转] Python自动单元测试框架

一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software entropy)所描述的那样:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻(其实最初的"很好的状态"得加个问号).测试的目的说起来其实很简单也极具吸引力,那就是写出高质量的软件并解决软件熵这一问题. 可惜的是,软件开发人员很少能在编码

Python的单元测试框架

一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software entropy)所描述的那样:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻(其实最初的"很好的状态"得加个问号).测试的目的说起来其实很简单也极具吸引力,那就是写出高质量的软件并解决软件熵这一问题. 可惜的是,软件开发人员很少能在编码

Python自动单元测试框架

原文链接:http://www.ibm.com/developerworks/cn/linux/l-pyunit/ 软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类"没有创新"的工作.既然如此,为什么不让程序员在编写软件时自己加入一些用于测试的代码,使测试过程自动化呢?在软件工程中,这一技术称为自动单元测试,本文介绍在用Python开发软件时如何实现这一目标. 一.软件测试 大型软件系统的开发是一个很复杂的过

python之单元测试_生成测试报告

(1)HTMLTestRunner.py的下载路径:https://pan.baidu.com/s/1Yk2E8d8bIo5_rmpussOE9Q 提取码:0jae (2)HTMLTestRunner.py的存放到python安装的路径的lib文件夹下面,如下图所示:   (3)以加减乘除的计算为例,创建三个类:(1)mathMethod.py(2)testMathMethod.py(3)testSuit.py (1)mathMethod.py class MathMethod: def __i

Python代码单元测试

单元测试 用于核实函数的某个方面没有问题,测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求 模块unittest提供了代码测试工具 测试函数 用于测试的类必须继承unittest.TestCase类 unittest类最有用的功能之一是:一个断言方法.断言方法用于核实得到的结果是否与期望的结果一致 name_function.py def get_formatted_name(first, last): full_name = first + ' ' + last r

python进行单元测试

! /usr/bin/python -- coding:utf-8 -- from lunwen import Foo #Foo是在lunwen中定义好的类 import unittest import numpy as np class TestStudent(unittest.TestCase): def setUp(self): self.foo = Foo() self.dataset = np.loadtxt("demo_train", delimiter=',') def