什么是持续集成(CI)?持续集成(Continuous Integration,简称CI)是一种软件开发实践,指的是开发人员频繁地将代码集成到共享代码库中,通常是每天多次。每次集成后,系统会自动执行构建和自动化测试,以便及早发现并修复潜在的问题。
传统的软件开发流程中,团队成员往往会在本地独立开发一段时间,直到完成某个功能或一段时间的开发才提交代码。而这种做法可能导致集成问题,比如不同模块之间的不兼容、代码冲突等。而持续集成通过频繁地合并代码,最大化地减少了这些集成风险。
持续集成的核心理念
频繁集成:开发人员每次完成小的任务或功能时,都会将其代码提交到共享的代码仓库中。
自动化构建:每次代码提交后,系统会自动进行构建,确保代码能够正常编译。
自动化测试:构建完成后,自动化测试会对代码进行验证,检查是否存在回归错误或未捕捉的缺陷。
快速反馈:如果集成或测试失败,开发者会立即收到通知,从而能够及时修复问题。
持续集成的优势
提高代码质量:通过自动化测试和频繁集成,团队能够及早发现问题,并快速修复,减少了缺陷的积累。
降低集成风险:小的、频繁的集成减少了冲突和复杂性,使得集成更加平滑。
...
1. 项目目录结构在正式开始之前,先了解一下整个项目的目录结构,这样更容易理解代码的组织方式。完整的接口自动化测试框架目录结构如下:
1234567891011121314151617181920212223242526./pytest_api_testing_framework├── allure-results # allure测试结果├── config # 存放各环境配置文件│ ├── __init__.py│ ├── common_config.py│ ├── config.dev.ini│ ├── config.prod.ini│ └── config.sit.ini├── conftest.py # 全局共享的fixture├── data # 参数化├── logs # 日志│ └── 2024-11-25_TEST. ...
Allure是一款开源的工具,可以用图形化的方式展示测试结果
Allure的亮点有:
生成美观的图形化报告,清晰地展示测试结果和覆盖率。
支持多种测试框架,比如Pytest、JUnit、TestNG等。
还可以与CI/CD工具集成,生成容易分享的报告。
接下来,我们会看看如何安装Allure并和Pytest结合使用,一步步生成这些漂亮的报告。
1. 安装Allure及所需依赖首先,我们需要安装allure-pytest插件以及Allure本身。
安装Allure
安装allure-pytest插件
直接用pip安装插件:
1pip install allure-pytest
安装Allure命令行工具
Allure的命令行工具可以通过好几种方式安装,比如用brew(适用于macOS用户)或者从Allure的GitHub Releases页面下载安装包。
对于macOS用户,可以直接用Homebrew安装:
1brew install allure
Windows和Linux用户可以下载压缩包,然后把allure可执行文件加入到环境变量中,这样命令行就可以找到它。 ...
测试开发
未读Pytest进阶指南1. 断言Pytest内置了强大的断言机制,使测试代码变得简单直观。它会自动捕获断言失败的信息,并显示变量的具体值。
123456# 示例代码def test_division(): num = 10 divisor = 2 result = num / divisor assert result == 5 # Pytest会在失败时显示详细的比较信息
Pytest还支持自定义断言消息,用于在断言失败时提供更多上下文信息。
123def test_custom_message(): value = 4 assert value % 2 == 0, "Value should be an even number!"
自定义消息可以使测试失败时更加可读,尤其是在复杂逻辑下,帮助快速定位问题。
2. Fixture及其参数化FixtureFixture用于在测试执行前准备测试数据或环境,比如数据库连接、文件系统状态等。Fixture提供了强大的依赖注入功能,使测试代码简洁且易于复用。
123456789impo ...
测试开发
未读为什么选用 pytest?选择 pytest 的理由包括:
简单易用:编写测试用例只需普通的 Python 函数,无需继承特定类。
功能丰富:支持参数化、断言重写、插件扩展等功能。
活跃社区:拥有大量插件和丰富的社区支持。
兼容性:兼容 unittest 和 nose 测试框架。
安装 pytest使用 pip 安装 pytest:
1pip install pytest
查看版本查看当前安装的 pytest 版本:
1pytest --version
快速开始12345678# 文件名必须以 test_ 开头或结尾def add(x, y): return x + ydef test_add(): assert add(2, 3) == 5 # 测试通过 assert add(2, -3) == -1 # 测试通过 assert add(0, 0) == 1 # 测试失败
运行测试:
1pytest
结果显示:
12345678____________________________ test_add __________________ ...
1. 文件上传文件上传通常通过 POST 请求完成,服务端需要从请求中接收文件数据。
基本文件上传使用 files 参数上传文件:
1234567import requestsurl = 'https://example.com/upload'files = {'file': open('example.txt', 'rb')} # rb 模式读取文件response = requests.post(url, files=files)print(response.status_code) # 检查响应状态码print(response.text) # 打印服务端返回的消息
上传多个文件通过字典传递多个文件:
123456files = { 'file1': open('example1.txt', 'rb'), 'file2': open('example ...
测试开发
未读1. requests 模块简介requests 是一个基于 Python 的第三方库,主要用于发送 HTTP 请求,特点如下:
易用性:简单的 API,降低了 HTTP 操作的复杂性。
灵活性:支持多种请求方法(GET、POST、PUT、DELETE 等)。
扩展性:支持自定义请求头、Cookies、代理等。
安装方式:
1pip install requests
2. 如何发送 GET 和 POST 请求发送 GET 请求GET 请求用于从服务器获取数据,示例如下:
123456import requestsurl = 'https://jsonplaceholder.typicode.com/posts/1'response = requests.get(url)print(response.status_code) # 输出状态码print(response.json()) # 输出 JSON 格式的响应体
通过parms传递查询参数:
123params = {'userId': 1}resp ...
1. 什么是接口?接口(API, Application Programming Interface)是不同软件系统或模块之间的通信桥梁,通常用于:
前后端通信:例如前端通过接口获取后端数据。
系统集成:不同服务之间的数据交换与操作。
接口分类
RESTful API:基于 HTTP 的接口风格,广泛应用于 Web 开发。
SOAP API:基于 XML 的协议,适用于复杂场景。
RPC API:远程过程调用接口,适用于高效通信。
接口测试的意义在当今敏捷开发和DevOps盛行的时代,快速、高效地交付高质量的软件产品已成为共识。接口(API)作为前后端交互和服务通信的桥梁,其稳定性和可靠性至关重要。接口自动化测试具有以下优势:
提高测试效率: 自动化测试可以快速执行大量测试用例,减少人工重复劳动。
及时发现问题: 早期发现接口的功能和性能问题,降低修复成本。
支持持续集成: 与CI/CD工具集成,实现自动化的构建、测试和部署流程。
2. HTTP 协议基础与接口通信原理接口测试中,HTTP 协议是最常用的通信协议。了解其基础原理有助于更好地分析和测试接口。
HTT ...
1. 数据迁移简介数据迁移主要用于以下场景:
自动创建或更新数据库表。
管理表的索引、外键等结构。
删除或重命名表或字段。
自动迁移AutoMigrate 是 GORM 提供的自动迁移功能,用于根据模型定义创建或更新数据库表。
示例:自动迁移12345678910111213141516171819202122232425package mainimport ( "gorm.io/driver/mysql" "gorm.io/gorm" "log")type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"size:100"` Email string `gorm:"unique"`}func main() { dsn := "user:password@tcp(127.0.0.1:3306)/db ...
1. 一对一关系在一对一关系中,一个实体与另一个实体之间存在唯一映射关系。例如,一个用户对应一个地址。
定义模型1234567891011type User struct { ID uint Name string Address Address `gorm:"foreignKey:UserID"`}type Address struct { ID uint UserID uint Street string}
foreignKey:指定外键字段。
插入数据12345user := User{ Name: "Alice", Address: Address{Street: "123 Main St"},}db.Create(&user)
查询数据123var user Userdb.Preload("Address").First(&a ...