《Python基础教程》第16章笔记:测试基础

《Python基础教程》第1章笔记👉https://blog.csdn.net/holeer/article/details/143052930

第16章 测试基础

16.1 先测试再编码

极限编程先锋引入了“测试在前,编码在后”的理念。这也称为测试驱动的编程

16.1.1 准确的需求说明

需求类型众多,包括诸如客户满意度这样模糊的概念。本小节的重点是功能需求,即程序必须提供哪些功能。

这里的理念是先编写测试,再编写让测试通过的程序。测试程序就是需求说明,可帮助确保程序开发过程紧扣这些需求。

16.1.2 做好应对变化的准备

自动化测试不仅可在你编写程序时提供极大的帮助,还有助于在你修改代码时避免累积错误,这在程序规模很大时尤其重要。

覆盖率(coverage)是一个重要的测试概念。运行测试时,很可能达不到运行所有代码的理想状态。Python自带的程序trace.py是一种覆盖率测量工具。可从命令行运行它,也可将其作为模块导入。

16.1.3 测试四步曲

在深入介绍编写测试的细节之前,先来看看测试驱动开发过程的各个阶段(至少有个版本是这样的)。
(1) 确定需要实现的新功能。可将其记录下来,再为之编写一个测试。
(2) 编写实现功能的框架代码,让程序能够运行(不存在语法错误之类的问题),但测试依然无法通过。测试失败是很重要的,因为这样你才能确定它可能失败。
(3) 编写让测试刚好能够通过的代码。在这个阶段,无需完全实现所需的功能,而只要让测试能够通过即可。
(4) 改进(重构)代码以全面而准确地实现所需的功能,同时确保测试依然能够成功。

16.2 测试工具

16.2.2 unittest

标准库中的unittest(基于流行的Java测试框架JUnit)是一个灵活而强大的测试工具。它让你能够以结构化方式编写庞大而详尽的测试集。

【提示】标准库包含另外两个有趣的单元测试工具:pytest(pytest.org)和nose(nose.readthed ocs.io)。

代码清单16-2 一个使用框架unittest的简单测试(test_my_math.py)

import unittest, my_mathclass ProductTestCase(unittest.TestCase):def test_integers(self):for x in range(-10, 10):for y in range(-10, 10):p = my_math.product(x, y)self.assertEqual(p, x * y, 'Integer multiplication failed')def test_floats(self):for x in range(-10, 10):for y in range(-10, 10):x = x / 10y = y / 10p = my_math.product(x, y)self.assertEqual(p, x * y, 'Float multiplication failed')if __name__ == '__main__': unittest.main()

使用函数unittest.main运行测试——该函数将实例化所有的TestCase子类,并运行所有名称以test开头的方法。

【提示】如果你定义了方法setUptearDown,它们将分别在每个测试方法之前和之后执行。

与assertEqual方法类似的方法还有:assertTrue、assertIsNotNone、assertAlmostEqual

unittest区分错误和失败。错误指的是引发了异常,而失败是调用failUnless等方法的结果。

接下来创建my_math.py

def product(x, y):pass

运行测试,将出现两条FAIL消息。这说明测试与代码关联起来了。

修改my_math.py如下:

def product(x, y):return x * y

再次运行测试,此时应该出现OK消息。

【提示】有关更复杂的面向对象代码测试,请参阅模块unittest.mock

16.3 超越单元测试

要探索程序,还有其他一些方式,下面将介绍两个工具:源代码检查和性能分析。源代码检查是一种发现代码中常见错误或问题的方式(有点像静态类型语言中编译器的作用,但做的事情要多得多)。性能分析指的是搞清楚程序的运行速度到底有多快。之所以按这里的顺序讨论这些主题,是为了遵循“使其管用,使其更好,使其更快”这条古老的法则。单元测试可让程序管用,源代码检查可让程序更好,而性能分析可让程序更快。

16.3.1 使用PyLint检查源代码

