后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载导读本篇指南围绕 nonebot2 生态中基于nonebot-plugin-orm开发的数据库插件讲解如何借助 GitHub Actions 的矩阵matrix与 services 容器在 SQLite、PostgreSQL、MySQL 等不同数据库后端上自动运行测试并进一步组合跨平台、跨 Python 版本维度构建一套可持续验证插件兼容性的 CI 流水线。读完本文你将掌握两套可直接复制的test.yml工作流、矩阵组合的取舍策略以及 nonebot2 仓库自身在 pytest 配置与并行测试上的实践细节。为什么需要多数据库后端测试nonebot-plugin-orm是 NoneBot 的数据库支持插件它本身只提供 ORM 功能并不内置数据库后端用户可以根据需要选择 SQLite、PostgreSQL、MySQL / MariaDB 等不同后端参见 数据库指南。正如百思不如一试——不同用户会有不同的数据库配置如果只在开发机上用单一后端测试发布到真实环境后很可能遇到方言差异、连接池行为差异等问题。为了提高项目的兼容性我们需要在不同数据库后端上测试插件。手动进行大量、重复的测试既不可靠也不现实因此社区推荐使用 CI 服务如 GitHub Actions做自动化测试每次代码推送到主分支就自动在多种后端上跑一遍完整测试任何一端失败都能立即暴露问题。基础工作流单一平台上的数据库矩阵最直接的思路是让同一份测试在多个数据库后端上各跑一遍。下面的工作流在ubuntu-latest上通过strategy.matrix定义三种数据库连接 URL分别对应 SQLite、PostgreSQL、MySQLname: Test on: push: branches: - main jobs: test: runs-on: ubuntu-latest strategy: matrix: db: - sqliteaiosqlite:///db.sqlite3 - postgresqlpsycopg://postgres:postgreslocalhost:5432/postgres - mysqlaiomysql://mysql:mysqllocalhost:3306/mymysql fail-fast: false env: SQLALCHEMY_DATABASE_URL: ${{ matrix.db }} services: postgresql: image: ${{ startsWith(matrix.db, postgresql) postgres || }} env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres ports: - 5432:5432 mysql: image: ${{ startsWith(matrix.db, mysql) mysql || }} env: MYSQL_ROOT_PASSWORD: mysql MYSQL_USER: mysql MYSQL_PASSWORD: mysql MYSQL_DATABASE: mymysql ports: - 3306:3306 steps: - uses: actions/checkoutv4 - uses: actions/setup-pythonv5 - name: Install dependencies run: pip install -r requirements.txt - name: Run migrations run: pipx run nb-cli orm upgrade - name: Run tests run: pytest逐段拆解这个工作流的关键设计矩阵与连接 URLmatrix.db直接使用 SQLAlchemy 的连接 URL 语法这正是nonebot-plugin-orm配置项SQLALCHEMY_DATABASE_URL的取值格式dialectdriver://username:passwordhost:port/database参见 用户指南。SQLite 使用sqliteaiosqlite:///db.sqlite3这种文件型 URLPostgreSQL 使用postgresqlpsycopg://MySQL 使用mysqlaiomysql://。环境变量注入env.SQLALCHEMY_DATABASE_URL: ${{ matrix.db }}把矩阵值注入环境变量插件与 ORM 在测试进程中读取该变量即可切换到对应后端无需修改任何代码。services 容器PostgreSQL 与 MySQL 是独立数据库后端CI 中通过services启动临时容器。image字段使用startsWith(matrix.db, postgresql) postgres || 这类表达式只有矩阵项对应的服务才会真正启动——例如跑 SQLite 时两个服务都以空镜像名跳过跑 PostgreSQL 时只启动 postgres 容器从而节省资源。迁移步骤pipx run nb-cli orm upgrade借助 nb-cli 脚手架执行nonebot-plugin-orm的迁移命令先把数据库模式同步到位再跑测试模拟真实用户安装插件后的操作nb orm upgrade的完整用法见 用户指南。fail-fast: false关闭快速失败。这样某个后端失败时其余后端的测试仍会继续执行一次提交就能看到所有后端的完整结果而不是被最先失败的一端打断。跨平台与跨 Python 版本的矩阵组合如果项目还需要考虑跨平台和跨 Python 版本兼容测试矩阵需要增加这两个维度。但没有必要在所有平台和 Python 版本上运行所有数据库的测试原因很直接PostgreSQL 和 MySQL 这类独立的数据库后端不会受平台和 Python 版本影响重复在每种组合下测试只是浪费 CI 时间GitHub Actions 的非 Linux 平台Windows、macOS不支持运行独立服务容器因此数据库后端测试只能在 Linux 上做。据此可以设计出下面的测试覆盖矩阵Python 3.9Python 3.10Python 3.11Python 3.12LinuxSQLiteSQLiteSQLiteSQLite / PostgreSQL / MySQLWindowsSQLiteSQLiteSQLiteSQLitemacOSSQLiteSQLiteSQLiteSQLite策略是所有平台 × 所有 Python 版本都跑 SQLite用于发现平台与解释器相关的问题独立的数据库后端只在 Linux 最新 Python3.12上跑一次用于发现 SQL 方言与后端差异问题。这样用最小的 CI 开销覆盖了最大的问题面。对应的工作流使用matrix.include在基础矩阵上追加特例name: Test on: push: branches: - main jobs: test: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] python-version: [3.9, 3.10, 3.11, 3.12] db: [sqliteaiosqlite:///db.sqlite3] include: - os: ubuntu-latest python-version: 3.12 db: postgresqlpsycopg://postgres:postgreslocalhost:5432/postgres - os: ubuntu-latest python-version: 3.12 db: mysqlaiomysql://mysql:mysqllocalhost:3306/mymysql fail-fast: false env: SQLALCHEMY_DATABASE_URL: ${{ matrix.db }} services: postgresql: image: ${{ startsWith(matrix.db, postgresql) postgres || }} env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres ports: - 5432:5432 mysql: image: ${{ startsWith(matrix.db, mysql) mysql || }} env: MYSQL_ROOT_PASSWORD: mysql MYSQL_USER: mysql MYSQL_PASSWORD: mysql MYSQL_DATABASE: mymysql ports: - 3306:3306 steps: - uses: actions/checkoutv4 - uses: actions/setup-pythonv5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: pip install -r requirements.txt - name: Run migrations run: pipx run nb-cli orm upgrade - name: Run tests run: pytest这个版本相比基础工作流的变化runs-on: ${{ matrix.os }}让每个矩阵项运行在对应的操作系统上setup-python通过python-version: ${{ matrix.python-version }}安装矩阵指定的解释器版本基础矩阵只包含sqliteaiosqlite:///db.sqlite33 个平台 × 4 个 Python 版本共 12 个组合include再追加两个 Linux Python 3.12 的 PostgreSQL / MySQL 组合。GitHub Actions 会把 include 的条目与基础矩阵条目合并最终得到 14 个测试任务。需要注意include中追加的项会与当前已存在的矩阵组合去重合并如果某个 include 项的os/python-version/db组合已由基础矩阵产生它就不会重复执行。这正是基础矩阵全跑 SQLite、数据库后端只在 Linux 3.12 补测的实现方式。仓库实践佐证nonebot2 自身的测试配置nonebot2 仓库本身就是这套思路的落地范例它的测试基础设施与上述 CI 工作流直接呼应可作为插件项目配置的参照。pytest 配置仓库根目录 pyproject.toml 中声明了[tool.pytest.ini_options][tool.pytest.ini_options] addopts --covnonebot --cov-reportterm-missing filterwarnings [error, ignore::DeprecationWarning]addopts默认开启覆盖率统计--covnonebotCI 里可以直接看到哪些模块未被覆盖filterwarnings [error, ...]把警告升级为错误强制代码保持干净避免 DeprecationWarning 在后续版本变成真错误测试依赖中声明了 pytest-cov 与 pytest-xdist后者用于并行执行测试。测试入口脚本仓库的 scripts/run-tests.sh 展示了实际执行测试的方式#!/usr/bin/env bash # cd to the root of the tests cd $(dirname $0)/../tests # Run the tests pytest -n auto --cov-append --cov-report xml --junitxml./junit.xml $其中-n auto让 pytest-xdist 自动并行--junitxml./junit.xml输出 JUnit 格式报告——这正是 CI 面板渲染测试结果所需的格式。如果你的插件项目也涉及异步代码可以像 nonebot2 的 tests/conftest.py 一样借助 nonebug 等测试工具初始化 NoneBot 应用再在pytest中直接运行测试。本地复现 CI 行为CI 的本质是把本地测试自动化。开发阶段建议先在本地把多后端矩阵手动跑一遍作为快速反馈环分别用sqliteaiosqlite:///db.sqlite3、postgresqlpsycopg://...、mysqlaiomysql://...设置SQLALCHEMY_DATABASE_URL环境变量或用本机 Docker 起 PostgreSQL / MySQL依次执行nb orm upgrade与pytest确认无误后再推送到远端触发 CI。迁移与测试的配合测试数据库的状态依赖迁移。CI 工作流中的pipx run nb-cli orm upgrade对应nonebot-plugin-orm的升级命令它会把所有插件分支升级到最新版本。相关的常用命令详见 用户指南nb orm upgrade # 升级数据库CI 中在跑测试前执行 nb orm check # 检查数据库模式是否与模型定义一致 nb orm heads # 查看各插件分支的迁移头部在开发阶段频繁修改模型时可以在.env.dev中关闭启动检查ALEMBIC_STARTUP_CHECKfalse此时每次启动机器人都会自动同步数据库模式减少手动迁移的负担但生产环境和 CI 中应保持检查开启让nb orm upgrade显式、可复现地推进模式变更——迁移脚本记录模式变化正如 git 记录代码变化可参考 开发者指南 中关于首次迁移与迁移脚本的完整示例。小结与检查清单为数据库插件搭建自动化测试 CI核心思路可以总结为后端矩阵用matrix.db定义 SQLite / PostgreSQL / MySQL 的连接 URL通过SQLALCHEMY_DATABASE_URL环境变量注入配合services容器按需启动独立数据库组合取舍独立数据库后端与平台、Python 版本无关只在 Linux 最新 Python 上补测即可SQLite 则在所有平台 × 所有 Python 版本上跑matrix.include是完成这种基础矩阵 特例组合的标准写法流程完整checkout→setup-python→pip install→nb orm upgrade迁移→pytest测试迁移必须先行否则测试会因表不存在而失败细节控制fail-fast: false保证一个后端失败不影响其余后端的结果展示filterwarnings、覆盖率、JUnit 报告等 pytest 配置能让 CI 输出更有诊断价值。按照上述工作流配置后每次提交代码都会自动在多种数据库后端、多种平台和 Python 版本上验证插件将不同用户的配置差异转化为可被自动化发现的真实缺陷这正是多后端测试的意义所在。赞分享后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载相关推荐NoneBot 插件数据库多后端自动化测试基于 GitHub Actions 的完整实践指南NoneBot 插件数据库多后端自动化测试基于 GitHub Actions 的完整实践指南 本指南面向使用 nonebot plugin orm 开发数据库后端即时通讯ares高级玩法 shader配置、多磁盘加载与存档管理技巧ares高级玩法 shader配置、多磁盘加载与存档管理技巧 ares是一款跨平台开源多系统模拟器专注于精度和游戏保存。本文将为你介绍ares模拟器的高级玩游戏开发桌面应用AI总在拒绝你的创作灵感这款无审查开源多模态模型把创作自由还给了你AI总在拒绝你的创作灵感这款无审查开源多模态模型把创作自由还给了你 抱歉这个请求我不能帮你完成。——做创意的人大概都听腻了这句话。今天要聊的 Qw上一篇如何设计客制化机械键盘PCBHelloWord-Keyboard完整指南下一篇weibaohui/kom消息队列Kafka与RabbitMQ管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考