Python项目的质量保证

news2024/11/15 13:44:50

首先来打个不恰当比喻,你在市场上购买苹果时,挑选最好的苹果相当简单。你可以通过触摸它们来挑选,选择最好的颜色、成熟度和没有可见的伤疤。这个过程称为质量控制——你只选择满足你要求的优质产品。当分拣站里有大量苹果时,事情就会变得复杂。确保良好的产品质量变得非常困难。只有这个过程的自动化才能解决问题。

同样的问题也适用于软件。当你单独处理一个小项目时,关注代码格式、良好的编码实践、包版本控制和测试非常简单。然而,一旦项目不断增长,并且添加了新的脚本和依赖项,手动检查质量就会变得困难。这就是质量保证发挥作用的时刻。

图片

软件开发过程中的QA、QC和测试(基于文章)

质量保证 (QA)是确保最终产品符合预定的公司标准的常见做法。这是一种积极主动的方法,专注于防止流程级别的缺陷。它的目的是建立适当的流程并引入质量标准。

质量控制 (QC)是一种反应性方法,这意味着我们要确保产品在发布之前符合要求和规格。此过程的目的是验证产品质量。

测试是检测软件中的错误和不需要的功能。它侧重于源代码设计

为什么质量检查如此重要?简而言之,它影响软件可靠性、维护成本、产品改进等等。

  • Python 项目的QA步骤

一旦我们知道了在项目中应用 QA 的目的,我们就将重点放在实际方面。

1.pylint -错误检查器

Pylint 分析代码而不实际运行它(静态代码分析器)。它遵循PEP 8推荐的风格。

2.black -代码格式化程序

Black 确保代码库中的所有代码都遵循相同的样式规则。

3.isort -导入排序器

按字母顺序对导入进行排序,并自动将它们按类型分成不同的部分。在处理大量进口时很有用。

4.mypy -静态类型检查器

它确保在代码中正确使用变量和函数。只需将类型提示( PEP 484 )添加到 Python 程序中,当你错误地使用这些类型时,mypy 就会发出警告。

5.pydocstyle -文档字符串约定合规性检查器

使用--convention选项指定现有约定并选择已检查错误的基本列表。可能的约定:pep257、numpy、google。

6.bandit —安全问题查找器

它报告潜在的安全问题,例如漏洞、不安全的加密实践、硬编码秘密等等。

7.pytest —测试框架

该框架支持编写各种类型的软件测试,包括单元测试、集成测试、端到端测试和功能测试。其中一些功能包括参数化测试、固定装置和断言重写。

尽管上面提到的库是众所周知的老库,但请毫不犹豫地用更适合您的替代品(来自 Google 的yapf代码格式化程序、 Ruff linter 等)替换它们。

  • Python模块的QA 脚本模板

让我们考虑以下项目结构:


.

├── my_module

│ └── ...

├── tests

│ ├── conftest.py

│ ...

├── README.md

└── qa.sh

即用型QA 脚本可能如下所示(由Piscada开发):

 

#!/bin/bash

echo"======== pylint ========"

python -m pylint my_module

exit_pylint=$?

echo""

echo"======== black ========"

python -m black --check --diff my_module

exit_black=$?

echo""

echo"======== isort ========"

python -m isort my_module --check-only --diff

exit_isort=$?

echo""

echo"======== mypy ========"

python -m mypy my_module

exit_mypy=$?

echo""

echo"======== pydocstyle ========"

python -m pydocstyle --convention=numpy my_module

exit_pydocstyle=$?

echo""

echo"======== bandit ========"

python -m bandit -r my_module

exit_bandit=$?

echo""

echo"======== pytest ========"

python -m pytest

exit_pytest=$?

echo""

echo"======== exit status ========"

echo"pylint: $exit_pylint, black: $exit_black, mypy: $exit_mypy, pydocstyle: $exit_pydocstyle, bandit: $exit_bandit, pytest: $exit_pytest"

! (( exit_pylint || exit_black || exit_mypy || exit_pydocstyle || exit_bandit || exit_pytest))

每个步骤都可以通过添加或更改命令标志来个性化。pyproject.toml否则,如果使用 Poetry,包配置也可以在文件中定义。

 

# [...] poetry configuration sections


[tool.black]

line-length = 88# default value but can be change to [79, 80 or any other]


[tool.pylint.messages_control]

good-names = ["df", "np", "pd"]


[tool.pylint.format]

max-line-length = 88


[tool.isort]

profile = "black"

line_length = 88


[tool.mypy]

no_implicit_optional = "False"


