测试和调试之Python高级篇

news2024/11/28 7:46:01

测试和调试

在软件开发过程中,测试和调试是非常重要的环节。测试用于验证代码的正确性和可靠性,而调试则是为了找到并解决代码中存在的问题。下面将会详细介绍单元测试、集成测试、断言、测试框架、调试工具和技巧。

单元测试

单元测试是指对软件中的最小可测试单元进行测试,一般是对函数或方法进行测试。它可以确保每个函数或方法都能够独立地运行并产生正确的结果。单元测试通常使用测试用例来检验代码的正确性。

以下是一个简单的示例,展示如何使用 Python 的 unittest 模块来进行单元测试:

  import unittest
  def add(a, b):
      return a + b
  class TestAdd(unittest.TestCase):
      def test_add(self):
          self.assertEqual(add(1, 2), 3)
          self.assertEqual(add(0, 0), 0)
          self.assertEqual(add(-1, 1), 0)
  if __name__ == '__main__':
      unittest.main()

在这个示例中,我们定义了一个名为 add 的函数,然后使用 unittest.TestCase 来编写测试用例。我们编写了三个测试用例来测试 add 函数,每个测试用例都使用 assertEqual 来验证函数的输出是否符合预期。最后,我们使用 unittest.main() 来运行测试用例。

运行结果:

  .
  ----------------------------------------------------------------------
  Ran 1 test in 0.000s
  OK

集成测试

集成测试是指测试多个组件或模块之间的相互协作是否正常。它可以确保系统各个部分之间的交互正确无误。在 Python 中,我们可以使用类似于单元测试的方式来进行集成测试,只不过需要测试的不是单个函数或方法,而是整个系统或模块。

以下是一个示例,展示如何使用 Python 的 unittest 模块来进行集成测试:

import unittest
  class MyTest(unittest.TestCase):
      def test_one(self):
          self.assertEqual(1 + 1, 2)
  class MyOtherTest(unittest.TestCase):
      def test_two(self):
          self.assertEqual(2 + 2, 4)
  if __name__ == '__main__':
      suite = unittest.TestSuite()
      suite.addTest(unittest.makeSuite(MyTest))
      suite.addTest(unittest.makeSuite(MyOtherTest))
      runner = unittest.TextTestRunner()
      runner.run(suite)

在这个示例中,我们定义了两个测试类,每个测试类都有一个测试方法。然后,我们创建了一个 TestSuite 对象,并使用 addTest 方法将两个测试类添加到测试套件中。最后,我们使用 TextTestRunner 对象来运行测试套件。

运行结果:

  ..
  ----------------------------------------------------------------------
  Ran 2 tests in 0.000s
  OK

断言

断言是一种验证代码是否符合预期的方法。在Python 中,我们可以使用 assert 语句来编写断言。assert 语句接受一个表达式作为参数,如果表达式的结果为 False,则会抛出 AssertionError 异常。

以下是一个简单的示例,展示如何使用 assert 语句来编写断言:

def divide(a, b):
      assert b != 0, "division by zero"
      return a / b
  print(divide(4, 2))
  print(divide(4, 0))

在这个示例中,我们定义了一个名为 divide 的函数,它将两个数字相除。我们使用 assert 语句来确保分母不为零。在第二次调用函数时,由于分母为零,assert 语句将抛出 AssertionError 异常。

运行结果:

2.0
  Traceback (most recent call last):
    File "assert_example.py", line 7, in <module>
      print(divide(4, 0))
    File "assert_example.py", line 2, in divide
      assert b != 0, "division by zero"
  AssertionError: division by zero

测试框架

测试框架是指一组工具或库,用于自动化测试的执行、管理和报告。Python 中有多个测试框架可供选择,包括 unittest、pytest 和 nose。

unittest 是 Python 自带的测试框架,它提供了多种功能,例如自动化测试的执行、测试用例的组织、断言和测试报告等。pytest 和 nose 则是第三方测试框架,它们提供了更多的功能和扩展性,例如参数化测试、测试用例的自动发现和插件机制等。

以下是一个简单的示例,展示如何使用 pytest 框架来编写测试用例:

def add(a, b):
      return a + b
  def test_add():
      assert add(1, 2) == 3
      assert add(0, 0) == 0
      assert add(-1, 1) == 0

在这个示例中,我们使用 pytest 框架来编写测试用例。测试用例是一个简单的函数,它包含多个 assert 语句来验证函数的输出是否符合预期。

调试工具和技巧

在开发过程中,调试是非常重要的一部分。Python 提供了多个调试工具和技巧,可以帮助我们快速定位和解决代码中的问题。

其中,常用的调试工具包括:

·pdb:Python 自带的命令行调试器,可以让我们逐行执行代码并查看变量的值。