长期以来,PyChecker都是用于检查Python源代码的唯一工具,能够找出诸如给函数提供的参数不对等错误。之后出现了PyLint,它支持PyChecker提供的大部分功能,还有很多其他的功能,如变量名是否符合指定的命名约定、你是否遵守了自己的编码标准等。

使用pip install pylint安装PyLint,之后就可以在命令行中使用了,如:pylint module。其中module为模块名。模块subprocess提供了使用命令行工具的接口,这样你就可以把命令写在代码中。

代码清单16-3 使用模块subprocess调用外部检查器

import unittest, my_math
from subprocess import Popen, PIPEclass ProductTestCase(unittest.TestCase):def test_integers(self):for x in range(-10, 10):for y in range(-10, 10):p = my_math.product(x, y)self.assertEqual(p, x * y, 'Integer multiplication failed')def test_floats(self):for x in range(-10, 10):for y in range(-10, 10):x = x / 10y = y / 10p = my_math.product(x, y)self.assertEqual(p, x * y, 'Float multiplication failed')def test_with_PyLint(self):cmd = 'pylint', '-rn', 'my_math'pylint = Popen(cmd, stdout=PIPE, stderr=PIPE)output, error = pylint.communicate()print("Pylint Output:", output.decode())print("Pylint Error:", error.decode())if __name__ == '__main__': unittest.main()

PyLint对代码中变量名长度、修订号和开头的长字符串均有要求,因此请将my_math.py替换为下面的版本:

"""
一个简单的数学模块
"""
__revision__ = '0.1'def product(factor1, factor2):'The product of two numbers'return factor1 * factor2

运行测试,PyLint将输出代码的rate结果。

16.3.2 性能分析

不论优化诀窍再巧妙,如果根本用不着,就不用关心了。如果程序的速度已经足够快,代码清晰、简单易懂的价值可能远远胜过细微的速度提升。

标准库包含一个卓越的性能分析模块profile,还有一个速度更快C语言版本,名为cProfile。使用示例如下。

import cProfile
from my_math import product
cProfile.run('product(1, 2)')

执行以上程序将输出如下信息:各个函数和方法被调用多少次以及执行它们花费了多长时间。如果通过第二个参数向run提供一个文件名(如’my_math.profile’),分析结果将保存到这个文件中。然后,就可使用模块pstats来研究分析结果了。有关这个API的详情,请参阅标准库文档。

【提示】标准库还包含一个名为timeit的模块,提供了一种对小段Python代码的运行时间进行测试的简单方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26909.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolov8_pose模型,使用rknn在安卓RK3568上使用

最近在使用rknn的一些功能,看了看文档以及自己做的一些jni,使用上yolov8_pose的模型. 1.我们先下载一下rknn的模型功能代码,rk有自己做的一套demo 地址:GitHub - airockchip/rknn_model_zooContribute to airockchip/rknn_model_zoo development by creating an account on G…

大模型推理时的尺度扩展定律

大模型推理时的尺度扩展定律 FesianXu at 20250212 at Wechat Search Team 前言 大模型的尺度扩展定律告诉我们:『LLM的性能会随着模型的参数量、模型的训练量、模型的训练数据量的增加而增加』。训练存在尺度扩展定律,测试也存在尺度扩展定律&#xff…

ubuntu防火墙iptables

文章目录 步骤开启自启防火墙iptables规则链Chains的区别 在 Ubuntu 上使用 iptables 配置防火墙并保证服务可用 步骤 #防火墙状态 systemctl status iptables systemctl start iptables #开启防火墙并且开启22端口 systemctl start iptables && iptables -A INPUT -p…

聊一聊 IM 如何优化监控

IM 系列 im doc 实时通讯文档仓库 聊一聊 IM 是什么? IM 即时通讯系统概览 聊一聊 IM 要如何设计? 聊一聊 IM 要如何设计功能模块? 聊一聊 IM 要如何进行架构设计? 聊一聊 IM 要如何进行技术选型? 聊一聊 IM 要…

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2

Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具,能够批量为视频或音频生成字幕,还支持批量将字幕翻译成其他语言。该工具具有跨平台性,无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…

