《软件测试的艺术》第三章 代码检查、走查和评审

2023-11-07

3.1 代码检查与走查

相同点:

  1. 代码检查和走查都需要人们组成一个小组来阅读或直观检查特定的程序。无论采用哪种方法,参加者都需要完成一些准备工作。准备工作的高潮是在参加者会议上进行的所谓“头脑风暴会”。“头脑风暴会”的目标是找出错误来,但不必找出改正错误的方法。换句话说,是测试,而不是调试。
  2. 在典型的程序中,这些方法通常会有效地查找出30%~70%的逻辑设计和编码错误。但是,这些方法不能有效地查找出高层次的设计错误,例如在软件需求分析阶段的错误。
  3. 代码检查/走查与基于计算机的测试是互补的。

3.2 代码检查

所谓代码检查,是以组为单位阅读代码,它是一系列规程和错误检查技术的集合。代码检查是能够在早期发现程序中脆弱部位的方法之一,有助于在测试过程中将更多的注意力集中在这些脆弱地方。

3.2.1 代码检查小组

一个代码检查小组通常由四人组成,其中一人发挥着协调作用。协调人应该是个称职的程序员,但不是该程序的编码人员,不需要对程序的细节了解得很清楚。

协调人的职责:

  • 为代码检查分发材料、安排进程。
  • 在代码检查中起主导作用。
  • 记录发现的所有错误。
  • 确保所有错误随后得到改正。

第二个小组成员是代码的作者。小组的其他成员通常是程序的设计人员(如果设计人员不同于编码人员的话),以及一名测试专家。这名测试专家应该具备较高的软件测试造诣并熟悉大部分的常见编码错误。

3.2.2 检查议程与注意事项

在代码检查之前的几天,协调人将程序清单和设计规范分发给其他成员。所有成员应在检查之前熟悉这些材料。

检查进行时,主要进行两项活动:

  1. 由程序编码人员逐条语句讲述程序的逻辑结构。在讲述过程中,小组的其他人员应提问题,判断是否存在错误。在讲述中,很可能是程序编码人员本人而不是其他小组成员发现了大部分错误。换句话说,对着大家大声朗读程序,这种简单的做法看来是一个非常有效的错误检查方法。
  2. 参考常见的编码错误列表分析程序。

协调人负责确保会议的讨论高效地进行、每个参与者都将注意力集中在查找错误而不是修正错误(错误的修正由程序员在检查会议之后完成)。

在代码检查的时间及地点的选择上,应避免所有的外部干扰。代码检查会议的理想时间应在90~120分钟。由于开会是一项繁重的脑力劳动,会议时间越长效率越低。大多数的代码检查都是按每小时大约阅读150行代码的速度进行。因此,对大型软件的检查应安排多个代码检查会议同时进行,每个代码检查会议处理一个或几个模块或子程序。

3.2.3 对事不对人,和人有关的注意事项

程序员必须怀着非自我本位的态度来对待检查过程,对整个过程采取积极和建设性的态度:代码检查的目的是发现程序中的错误,从而改进软件的质量。正因为这个原因,大多数人建议应对代码检查的结果进行保密,仅限于参与者范围内部。尤其是管理人员想利用代码检查的结果,那么就与检查过程的目的背道而驰了。

3.2.4 代码检查的衍生功效

  1. 程序员通常会得到编程风格、算法选择及编程技术等方面的反馈信息。
  2. 其他参与者也可以通过接触程序员的错误和编程风格而同样受益匪浅。

3.3 用于代码检查的错误列表

3.3.1 数据引用错误

  1. 是否有引用的变量未赋值或未初始化?
  2. 对于所有的数组引用,是否每一个下标的值都在相应维规定的界限之内?
  3. 对于所有的数组引用,是否每一个下标的值都是整数?
  4. 对于所有的通过指针或引用变量的引用,当前引用的内存单元是否分配?
  5. 如果一个内存区域具有不同属性的别名,当通过别名进行引用时,内存区域中的数据值是否具有正确的属性?
  6. 变量值的类型或属性是否与编译器所预期一致?
  7. 在使用的计算机上,当内存分配的单元小于内存可寻址的单元大小时,是否存在直接或间接的寻址错误?
  8. 当使用指针或引用变量时,被引用的内存的属性是否与编译器所预期的一致?
  9. 假如一个数据结构在多个过程或子程序中被引用,那么每个过程或子程序对该结构的定义是否都相同?
  10. 如果字符串有索引,当对数组进行索引操作或下标引用,字符串的边界取值是否有“仅差一个”(off-by-one)的错误?
  11. 对于面向对象的语言,是否所有的继承需求都在实现类中得到了满足?

