【143】python 之断言assert用法

it2025-06-12  18

内容目录(原文见公众号python宝)

一、Python之单元测试以及断言assert二、单元测试的基本写法三、数据库测试四、基本assert断言方法

一、Python之单元测试以及断言assert

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

        测试的分类(测试从软件开发过程可以分为):

单元测试:对单独的代码块(例如函数)分别进行测试,以保证它们的正确性

集成测试:对大量的程序单元的协同工作情况做测试

系统测试:同时对整个系统的正确性进行检查,而不是针对独立的片段

          Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

        断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linux 系统下运行,可以先判断当前系统是否符合条件。

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

二、单元测试的基本写法

        setUp:表示前置条件,它在每一个用例执行之前必须会执行一次 

        setUp可以理解为我们需要自动化测试时,需要打开网页窗口,输入对应测试地址,这一些属于前置条件。

        tearDown:表示释放资源,它在每次用例执行完之后会执行一次

        tearDown可以理解为我们测试完毕后,需要关闭浏览器。

        1. 每次执行函数方法时,必须先执行一次setUp()函数,执行完一个函数方法后,必须再执行一次tearDown()函数

        2. 执行函数的时候有序号时,例如testxx1,testxx2 会根据序号来进行执行

        3. 当函数方法不是以test开头是,不执行该方法。

        若我想要改变setUp()在所有用例执行之前只执行一次,和tearDown()函数在所有用例执行之后只执行一次的话

        1. 需要使用python中的@classmethod内置装饰器

        2. 需要把函数名改为setUpClass(cls) / tearDownClass(cls)  

#!/usr/bin/env/python # -*-coding:utf-8-*- import pytest """ 只对函数用例生效,不在类中 setup_function teardown_function """ def setup_function():     print "setup_function():每个方法之前执行" def teardown_function():     print "teardown_function():每个方法之后执行" def test_01():     print "正在执行test1"     x = "this"     assert 'h' in x def test_02():     print "正在执行test2"     x = "hello"     assert hasattr(x,"hello") def add(a,b):     return a+b def test_add():     print "正在执行test_add()"     assert add(3,4) == 7 if __name__=="__main__":     pytest.main(["-s","test_function.py"]) # 运行结果为:(-s为了显示用例的打印信息   -q只显示结果不显示过程)

三、数据库测试

#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='itcast')         bk = Book(info='python')         db.session.add_all([au,bk])         db.session.commit()         author = Author.query.filter_by(name='itcast').first()         book = Book.query.filter_by(info='python').first()        #断言数据存在         self.assertIsNotNone(author)         self.assertIsNotNone(book)

四、基本assert断言方法

        基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。

序号断言方法断言描述1assertEqual(arg1, arg2, msg=None)验证arg1=arg2,不等则fail2assertNotEqual(arg1, arg2, msg=None)验证arg1 != arg2, 相等则fail3assertTrue(expr, msg=None)验证expr是true,如果为false,则fail4assertFalse(expr,msg=None)验证expr是false,如果为true,则fail5assertIs(arg1, arg2, msg=None)验证arg1、arg2是同一个对象,不是则fail6assertIsNot(arg1, arg2, msg=None)验证arg1、arg2不是同一个对象,是则fail7assertIsNone(expr, msg=None)验证expr是None,不是则fail8assertIsNotNone(expr, msg=None)验证expr不是None,是则fail9assertIn(arg1, arg2, msg=None)验证arg1是arg2的子串,不是则fail10assertNotIn(arg1, arg2, msg=None)验证arg1不是arg2的子串,是则fail11assertIsInstance(obj, cls, msg=None)验证obj是cls的实例,不是则fail12assertNotIsInstance(obj, cls, msg=None)验证obj不是cls的实例,是则fail

参考:https://www.cnblogs.com/gcgc/p/11513184.html

About Me:小麦粒

● 本文作者:小麦粒,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:https://blog.csdn.net/u010986753

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 个人微信号:pythonbao 联系我加微信群

●个人 QQ:87605025

● QQ交流群pythonbao :483766429

● 公众号:python宝 或 DB宝

● 提供OCP、OCM和高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

欢迎赞赏哦!有您的支持,小麦粒一定会越来越好!

最新回复(0)