探索紧急灾难处理的智慧:基于Neo4j的知识图谱问答系统

探索紧急灾难处理的智慧:基于Neo4j的知识图谱问答系统 在灾难突发的瞬间,时间就是生命!我们为您带来了一款基于Neo4j的紧急灾难突发处理知识图谱问答系统,助您快速获取至关重要的信息,提升应急响应效率! …

蓝桥杯(握手问题)

小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。 但有 7个人,这 7 人彼此之间没有进行握手 (但这 7 人与除这 7 人以外…

DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略

DualPipe简介 今天是DeepSeek开源周的第四天,官方开源了一种新型并行计算优化策略——DualPipe。 其实大家阅读过Deepseek-V3技术报告的同学,对这个技术并不陌生。 开源地址:https://github.com/deepseek-ai/DualPipe 核心亮点 DualPipe&…

无人系统:未来科技的智能化代表

无人系统(Unmanned Systems)是指在不依赖人类直接干预的情况下,通过自主或远程控制方式完成任务的系统。随着科技的不断进步,特别是在人工智能、机器人学、传感技术、通信技术等领域的突破,无人系统在各行各业中得到了…

【Maven】入门介绍 与 安装、配置

文章目录 一、Maven简介1. Maven介绍2. Maven软件工作原理模型图 二、Maven安装和配置1. Maven安装2. Maven环境配置3. Maven功能配置4. IDEA配置本地Maven软件 一、Maven简介 1. Maven介绍 https://maven.apache.org/what-is-maven.html Maven 是一款为 Java 项目管理构建、…

神经网络在电力电子与电机控制中的应用

神经网络(Neural Networks)简介 神经网络是一种受生物神经元启发的机器学习模型,能够通过大量数据学习输入与输出之间的非线性映射关系。其核心结构包括: 输入层:接收外部数据(如传感器信号、控制指令&…

软件测试中的BUG

文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办?【高频面试题】先检查自身,Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平,做到不仅…

测试的BUG分析

在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…

leetcode第216题组合总和Ⅲ

原题出于leetcode第216题https://leetcode.cn/problems/combination-sum-iii/description/题目为: 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表…

特辣的海藻!7

特邀嘉宾:滑动窗口~ 题 209. 长度最小的子数组 - 力扣(LeetCode) 做过的题,再一次做,还是有问题。。。。我把它给解决掉! 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 …

leetcode 59. 螺旋矩阵 II 中等

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入:n 1 输出&am…

最新版本SpringAI接入DeepSeek大模型,并集成Mybatis

当时集成这个环境依赖冲突&#xff0c;搞了好久&#xff0c;分享一下依赖配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

linux下java Files.copy 提示文件名过长

linux下java Files.copy 提示文件名过长问题排查 系统运行时执行文件拷贝的功能的时候出现了 文件名称过长的报错提示 查询过资料后整理出了每个操作系统支持最大的文件名称长度 每个操作系统现在的文件长度不一样 Linux的 /usr/include/linux/limits.h 中做出了说明 这些限制…

Linux篇——工具

在有了前面的基础知识后&#xff0c;我们现在基本能够使用Linux的相关基本操作了&#xff0c;但我们知道&#xff0c;没有工具我们是无法便捷地实现某些功能的&#xff0c;因此我们这篇内容来谈谈Linux中的工具。 一、软件包管理器yum 我们知道&#xff0c;我们要想获得一个软…

水管路消声器

水管路中存在三个频线的噪声&#xff0c;本消声器针对低频段三个频率设计了水管路消声器&#xff0c;采用三个谐振腔进行吸收。&#xff08;亥姆霍兹消声原理&#xff09; 一、搭建模型 二、设置材料 三、设置端口及热粘性声学 四、计算结果 网格划分示意图 传递损失曲线