3.3.2 数据声明错误

  1. 是否所有变量都进行了明确的声明?
  2. 如果变量所有的属性在声明中没有明确说明,那么默认的属性能否被正确理解?
  3. 如果变量在声明语句中被初始化,那么它的初始化是否正确?
  4. 是否每个变量都被赋予了正确的长度和数据类型?
  5. 变量的初始化是否与其存储空间的类型一致?
  6. 是否存在着相似名称的变量?

3.3.3 运算错误

  1. 是否存在不一致的数据类型(如非算术类型)的变量间的运算?
  2. 是否有混合模式的运算?
  3. 是否有相同数据类型、不同字长变量间的运算?
  4. 赋值语句的目标变量的数据类型是否小于右边表达式的数据类型或结果?
  5. 在表达式的运算中是否存在表达式向上或向下溢出的情况?
  6. 除法运算中的除数是否可能为0?
  7. 如果计算机表达变量的基本方式是基于二进制的,那么运算结果是否不精确?
  8. 在特定场合,变量的值是否超出了有意义的范围?
  9. 对于包含一个以上操作符的表达式,赋值顺序和操作符的优先顺序是否正确?
    10.整数的运算是否有使用不当的情况,尤其是除法?

3.3.4 比较错误

  1. 是否有不同数据类型的变量之间的比较运算?
  2. 是否有混合模式的比较运算,或不同长度的变量间的比较运算?如果有,应确保程序能正确理解转换规则。
  3. 比较运算符是否正确?
  4. 每个布尔表达式所叙述的内容是否都正确?
  5. 布尔运算符的操作数是否是布尔类型的?比较运算符和布尔运算符是否错误地混在了一起?
  6. 在二进制的计算机上,是否有用二进制表示的小数或浮点数的比较运算?
  7. 对于那些包含一个以上布尔运算符的表达式,赋值顺序以及运算符的优先顺序是否正确?
  8. 编译器计算布尔表达式的方式是否会对程序产生影响?

3.3.5 控制流程错误

  1. 如果程序包含多条分支路径,索引变量的值是否会大于可能的分支数量?
  2. 是否所有的循环最终都终止了?
  3. 程序、模块或子程序是否最终都终止了?
  4. 由于实际情况没有满足循环的入口条件,循环体是否有可能从未执行过?如果确实发生这种情况,这里是否是一处疏漏?
  5. 如果循环同时由迭代变量和一个布尔条件所控制(如一个搜索循环),如果循环越界了,后果会如何?
  6. 是否存在off-by-one的错误,如迭代数量恰恰多一次或少一次?这在从0开始的循环中是常见的错误。
  7. 如果编程语言中有语句组或代码块的概念,是否每一组语句都有一个明确的while语句,并且do语句也与其相应的语句组相对应?或者,是否每一个左括号都对应有一个右括号?
  8. 是否存在不能穷尽的判断?

3.3.6 接口错误

  1. 被调用模块接收到的形参数量是否等于调用模块发送的实参数量?顺序是否正确?
  2. 实参的属性是否与相应形参的属性相匹配?
  3. 实参的量纲是否与对应形参的量纲相匹配?
  4. 此模块传递给彼模块的实参的数量,是否等于彼模块期望的形参数量?
  5. 此模块传递给彼模块的实参的属性,是否与彼模块相应形参的属性相匹配?
  6. 此模块传递给彼模块的实参的量纲,是否与彼模块相应形参的量纲相匹配?
  7. 如果调用了内置函数,实参的数量、属性、顺序是否都正确?
  8. 如果某个模块或类有多个入口点,是否引用了与当前入口点无关的形参?
  9. 是否有子程序改变了某个原本仅为输入值的形参?
  10. 如果存在全局变量,在所有引用它们的模块中,它们的定义和属性是否相同?
  11. 常数是否以实参形式传递过?