[tool.pydocstyle]

convention = "numpy"


# ...

例如,如果使用除 之外的文档字符串约定,请更改命令convention的选项。更改配置时请参阅软件包文档。pydocstylenumpy

请记住,某些没有适当配置的软件包可能不兼容。例如,黑色异色会相互纠正。为了防止这种情况,请定义profile = “black”isort

  • 语义版本控制

此外,你可以添加 QA 步骤来检查中定义的项目版本是否pyproject.toml有效且尚未使用。对于语义版本控制验证,semver可以使用库。此外,以下代码检查存储库中是否存在标签。


import git


repo = git.Repo(".git/")

new_tag = "0.1.1"


if new_tag in repo.tags:

print("Tag exists.")

else:

print("Tag doesn't exist")

运行质量检查

首先,赋予文件qa.sh执行权限:

chmod+x qa.sh

QA 脚本可以通过多种方式运行,例如:


./qa.sh



# or



bash qa.sh



# or



sh qa.sh

如果使用poetry包管理器,请记住添加poetry run,例如:poetry run ./qa.sh

在脚本输出结束时,将显示错误摘要。在理想的情况下,它看起来像这样:


======== exit status ========

pylint: 0, black: 0, mypy: 0, pydocstyle: 0, bandit: 0, pytest: 0
  • 何时运行 QA 脚本?

在将分支与主分支合并之前进行质量检查可能会导致许多错误、警告和……挫败感。

一个好的做法是每次将更改推送到分支时运行 QA 脚本。因此,您将能够持续控制代码的质量。任何错误或不符合标准的行为都将被及早发现。

例如,可以使用预提交挂钩

自动运行 QA 脚本。Git Hooks是Git在发生某些事件时可以自动执行的脚本。预提交挂钩意味着脚本将在您提交更改之前执行。为此,创建一个符号链接,如下所示:

ln -s ./qa.sh .git/hooks/pre-commit

另一个解决方案可能是在 CI/CD 管道中运行 QA 脚本。您不需要手动运行它,一切都是自动化的。为此,请考虑使用Github Actions或Bitbucket Pipelines 。

结论

在开发生命周期中发现错误越晚,对业务的影响就越严重。检测错误只是一回事。二是查找原因,修复bug。如果没有高质量的代码,调试就会变得复杂、耗时且成本高昂。更不用说团队成员士气低落,也没有工人急于接手修复任务。

因此,在项目中实施质量保证非常重要。在此过程中,不仅会检查代码的功能,还会检查是否符合公认的标准,例如代码格式约定。因此,代码更具可读性且易于维护。

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

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

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

相关文章

利用F.interpolate()函数进行插值操作