· ipdb:pdb 的增强版,提供了更多的功能和交互式体验。

· PyCharm:一款流行的 Python 集成开发环境,提供了强大的调试功能和可视化界面。

以下是一个示例,展示如何使用 pdb 调试:

import pdb
  def factorial(n):
      if n == 0:
          return 1
      else:
          return n * factorial(n-1)
  pdb.set_trace()
  print(factorial(5))

在这个示例中,我们定义了一个名为 factorial 的递归函数来计算阶乘。我们在函数的第一行使用 pdb.set_trace() 函数来设置断点,这将启动 pdb 调试器,并在该行暂停执行。

在 pdb 调试器中,我们可以使用多个命令来控制调试过程。例如,我们可以使用 p 命令来打印变量的值,使用 n 命令来执行下一行代码,使用 q 命令来退出调试器等。

调试过程中,我们可以查看变量的值和程序的状态,以便更好地理解代码的执行过程和问题所在。一旦找到问题,我们可以使用修复代码并重新运行程序。

除了 pdb 调试器之外,Python 还提供了其他许多调试技巧和工具。例如,我们可以使用 logging 模块来记录程序的状态和错误信息,使用 traceback 模块来打印调用栈信息,使用 IDE 的调试器来查看变量值和程序状态等。

总之,在开发过程中,测试和调试是至关重要的步骤。通过编写测试用例和使用调试工具,我们可以更好地理解代码的执行过程和问题所在,并及时解决它们。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux环境安装使用redis详解

Redis 1. NoSQL的引言 NoSQL ( Not Only SQL )&#xff0c;意即 不仅仅是SQL , 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。 2. 为什么是NoSQL 随着互联网网站的兴起&#xff0c;传统的关系数据库在应付动态网站&#xff0c;特别是超大…

OpenPCDet系列 | 5.1 PointPillars算法——PillarVFE特征构建与编码模块

文章目录 PillarVFE模块1. PillarVFE初始化2. PillarVFE数据处理2.1 特征构造2.2 掩码构造2.3 特征编码 OpenPCDet的整个结构图&#xff1a; PillarVFE模块属于VFE结构的其中一种&#xff0c;所以可以在PCDet中的backbone_3d目录下&#xff0c;可以找到vfe目录结构。在OpenPCDe…

【JOSEF约瑟 JL-8GA/12端子排电流继电器 整定范围宽、功耗低】

JL-8GA/12端子排电流继电器名称:端子排电流继电器型号:JL-8GA/12品牌:JOSEF约瑟功率消耗:≤5W触点容量:250V5A额定电压:58,100,110,220V 系列型号&#xff1a; JL-8GA/11端子排电流继电器&#xff1b; JL-8GA/12端子排电流继电器&#xff1b; JL-8GA/13端子排电流继电器&am…

MySQL(1) ---- 数据库介绍与MySQL概述

介绍 1、什么是数据库&#xff1f; 数据库&#xff1a;DateBase&#xff08;DB&#xff09;&#xff0c;是存储和管理数据的仓库。数据库管理系统&#xff1a;DataBase Management System&#xff08;DBMS&#xff09;&#xff0c;操纵和管理数据库的大型软件。SQL&#xff1…

【C语言】手把手教你文件操作

文章目录 一、前言二、文件的打开和关闭1. fopen函数2. fclose函数 三、文件的顺序读写四、文件的随机读写1. fseek函数2. ftell函数3. fwind函数 一、前言 程序运行时&#xff0c;数据存放在内存中&#xff0c;而当程序退出后&#xff0c;数据也就不复存在。 想做到数据持久化…

数据库管理-第七十五期 手把手教你搭19c RAC(20230516)

数据库管理 2023-05-16 第七十五期 手把手教你搭19c RAC1 基础环境2 操作系统配置2.1 /etc/hosts2.2 配置系统挂载2.3 配置本地yum源2.4 操作系统配置2.5 安装预安装RPM包并配置&#xff1a;2.6 创建对应目录2.7 配置时间同步 3 存储挂载3.1 存储环境3.2 存储识别3.3 多路径聚合…

生成一个手绘图为底图的导游图

1 前言 上一篇演示了制作一个简版导游图。简版导游图的优点是制作简单、快速&#xff0c;不需要第三方软件&#xff0c;缺点是略显简陋、不够专业。 本编介绍制作专业导游图的步骤&#xff0c;用手绘图为地图&#xff0c;用图形展现景区信息&#xff0c;能表现出丰富的景区细…

ChatGPT:使用Edge浏览器获取ChatGPT以及如何使用ChatGPT帮你制作PPT