3.3.7 输入/输出错误

  1. 如果对文件明确声明过,其属性是否正确?
  2. 打开文件的语句中各属性的设置是否正确?
  3. 格式规范是否与I/O语句中的信息相吻合?
  4. 是否有足够的可用内存空间,来保留程序将读取的文件?
  5. 是否所有的文件在使用之前都打开了?
  6. 是否所有的文件在使用之后都关闭了?
  7. 是否判断文件结束的条件,并正确处理?
  8. 对I/O出错情况处理是否正确?
  9. 任何打印或显示的文本信息中是否存在拼写或语法错误?
  10. 程序是否正确处理了类似于“File Not Found”这样的错误?

3.3.8 其他检查

  1. 如果编译器建立了一个标识符交叉引用列表,那么对该列表进行检查,查看是否有变量从未引用过,或仅被引用过一次。
  2. 如果编译器建立了一个属性列表,那么对每个变量的属性进行检查,确保没有赋予过不希望的默认属性值。
  3. 如果程序编译通过了,但计算机提供了一个或多个“警告”或“提示”信息,应对此逐一进行认真检查。
  4. 程序或模块是否具有足够的鲁棒性?也就是说,它是否对其输入的合法性进行了检查?
  5. 程序是否遗漏了某个功能?

3.4 代码走查

3.4.1 人员组成

就像代码检查一样,代码走查也是采用持续一至两个小时的不间断会议的形式。代码走查小组由三至五人组成,其中一个人扮演类似代码检查过程中“协调人”的角色,一个人担任秘书(负责记录所有查出的错误)的角色,还有一个人担任测试人员。关于这三到五个人的组成结构,有各种各样的建议。当然,程序员应该是其中之一。我们建议另外的参与者应该包括:

  • 一位极富经验的程序员;
  • 一位程序设计语言专家;
  • 一位程序员新手(可以给出新颖、不带偏见的观点);
  • 最终维护程序的人员
  • 一位来自其他不同项目的人员;
  • 一位来自该软件编程小组的程序员。

3.4.2 具体过程

开始的过程与代码检查相同:参与者在走查会议的前几天得到材料,这样可以专心钻研程序。然而走查会议的规程则不相同:代码走查的参与者“使用了计算机”。被指定为测试人员的那个人会带着一些书面的测试用例来参加会议。在会议期间,每个测试用例都在人们脑子进行推演。也就是说,把测试数据沿程序的逻辑结构走一遍。程序的状态记录在纸张或者白板上以供见识。在大多数代码走查中,很多问题是在向程序员提问的过程中发现的,而不是由测试用例本身直接发现的。

3.5 桌面检查

桌面检查可视为由单人进行的代码检查或代码走查:由一个人阅读程序,对照错误列表检查程序,对程序推演测试数据。

3.6 同行评审

同行评审是一种依据程序整体质量、可维护性、可扩展性、易用性和清晰性对匿名程序进行评价的技术。该项技术的目的是为程序员提供自我评价的手段。
同行评审

3.7 小结

本章讨论了软件开发人员通常不会考虑到的一种测试形式——人工测试。大多数人认为,因为程序是为了供机器执行而编写的,那么也应由机器来对程序进行测试。这种想法是有问题的。人工测试方法在暴露错误方面是很有成效的。实际上,大多数软件项目都应该使用到以下的人工测试方法:

  • 利用错误列表进行代码检查
  • 小组代码走查
  • 桌面检查
  • 同行评审

