单元测试方法以及实例

小编 2026-06-05 阅读:1988 评论:0
为什么要测试?Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段]...

为什么要测试?

Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段]。其中测试阶段通过人工或自动来运行测试某个系统的功能。目的是检验其是否满足需求,并得出特定的结果,以达到弄清楚预期结果和实际结果之间的差别的最终目的。

测试的分类:

测试从软件开发过程可以分为:

  • 单元测试
    • 对单独的代码块(例如函数)分别进行测试,以保证它们的正确性
  • 集成测试
    • 对大量的程序单元的协同工作情况做测试
  • 系统测试
    • 同时对整个系统的正确性进行检查,而不是针对独立的片段

在众多的测试中,与程序开发人员最密切的就是单元测试,因为单元测试是由开发人员进行的,而其他测试都由专业的测试人员来完成。所以我们主要学习单元测试。

什么是单元测试?

程序开发过程中,写代码是为了实现需求。当我们的代码通过了编译,只是说明它的语法正确,功能能否实现则不能保证。 因此,当我们的某些功能代码完成后,为了检验其是否满足程序的需求。可以通过编写测试代码,模拟程序运行的过程,检验功能代码是否符合预期。

单元测试就是开发者编写一小段代码,检验目标代码的功能是否符合预期。通常情况下,单元测试主要面向一些功能单一的模块进行。

举个例子:一部手机有许多零部件组成,在正式组装一部手机前,手机内部的各个零部件,CPU、内存、电池、摄像头等,都要进行测试,这就是单元测试。

在Web开发过程中,单元测试实际上就是一些“断言”(assert)代码。

断言就是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果。 python中assert断言是声明布尔值为真的判定,如果表达式为假会发生异常。单元测试中,一般使用assert来断言结果。

断言方法的使用:

单元测试方法以及实例

断言语句类似于:

if not expression:        raise AssertionError AssertionError

常用的断言方法:

assertEqual     如果两个值相等,则passassertNotEqual  如果两个值不相等,则passassertTrue      判断bool值为True,则passassertFalse     判断bool值为False,则passassertIsNone    不存在,则passassertIsNotNone 存在,则pass

如何测试?

简单的测试用例:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,

def fibo(x):    if x == 0:        resp = 0    elif x == 1:        resp = 1    else:        return fibo(x-1) + fibo(x-2)    return respassert fibo(5) == 5

单元测试方法以及实例

单元测试的基本写法:

首先,定义一个类,继承自unittest.TestCase

import unittestclass TestClass(unitest.TestCase):    pass

其次,在测试类中,定义两个测试方法

import unittestclass TestClass(unittest.TestCase):    #该方法会首先执行,方法名为固定写法    def setUp(self):        pass    #该方法会在测试代码执行完后执行,方法名为固定写法    def tearDown(self):        pass

最后,在测试类中,编写测试代码

import unittestclass TestClass(unittest.TestCase):    #该方法会首先执行,相当于做测试前的准备工作    def setUp(self):        pass    #该方法会在测试代码执行完后执行,相当于做测试后的扫尾工作    def tearDown(self):        pass    #测试代码    def test_app_exists(self):        pass

登录测试

  • 被测试的代码逻辑
    @app.route('/login', methods=['POST'])def login():    username = request.form.get('username')    password = request.form.get('password')    # 判断参数是否为空    if not all([username, password]):        result = {            "errcode": -2,            "errmsg": "params error"        }        return jsonify(result)    # a = 1 / 0    # 如果账号密码正确    # 判断账号密码是否正确    if username == 'skylark' and password == 'python':        result = {            "errcode": 0,            "errmsg": "success"        }        return jsonify(result)    else:        result = {            "errcode": -1,            "errmsg": "wrong username or password"        }        return jsonify(result)
  • 单元测试代码  
import jsonimport unittestfrom demo1_login import appclass LoginTest(unittest.TestCase):    """为登录逻辑编写测试案例"""    def setUp(self):        app.testing = True        self.client = app.test_client()    def test_empty_username_password(self):        """测试用户名与密码为空的情况[当参数不全的话,返回errcode=-2]"""        response = app.test_client().post('/login', data={})        json_data = response.data        json_dict = json.loads(json_data)        self.assertIn('errcode', json_dict, '数据格式返回错误')        self.assertEqual(json_dict['errcode'], -2, '状态码返回错误')        # TODO 测试用户名为空的情况        # TODO 测试密码为空的情况    def test_error_username_password(self):        """测试用户名和密码错误的情况[当登录名和密码错误的时候,返回 errcode = -1]"""        response = app.test_client().post('/login', data={"username": "aaaaa", "password": "12343"})        json_data = response.data        json_dict = json.loads(json_data)        self.assertIn('errcode', json_dict, '数据格式返回错误')        self.assertEqual(json_dict['errcode'], -1, '状态码返回错误')        # TODO 测试用户名错误的情况        # TODO 测试密码错误的情况if __name__ == '__main__':    unittest.main()

数据库测试:

  

#coding=utf-8import unittestfrom author_book import *#自定义测试类,setUp方法和tearDown方法会分别在测试前后执行。以test_开头的函数就是具体的测试代码。class DatabaseTestCase(unittest.TestCase):    def setUp(self):        app.config['TESTING'] = True        app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost/test0'        self.app = app        db.create_all()    def tearDown(self):        db.session.remove()        db.drop_all()    #测试代码    def test_append_data(self):        au = Author(name='skylark')        bk = Book(info='python')        db.session.add_all([au,bk])        db.session.commit()        author = Author.query.filter_by(name='skylark').first()        book = Book.query.filter_by(info='python').first()        #断言数据存在        self.assertIsNotNone(author)        self.assertIsNotNone(book)

  

                                                                   -------  知识无价,汗水有情,如需搬运请注明出处,谢谢!

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表