函数简介 功能: 利用插值方法,对输入的张量数组进行上\下采样操作,换句话说就是科学合理地改变数组的尺寸大小,尽量保持数据完整。 torch.nn.functional.interpolate(input, sizeNone, scale_factorNone, modenearest, align_c…

Node.JS有什么用?给谁用?怎么学?通俗易懂,超级详细!

现在,nodejs主要是前端的小伙伴来用的。前端小伙伴也不用说去怎么学node,而是把node当做是一个环境。我们利用这个环境去搭建上层的一些应用,去使用一些工具。就像学习Windows一样,我们没有必要深入了解Windows的每一个细节&#…

【解密!】终端安全管理软件究竟是什么?一文给您揭晓答案!

在数字化时代,随着企业信息化程度的不断提升,网络安全问题日益凸显。 终端作为网络连接的最后一环,其安全性直接关系到整个网络体系的安全与稳定。 那么,终端安全管理软件究竟是什么呢?本文将为您深入解析这一重要话…

Image matting入门

概念 matting就是扣图,本质是预测前景与背景,将前景扣出来。主要应用于影视行业,如拍电影绿幕扣图。和图像分割的区别在于多一个模糊地带,非01分类,变成了预测alpha通道。前景F,背景B,图像I可以…

数据结构与算法——Java实现 11.习题——有序链表去重

目录 82. 删除排序链表中的重复元素 II 方法1 方法2 要知道,每一颗钻石在被发现前,都要经受埋藏尘埃的寂寞时光 —— 24.9.23 82. 删除排序链表中的重复元素 II 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点&#xff0…

ActiveMQ 的传输协议机制

ActiveMQ 通过网络连接器这种连接机制来实现客户端与服务端之间的通信&#xff0c;ActiveMQ支持的传输协议在activeMQ 安装目录的 conf/activemq.xml中的<transportConnectors>标签之内。 ActiveMQ 支持的 client 端和 broker 端的通讯协议有&#xff1a;TCP、NIO、UDP、…

SpringBoot框架下的客户管理策略

1 绪论 1.1研究背景 随着网络不断的普及发展&#xff0c;企业客户管理系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从员工的实际需求出发&#xff0c;通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、行业类型管理、项目信息管理、…

Vue(16)——Vue3.3新特性

defineOptions 在 Vue 3.3 之前&#xff0c;如果需要在 <script setup> 中设置组件名&#xff0c;通常需要在额外的 <script> 标签中使用 Options API 进行配置。defineOptions 是 Vue 3.3 版本中引入的一个宏&#xff08;macro&#xff09;&#xff0c;它主要用于…

Oracle数据库中设置账户密码、创建新用户以及授权操作详解

目录 背景: 1.使用命令行方式进入控制台&#xff1a; 2. 连接Oracle数据库 3.修改Oracle数据库管理员的密码 4. 测试密码修改是否成功 5.创建Oracle数据库中的新用户、设置密码并授权 背景: 最近我安装了Oracle数据库&#xff0c;记录一下使用SQL命令来完成迹象关键操作…

Rust格式化输出宏

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 我们编写程序的目的就是对输入进行处理&#xff0c;然后将处理结果反馈给用户&#…

react组件入门

react应用程序就是由一个个组件搭建而成。组件有类组件和函数组件两种。 我们之前使用create-react-app创建了app&#xff0c;src下放的就是我们应用的源代码&#xff0c;我们基于这些已生成的文件&#xff0c;来学习和验证组件。 类组件 这里我们创建PostList.js更改这个ap…

C++ bitset(位图)的介绍和使用

文章目录 一、bitset的介绍1. 位图的引入2. 位图的概念3. 位图的应用场景 二、bitset的使用1. 定义方式2. 成员函数3. 运算符重载 一、bitset的介绍 1. 位图的引入 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是…

关于TrustedInstaller权限

前言 我们在在删除某些文件时会发现权限不够的情况&#xff0c;那是因为自从 Windows Vista 以来&#xff0c;为了提升安全性&#xff0c;微软对于权限的把控越来越紧。为了对抗恶意软件随意修改系统文件&#xff0c;Trustedinstaller 应运而生。 各权限之间的关系 普通人:Us…

鞋类分类系统源码分享

鞋类分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

事件【JavaScript】

1. 事件 事件是用户或浏览器动作的表示&#xff0c;JavaScript 中的一切交互都是通过事件来处理的。 2. 事件冒泡&#xff08;Event Bubbling&#xff09; 事件冒泡是指事件从最具体的元素&#xff08;即触发事件的元素&#xff09;开始触发&#xff0c;然后逐级向上传播到较…

LVGL 控件之消息框(lv_msgbox)

目录 一、概述二、消息框1、创建消息框2、获取消息框的组成部分3、关闭消息框部件4、消息框部件事件5、API 函数 一、概述 消息框部件是由多个小部件构建而成的&#xff0c;包括&#xff1a;lv_obj、lv_btn、lv_label 和 lv_btnmatrix 部件&#xff0c;示意图如下所示&#xf…

错误使用排序导致分页数据重复

1. 现象 分页返回数据的时候&#xff0c;发现第一页和第二页的数据有重复的&#xff0c;如姓名中的“某颖文”在第一和和第二页都显示了。 第一页&#xff1a; 第二页&#xff1a; 2. 原因 因为排序的的字段为“departmentCode”&#xff0c;该字段是重复不唯一的&#xff0…

GPIO之EMIO按键控制LED——ZYNQ学习笔记3

一、EMIO简介 ZYNQ GPIO 接口信号被分成四组&#xff0c;分别是从 BANK0 到 BANK3。其中 BANK0 和 BANK1 中共计 54个信号通过 MIO 连接到 ZYNQ 器件的引脚上&#xff0c;这些引脚属于 PS 端&#xff1b; 而 BANK2 和 BANK3 中共计 64 个信号则通过 EMIO 连接到了 ZYNQ 器件的 …

Spring Security学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

吸烟行为检测、重点区域吸烟检测、吸烟检测算法样本标注

吸烟检测算法主要用于公共场所、工作场所和家庭环境中的吸烟行为监控&#xff0c;通过图像识别技术来检测和识别吸烟行为&#xff0c;以确保环境卫生和公共安全。这种技术可以帮助管理者实时监控吸烟行为&#xff0c;及时采取措施&#xff0c;减少二手烟的危害。 一、技术实现…