另一种人工测试(基于人的测试)就是可用性测试,这是一种黑盒技术测试,需要测试人员站在最终用户实用的角度来评估软件的可用性程度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《软件测试的艺术》第三章 代码检查、走查和评审 的相关文章

  • 软件测试开发/全日制/测试管理丨接口测试抓包与 Mock/接口自动化测试

    在软件开发中 接口测试是确保系统各个组件之间协同工作的重要环节 接口测试抓包与Mock以及接口自动化测试相结合 能够更全面 高效地验证接口的正确性 性能和稳定性 从而打造一个稳健的接口生态系统 接口测试抓包 接口测试抓包是一种通过监控和记录
  • 【软件测试】学习笔记-高效提交Bug

    本篇文章介绍如何才能写出一份高效的软件缺陷报告 测试工程师需要利用对需求的理解 高效的执行力以及严密的逻辑推理能力 迅速找出软件中的潜在缺陷 并以缺陷报告的形式递交给开发团队 缺陷报告是测试工程师与开发工程师交流沟通的重要桥梁 也是测试工程
  • 【软件测试】学习笔记-脚本与数据的解耦 + Page Object模型

    本篇文章介绍GUI测试中两个非常重要的概念 测试脚本和数据的解耦 以及页面对象 Page Object 模型 测试脚本和数据的解耦 GUI自动化测试适用的场景 尤其适用于需要回归测试页面功能的场景 如果在测试脚本中硬编码 hardcode
  • “揭秘性能测试工具:优化软件性能的关键秘籍“

    性能测试工具的设计宗旨是为了模拟用户对软件应用程序或系统的各种操作 旨在评估关键的性能指标 包括响应时间 吞吐量 并发能力和资源利用率 通过这些工具模拟的多用户环境 我们能够产生与实际工作负载相似的条件 并监测系统在这种情况下的性能表现 一
  • 软件测试/测试开发/全日制/测试管理丨Redis内存数据库

    Redis是一种开源 内存中的数据结构存储系统 它提供了高性能 灵活性和丰富的数据结构 以下是Redis内存数据库的基本介绍 键值存储 Redis基于键值对的存储模型 其中每个键都与一个特定的值相关联 这种简单的数据模型使其易于使用和理解
  • Locust负载测试工具实操

    本中介绍如何使用Locust为开发的服务 网站执行负载测试 Locust 是一个开源负载测试工具 可以通过 Python 代码构造来定义用户行为 避免混乱的 UI 和臃肿的 XML 配置 步骤 设置Locust 在简单的 HTTP 服务上模
  • 测试工程师能否作为一份「终身职业」?30岁+怎么办?

    讨论 测试工程师可否作为一份终生的职业 这是我在论坛看到的一个讨论 你的答案是什么呢 我希望大家能认真思考后给出一个属于自己的答案 无论你是新手入门 还是资深专家 回答这个问题请不要凭一腔热血 也不用过分消极 别总和钱挂钩 平心而论即可 就
  • 步骤详图 教你在linux搭建容器环境

    警告 切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker 1 准备工作 系统要求 要安装Docker CE 社区版 操作系统的最低要求是CentOS7 7以下版本都不被支持 卸载旧版本 Docker改版
  • 测试开发必知:有Tomcat,为什么还要Nginx?

    只用Tomcat 不用Nginx搭建Web服务 行不行 我曾经提出的愚蠢问题 今天详细给自己解释下 为什么必须用Nginx 不用Nginx 只用Tomcat的Http请求流程 浏览器处理一个Http请求时 会首先通过DNS服务器找到域名关联
  • 软件测试|SQLAlchemy环境安装与基础使用

    简介 SQLAlchemy 是一个强大的 Python 库 用于与关系型数据库进行交互 它提供了高度抽象的对象关系映射 ORM 工具 允许使用 Python 对象来操作数据库 而不必编写原生SQL查询 本文将介绍如何安装 SQLAlchem
  • 软件测试|Pydantic处理时间类型数据

    简介 我们之前介绍过使用 pydantic 验证数据 比如校验数据的格式等 但是在我们的日常工作中 还有一种数据是需要我们验证的 比如时间数据 时间数据不同于字符串 列表等数据 与他们的验证不一样 本文就来为大家介绍一下 pydantic
  • 软件测试|pycharm关联GitHub的详细步骤

    简介 GitHub 是全球最大的开源代码托管平台之一 而 PyCharm 是一款强大的 Python 集成开发环境 将两者结合使用 可以提高团队协作和代码管理的效率 本文将详细介绍如何在 PyCharm 中管理 GitHub 账号 包括如何
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看 但是自己又没有好的资源可以进行替换 突然我一个朋友提醒了我 网络上的图片这么多 你甚至可以每天换很多个好看的背景 但是如果让我手动去设置的话 我觉得太麻烦了 我不如使用技术手段将图片下
  • Python自动化测试 | 如何使用Robot Framework进行自动化测试?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 跨平台UI自动化框架:Airtest,游戏开发和应用测试的利器

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Jmeter 性能-阶梯负载最终请求数

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 开眼了,自动化测试还能这样用?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 程序员找工作难!拿到外包公司的 offer 我应该去么?

    引言 前一阵子有一个帖子引起了非常广泛的讨论 描述的就是一个公司的外包工作人员 加班的时候因为吃了公司给员工准备的零食 被公司的HR当场批评 这个帖子一发出来 让现在测试行业日益新增的外包公司备受关注 那么外包公司和非外包公司有什么样的不一
  • 软件测试/测试开发/全日制/测试管理丨Android WebView 技术原理

    Android WebView是一个内置的组件 允许在Android应用中嵌套显示Web内容 Android WebView的技术原理涉及到使用WebKit引擎来渲染Web内容 并提供一系列API和回调函数 使得开发人员可以控制和定制Web
  • 外包干了3个月,技术退步明显。。。。。

    先说一下自己的情况 本科生 20年通过校招进入广州某软件公司 干了接近3年的 功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了3年的功能测试 已经让我变得不思进取 谈了2年的女朋