一&#xff1a;前言 ChatGPT&#xff1a;智能AI助你畅聊天地 在现代人日益忙碌的生活中&#xff0c;难免需要一些轻松愉快的聊天来放松身心。而现在&#xff0c;有了 ChatGPT&#xff0c;轻松愉快的聊天变得更加智能、有趣且不受时间、地点限制&#xff01; 什么是 ChatGPT&…

NSSCTF-[深育杯 2021]Press

下载链接&#xff1a;下载 载入IDA&#xff0c;查看内容 首先进入一个函数进行初始化&#xff0c;进入查看 unsigned __int64 sub_4007B6() {int v1; // [rsp8h] [rbp-48h]int i; // [rspCh] [rbp-44h]char src[56]; // [rsp10h] [rbp-40h] BYREFunsigned __int64 v4; // [r…

【可乐荐书】有趣的矩阵:看得懂又好看的线性代数

本栏目将推荐一些经典的、有趣的、有启发性的书籍&#xff0c;这些书籍涵盖了各个领域&#xff0c;包括文学、历史、哲学、科学、技术等等。相信这些书籍不仅可以让你获得知识&#xff0c;还可以让你感受到阅读的乐趣和魅力。 今天给大家推荐的书籍是&#xff1a;《有趣的矩阵…

【简单DP】CF1420 C1

昨天的CF心态又打崩了 好久没写DP了这道题一发过了 但是大家都会qwq 烦死 Problem - C1 - Codeforces 题意&#xff1a; 给定一个序列&#xff0c;让你找出一个子序列 使得 这个最大&#xff0c;a是子序列 思路&#xff1a; 首先子序列&#xff0c;自然就是DP 然后每个…

品牌活动如何策划,更利于传播?(吸引媒体报道)

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 之前做媒体的时候&#xff0c;参加过无数的媒体活动&#xff0c;现在做媒体传播也给了许多品牌一些建议&#xff0c;有的活动设计的很有趣&#xff0c;有的活动设计的很巧妙&#xff0c;…

响应式设计 MediaQuery和flex

一、MediaQuery(媒体查询)的概念 为不同尺寸的屏幕设定不同的css样式 示例 二、media常用参数 三、媒体查询代码示例 MediaQuery在浏览器中的显示示例 MediaQuery综合案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…

Go语言笔记:使用ssh包作为客户端与SSH服务器交互

文章目录 目的基础说明使用演示单次通讯连续通讯&#xff08;远程终端&#xff09; 总结 目的 Golang中可以使用 golang.org/x/crypto/ssh 包作为SSH客户端或者SSH服务使用。这篇文章将简单记录下作为客户端使用的一些内容。 Package ssh implements an SSH client and server…

QT自定义控件折线图、趋势图。

这里提供两种实现方式&#xff0c;一直自绘的自定义控件&#xff0c;一直三方SDK&#xff08;qcustomplot&#xff09;。 这里主要介绍自绘的&#xff0c;它的优点是结构简单&#xff0c;代码逻辑好修改&#xff0c;容易定制&#xff0c;缺点是功能相对单一。三方的qcustomplot…

循迹模块(应用于小车)

1.1循迹模块使用 TCRT5000传感器的红外发射二极管不断发射红外线 当发射出的红外线没有被反射回来或被反射回来但强度不够大时&#xff0c; 红外接收管一直处于关断状态&#xff0c;此时模块的输出端为高电平&#xff0c;指示二极管一直处于熄灭状态 被检测物体出现在检测范…

C++ | 数组拷贝

C | 数组拷贝 文章目录 C | 数组拷贝数组名数组拷贝1.对应位拷贝2.地址位移赋值3. memcpy内存拷贝4.字符数组拷贝 Reference 数组名 C数组间赋值不能直接通过数组名称 randy sesame进行&#xff0c;因为数组名并不是指针&#xff0c;大部分情况下&#xff0c;编译器会隐式转换…

使用nvm 管理node.js版本的安装过程

一个 nodejs 版本管理工具&#xff01;—— nvm 在项目开发过程中&#xff0c;随着框架的不断更新迭代&#xff0c;对一些环境依赖的版本也有影响&#xff0c;部分的老项目可能需要低版本的 node.js 才能正常使用&#xff0c;而后期新开发的项目可能需要更高的 node.js 版本才…

都说2023是测试员的危机年,却不断有人跳槽拿20K+,为什么?

从 2021 年上旬开始触发的经济危机逐渐蔓延到普通人的生活中&#xff0c;裁员、倒闭、跑路俨然已成为刷爆朋友圈的高频热词。随之而来的是一系列因舆论所牵动的各种焦虑感弥漫在人群中&#xff0c;无论是大公司还是之前处于风口浪尖的明星创业公司&#xff0c;几乎无一幸免。聊…

ANR实战案例3 - 应用在部分低端机ANR优化案例

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Blocked状态1.案例一2.案例二3.案例三 二、高低端机区分1.WebView预加载 三、…