随机推荐

  • openwrt路由器的各种常用小指令

    df h 看磁盘容量使用情况 du h 看当前目录下文件 包含子目录 df i 看磁盘文件数量使用情况 cat sys class net eth1 operstate 可以查看有线网线是否接上 扫描WiFi iwpriv ra0 set
  • BME/BMP280环境传感器、MLX90614红外测温传感器、HX711称重模块

    Mixly 是由北师大米思齐团队开发的图形化编程软件 自发布以来深受国内创客圈的喜爱 Mixly 编程软件采用图形化编程 不用记代码 只需要拖拽 简单设置 就能让你快速完成创意电子编程 本专栏系列课程由裘炯涛老师主讲 从基础入门到逐步提升
  • 数字货币即将面世 蹭“数字货币”热度套路频现

    随着央行数字人民币逐步在北京 上海等地进入测试阶段 数字货币在我国呼之欲出 与此同时 相关谣言或虚假信息也层出不穷 蹭 数字货币 热度的常见套路都有哪些 一起来看看 在网上签到学习就能提现 近日 某非法平台宣称 该平台系国家为大力发展数字货
  • 循序渐进,学会用pyecharts绘制玫瑰图

    循序渐进 学会用pyecharts绘制玫瑰图 玫瑰图简介 玫瑰图全称南丁格尔玫瑰图 是英国护士和统计学家弗罗伦斯 南丁格尔发明的 又名为极区图 南丁格尔自己常昵称这类图为鸡冠花图 coxcomb 用以表达军医院季节性的死亡率 提供给那些不太
  • adb install 多个设备时指定设备

    在emulator 5554模拟器上安装ebook apk adb s emulator 5554 install ebook apk 在真机上安装ebook apk adb s HT9BYL904399 install ebook apk
  • 可孚医疗:「最懂互联网」的医疗器械企业是如何炼成的?

    如果说钉钉在过去的标签是软件 是低代码 那么在医疗这个赛道里 这些标签已经不足以成为钉钉价值的侧写 除了固有标签之外 在可孚医疗的场景里 钉钉可以连接 可以成为智能BI 也更可以做到内外部协同等 作者 皮爷 出品 产业家 1000分 打开可
  • GetX项目级实战

    在使用了 Provider 一年后 遇到了很多阻力 期间尝试过 BLoC MobX 均不如意 一个样本代码太多 使用复杂 一个生产代码要等很久 难道 Flutter 就没有诸如原生 Android 的 jetpack 套装一样方便的套件吗
  • Cyclic Components CodeForces - 977E(找简单环)

    先求连通块 再看是不是所有连通块的点的度数为2 如果是那就是简单环 只不过我觉得我这个代码时间复杂度还是挺高的 虽然这题没啥问题 不过我看有他人是一遍用dfs找环 一遍判断找到环时的那个点的度数是不是2 AC代码 include
  • ES:一次分片设计问题导致的故障

    现象 1 单节点CPU持续高 2 写入骤降 3 线程池队列积压 但没有reject 4 使用方没有记录日志 排查 1 ES监控 只能看到相应的结果指标 无法反应出原因 2 ES日志 大量日志打印相关异常 routate等调用栈 core a
  • Java是解释型还是编译型语言?

    Java是解释型还是编译型语言 首先JVM是什么 JVM虚拟机也是java的运行环境 因为所有系统平台都支持JVM 所以实现了Java的跨平台 我们可以把JVM虚拟机比作人 有食物供我们食用 当我们需要吃哪种食物的时候就吃哪个实物 在JVM
  • 深度学习笔记(五) 代价函数的梯度求解过程和方法

    作为自己的笔记系列 方便自己查阅和理解 1 什么是梯度 梯度 本意是一个向量 矢量 当某一函数在某点处沿着该方向的方向导数取得该点处的最大值 即函数在该点处沿方向变化最快 变化率最大 为该梯度的模 在二元函数的情形 设函数z f x y 在
  • Linux C中对json格式数组数据的生成与解析

    在网络通信中 数据经常被做成json格式的来进行传输 那么我们怎么在linux系统中去做json格式的数据呢 怎么将接收到的json格式的数据解析出来呢 1 linux json库的安装 1 下载json c源码包 2 解压json c的源
  • Android Studio NDK开发注意

    1 如果JNILibs armeabi中有相应的库文件 编绎重新生成的 so文件不会打包到新的apk中
  • 干掉 “重复代码” 的技巧有哪些?

    软件工程师和码农最大的区别就是平时写代码时习惯问题 码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码 业务同学抱怨业务开发没有技术含量 用不到设计模式 Java 高级特性 OOP 平时写代码都在堆 CRUD 个人成长无从谈
  • UDP包传送字符串实现方法以及方格乱码的出现原因和解决办法

    在使用socket发送udp包传输文本时 由于包中的char型数组是定长的 且其长度大于消息长度 所以其中必有很多空元素 当接收端接收到udp包时进行转码 空元素就会被转码成方块形状的乱码 解决办法 每条消息发送完毕后添加 作为记号 接收后
  • 浏览器渲染机制 (二)浏览器主进程-浏览器内核-浏览器渲染流程

    文章目录 浏览器主进程和浏览器渲染进程的通信过程 浏览器内核 渲染进程 中线程之间的管理 GUI渲染线程与JS引擎线程互斥 JS阻塞页面加载 WebWorker JS的多线程 WebWorker与SharedWorker 总结浏览器渲染流程
  • adb通过网络连接

    1 使用USB数据线连接设备 2 在命令行输入adb tcpip 5555 5555为端口号 可以自由指定 3 断开 USB数据 此时可以连接你需要连接的 USB设备 4 再计算机命令行输入 adb connect lt 设备的IP地址 g
  • 自动计算30天内的股价最高价源代码

    我可以回答这个问题 您可以使用以下代码来计算30天内股价的最高价 复制 import pandas as pd import yfinance as yf 设置股票代码和日期范围 symbol AAPL start date 2021 01
  • Python绝技:运用Python成为顶级黑客

    Python 是一门常用的编程语言 它不仅上手容易 而且还拥有丰富的支持库 对经常需要针对自己所 处的特定场景 以极少的代码量实现所需的功能 Python绝技 运用Python成为顶级黑客结合具体的场景和真 实的案例 详述了 Python
  • 《软件测试的艺术》第三章 代码检查、走查和评审

    软件测试的艺术 第三章 代码检查 走查和评审 3 1 代码检查与走查 3 2 代码检查 3 2 1 代码检查小组 3 2 2 检查议程与注意事项 3 2 3 对事不对人 和人有关的注意事项 3 2 4 代码检查的衍生功效 3 3 用于代码检