当前位置: 首页 > article >正文

接口自动化测试框架搭建:基于Python+Requests+Pytest的实战教程

在软件测试领域接口自动化测试是保障系统稳定性、提升测试效率的关键手段。随着敏捷开发和DevOps理念的普及自动化测试的重要性愈发凸显。Python凭借其简洁的语法、丰富的库生态成为接口自动化测试的首选语言Requests库让HTTP请求的发送变得简单高效Pytest则以其灵活的用例管理、强大的断言机制和丰富的插件生态成为测试框架的佼佼者。本文将从专业角度详细介绍如何基于PythonRequestsPytest搭建一套高效、可扩展的接口自动化测试框架。一、框架搭建前的准备工作1.1 环境配置工欲善其事必先利其器。搭建框架前需要确保开发环境的正确配置Python环境推荐使用Python 3.8及以上版本该版本在Windows、MacOS和Linux系统上均有良好的兼容性且能较好地支持后续所需的第三方库。可以通过Python官方网站下载安装包或使用Pyenv、Miniconda等工具进行版本管理避免不同项目之间的环境冲突。虚拟环境创建为了隔离不同项目的依赖建议创建虚拟环境。在项目根目录下执行以下命令python -m venv venv # Linux/Mac系统激活虚拟环境 source venv/bin/activate # Windows系统激活虚拟环境 venv\Scripts\activate.bat核心依赖安装激活虚拟环境后安装框架所需的核心库。执行以下命令pip install pytest7.4.0 requests2.31.0 allure-pytest2.13.2 pytest-html4.1.1pytest测试框架核心用于用例管理、执行和断言。requests发送HTTP请求的库支持GET、POST、PUT、DELETE等多种请求方式。allure-pytest生成Allure测试报告的插件提供美观、详细的可视化报告。pytest-html生成HTML格式的测试报告方便快速查看测试结果。1.2 项目目录结构设计合理的目录结构是框架可维护性和扩展性的基础。经过多个项目的实践验证以下目录结构具有较高的实用性api_auto_test/ ├── config/ # 配置文件目录 │ ├── __init__.py │ ├── global_config.py # 全局配置变量如环境地址、超时时间等 │ └── pytest.ini # Pytest配置文件 ├── testcases/ # 测试用例目录 │ ├── __init__.py │ ├── test_user_api.py # 用户模块接口测试用例 │ └── test_order_api.py # 订单模块接口测试用例 ├── utils/ # 工具类目录 │ ├── __init__.py │ ├── request_util.py # 请求工具类封装HTTP请求方法 │ └── assert_util.py # 断言工具类封装自定义断言方法 ├── resources/ # 测试数据目录 │ ├── __init__.py │ ├── user_data.yaml # 用户模块测试数据 │ └── order_data.json # 订单模块测试数据 ├── reports/ # 测试报告目录 │ ├── html/ # HTML报告存放路径 │ └── allure/ # Allure报告原始数据存放路径 ├── logs/ # 日志文件目录 ├── requirements.txt # 项目依赖清单 └── run.py # 测试执行入口config目录存放全局配置信息通过global_config.py统一管理不同环境的地址、接口超时时间等参数方便环境切换。pytest.ini用于配置Pytest的运行参数如测试用例发现规则、报告生成路径等。testcases目录按照业务模块划分测试用例每个模块对应一个测试文件便于维护和扩展。utils目录封装通用的工具方法如请求发送、断言验证等提高代码复用率。resources目录存放测试数据支持YAML、JSON等格式实现测试数据与代码的分离便于非技术人员维护测试数据。reports目录存放测试报告分为HTML和Allure两种格式满足不同场景的需求。logs目录记录测试执行过程中的日志信息便于问题排查。requirements.txt记录项目依赖的库及其版本方便团队成员快速搭建一致的开发环境。run.py作为测试执行的入口通过代码方式配置Pytest的运行参数实现一键执行测试。二、核心模块封装2.1 请求工具类封装Requests库虽然使用简单但在实际项目中直接使用其原生方法会导致代码冗余且不利于统一管理请求头、超时时间、异常处理等。因此需要对Requests进行二次封装实现请求的标准化和统一化。在utils/request_util.py中封装请求工具类import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry from config.global_config import GlobalConfig class RequestUtil: def __init__(self): self.session requests.Session() # 配置重试机制 retry Retry( totalGlobalConfig.RETRY_TIMES, backoff_factorGlobalConfig.BACKOFF_FACTOR, status_forcelist[500, 502, 503, 504] ) adapter HTTPAdapter(max_retriesretry) self.session.mount(http://, adapter) self.session.mount(https://, adapter) # 设置默认超时时间 self.timeout GlobalConfig.TIMEOUT def send_request(self, method, url, **kwargs): 发送HTTP请求 :param method: 请求方法如GET、POST、PUT、DELETE等 :param url: 请求地址 :param kwargs: 其他请求参数如headers、params、json、data等 :return: 响应对象 try: response self.session.request( methodmethod.upper(), urlurl, timeoutself.timeout, **kwargs ) response.raise_for_status() # 抛出HTTP错误异常 return response except requests.exceptions.RequestException as e: print(f请求发送失败: {str(e)}) raise上述代码中通过Session对象建立持久连接提高请求效率配置重试机制当遇到500、502等服务器错误时自动重试指定次数设置默认超时时间避免请求长时间阻塞捕获并处理请求过程中的异常确保测试用例的稳定性。2.2 断言工具类封装Pytest支持使用Python原生的assert语句进行断言但在实际项目中原生断言的错误信息不够直观不利于问题定位。因此需要封装自定义的断言方法提供更详细的错误提示。在utils/assert_util.py中封装断言工具类class AssertUtil: staticmethod def assert_equal(actual, expected, msgNone): 断言两个值相等 :param actual: 实际结果 :param expected: 预期结果 :param msg: 断言失败时的提示信息 try: assert actual expected, msg or f实际结果: {actual} 与预期结果: {expected} 不相等 except AssertionError as e: print(f断言失败: {str(e)}) raise staticmethod def assert_in(actual, expected, msgNone): 断言预期结果包含在实际结果中 :param actual: 实际结果 :param expected: 预期包含的内容 :param msg: 断言失败时的提示信息 try: assert expected in actual, msg or f预期内容: {expected} 未在实际结果: {actual} 中找到 except AssertionError as e: print(f断言失败: {str(e)}) raise staticmethod def assert_status_code(response, expected_code): 断言响应状态码 :param response: 响应对象 :param expected_code: 预期状态码 try: assert response.status_code expected_code, \ f响应状态码错误实际状态码: {response.status_code}预期状态码: {expected_code} except AssertionError as e: print(f断言失败: {str(e)}) raise通过封装这些断言方法在测试用例中调用时能够得到更清晰的错误提示提高问题排查效率。2.3 配置文件管理在config/global_config.py中定义全局配置变量实现不同环境的统一管理class GlobalConfig: # 环境配置 ENV test # 测试环境test、pre、prod BASE_URLS { test: https://test.example.com/api, pre: https://pre.example.com/api, prod: https://example.com/api } BASE_URL BASE_URLS[ENV] # 请求配置 TIMEOUT 10 # 请求超时时间单位秒 RETRY_TIMES 3 # 请求重试次数 BACKOFF_FACTOR 1 # 重试间隔时间系数 # 日志配置 LOG_LEVEL INFO LOG_FORMAT %(asctime)s - %(name)s - %(levelname)s - %(message)s通过修改ENV变量即可快速切换测试环境无需在多个测试文件中逐一修改接口地址大大提高了环境切换的效率。三、测试用例编写3.1 测试用例设计原则编写测试用例时应遵循以下原则单一职责原则每个测试用例只关注一个功能点确保用例的独立性和可维护性。覆盖全面原则覆盖正常场景、异常场景和边界场景确保接口的稳定性和健壮性。数据驱动原则将测试数据与测试代码分离通过YAML、JSON等文件管理测试数据提高用例的复用性和灵活性。3.2 测试用例编写示例以用户模块的登录接口为例在testcases/test_user_api.py中编写测试用例import pytest from utils.request_util import RequestUtil from utils.assert_util import AssertUtil from config.global_config import GlobalConfig import yaml # 加载测试数据 with open(resources/user_data.yaml, r, encodingutf-8) as f: user_data yaml.safe_load(f) class TestUserAPI: def setup_class(self): 测试类初始化方法在所有测试方法执行前执行一次 self.request_util RequestUtil() self.assert_util AssertUtil() self.login_url f{GlobalConfig.BASE_URL}/user/login pytest.mark.parametrize(case, user_data[login_success_cases]) def test_login_success(self, case): 登录接口正常场景测试 # 发送请求 response self.request_util.send_request( methodPOST, urlself.login_url, jsoncase[request_data] ) # 断言响应状态码 self.assert_util.assert_status_code(response, case[expected_code]) # 断言响应内容 response_json response.json() self.assert_util.assert_in(token, response_json, 登录成功未返回token) self.assert_util.assert_equal(response_json[code], case[expected_code], 响应码与预期不符) pytest.mark.parametrize(case, user_data[login_fail_cases]) def test_login_fail(self, case): 登录接口异常场景测试 # 发送请求 response self.request_util.send_request( methodPOST, urlself.login_url, jsoncase[request_data] ) # 断言响应状态码 self.assert_util.assert_status_code(response, case[expected_code]) # 断言响应内容 response_json response.json() self.assert_util.assert_equal(response_json[code], case[expected_code], 响应码与预期不符) self.assert_util.assert_equal(response_json[msg], case[expected_msg], 响应提示信息与预期不符) 测试数据文件resources/user_data.yaml内容如下 login_success_cases: - case_name: 正确用户名和密码登录 request_data: username: test_user password: test123 expected_code: 200 expected_msg: 登录成功 login_fail_cases: - case_name: 用户名不存在 request_data: username: invalid_user password: test123 expected_code: 400 expected_msg: 用户名不存在 - case_name: 密码错误 request_data: username: test_user password: wrong_password expected_code: 400 expected_msg: 密码错误通过pytest.mark.parametrize装饰器实现数据驱动测试将测试数据与测试代码分离提高了用例的复用性和灵活性。每个测试用例只关注一个场景确保了用例的独立性和可维护性。四、测试执行与报告生成4.1 测试执行在项目根目录下创建run.py文件作为测试执行的入口import pytest import os if __name__ __main__: # 配置测试报告路径 html_report_path os.path.join(reports, html, report.html) allure_report_path os.path.join(reports, allure) # 构建Pytest命令行参数 args [ testcases/, -v, # 显示详细的测试结果 --html html_report_path, # 生成HTML报告 --alluredir allure_report_path, # 生成Allure报告原始数据 --clean-alluredir # 清空之前的Allure报告数据 ] # 执行测试 pytest.main(args)运行run.py文件即可执行所有测试用例。执行过程中Pytest会自动发现testcases目录下的测试用例并按照配置生成测试报告。4.2 测试报告查看HTML报告测试执行完成后打开reports/html/report.html文件即可查看HTML格式的测试报告。报告中包含了测试用例的执行结果、执行时间、失败用例的详细信息等便于快速查看测试结果。Allure报告生成Allure报告需要先安装Allure命令行工具安装完成后在项目根目录下执行以下命令allure serve reports/allure命令执行后会启动一个本地服务器并在浏览器中打开Allure报告。Allure报告提供了更丰富的可视化信息如测试用例的执行趋势、失败用例的堆栈信息、测试覆盖率等便于深入分析测试结果。五、框架扩展与优化5.1 日志功能集成在测试执行过程中日志信息对于问题排查至关重要。可以使用Python的logging模块封装日志工具类实现日志的记录和管理。在utils/log_util.py中封装日志工具类import logging from config.global_config import GlobalConfig import os class LogUtil: def __init__(self, logger_name): self.logger logging.getLogger(logger_name) self.logger.setLevel(GlobalConfig.LOG_LEVEL) # 避免重复添加处理器 if not self.logger.handlers: # 创建日志文件目录 if not os.path.exists(logs): os.makedirs(logs) # 创建文件处理器 file_handler logging.FileHandler( os.path.join(logs, test.log), encodingutf-8 ) file_handler.setLevel(GlobalConfig.LOG_LEVEL) # 创建控制台处理器 console_handler logging.StreamHandler() console_handler.setLevel(GlobalConfig.LOG_LEVEL) # 创建日志格式器 formatter logging.Formatter(GlobalConfig.LOG_FORMAT) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) # 添加处理器到日志器 self.logger.addHandler(file_handler) self.logger.addHandler(console_handler) def get_logger(self): return self.logger在请求工具类和测试用例中集成日志功能记录请求的发送、响应的返回以及断言的结果等信息便于问题排查。5.2 持续集成集成将接口自动化测试框架与Jenkins、GitLab CI等持续集成工具集成实现代码提交后自动触发测试提高测试效率。以Jenkins为例配置步骤如下在Jenkins中创建一个新的任务选择“自由风格项目”。在“源码管理”中配置Git仓库地址拉取测试代码。在“构建环境”中配置Python虚拟环境激活虚拟环境并安装依赖。在“构建”步骤中执行python run.py命令启动测试。在“构建后操作”中配置Allure报告的展示便于查看测试结果。通过持续集成集成实现了测试的自动化执行确保了代码的质量和稳定性。六、总结基于PythonRequestsPytest搭建的接口自动化测试框架具有简洁高效、可扩展性强、易于维护等优点。通过合理的目录结构设计、核心模块的封装、测试用例的规范编写以及测试报告的生成能够有效提升接口自动化测试的效率和质量。同时通过框架的扩展与优化如日志功能集成、持续集成集成等进一步增强了框架的实用性和稳定性。在实际项目中应根据项目的具体需求对框架进行适当的调整和优化以满足项目的测试需求。

相关文章:

接口自动化测试框架搭建:基于Python+Requests+Pytest的实战教程

在软件测试领域,接口自动化测试是保障系统稳定性、提升测试效率的关键手段。随着敏捷开发和DevOps理念的普及,自动化测试的重要性愈发凸显。Python凭借其简洁的语法、丰富的库生态,成为接口自动化测试的首选语言;Requests库让HTTP…...

【亲测免费】 ADS1118驱动程序

ADS1118驱动程序 【下载地址】ADS1118驱动程序 本仓库提供了专用于ADS1118模数转换器(ADC)的驱动程序。ADS1118是一款高性能、高精度的16位模拟到数字转换器,广泛应用于需要精准测量的应用场景中,例如传感器数据采集系统、医疗设备…...

Auto Edit 日常迭代踩坑实录:OpenAI Codex CLI 三种权限模式配置差异与 2 类高频报错修复

1. Auto Edit 模式不是“全自动”,而是最易失控的权限模式 大多数人第一次在项目里启用 codex cli --mode=auto-edit,是冲着“自动改代码”去的。我也是。直到某天凌晨两点,CI 流水线突然报出 17 个 test failure,而 git diff 显示——它把一个 if (user.role === admin) …...

SAP EWM实战:从产品到处理单位,两种库存转移操作保姆级教程

SAP EWM库存转移实战指南:产品与处理单位的精准操作 在仓库管理的日常工作中,库存转移是最基础却最容易出错的环节之一。特别是对于刚接触SAP EWM系统的管理员来说,面对不同形态的物料——散件产品和带包装的处理单位(HU),往往会产…...

Cadence Allegro实战:除了Shape Keepout,还有哪些方法能精准控制铺铜区域?

Cadence Allegro实战:5种精准控制铺铜区域的进阶技巧 在复杂PCB设计中,铺铜区域的控制往往决定了信号完整性和EMC性能。Shape Keepout虽然是设计师最熟悉的工具,但Allegro其实提供了更丰富的"Areas"类命令集。本文将深入解析Route …...

别再傻傻分不清了!给硬件工程师的SI、PI、EMI关系速查手册(附高频PCB设计实例)

硬件工程师实战指南:SI、PI、EMI的三角关系与高频PCB设计避坑 当你第一次面对DDR4布线导致的EMI测试失败时,可能会陷入这样的困惑:明明是信号完整性问题,为什么整改方案却是调整电源层的去耦电容?这种看似跨领域的因果…...

从零开始用vnpy搭建你的第一个量化交易机器人(保姆级Python教程)

从零开始用vnpy搭建你的第一个量化交易机器人(保姆级Python教程) 第一次接触量化交易时,我被那些复杂的术语和代码吓得不轻。直到发现vnpy这个Python框架,才真正找到了入门的方向。vnpy就像是为Python开发者量身定制的量化交易工具…...

别再只用BLAST了!试试MAFFT+HMMER这套组合拳,挖掘基因家族新成员更精准

基因家族分析进阶指南:MAFFT与HMMER的高效组合策略 在基因组学研究领域,识别基因家族成员是一项基础而关键的工作。传统方法如BLAST虽然广为人知,但在面对远缘同源基因或高度分化的基因家族时,其灵敏度往往不尽如人意。这时&#…...

别再手动复制粘贴了!用poi-tl + Spring Boot自动生成带表格、二维码的Word领料单(附完整源码)

基于poi-tl的Spring Boot领料单自动化生成实战指南 在企业日常运营中,领料单这类标准化文档的生成往往占据大量重复性工作时间。传统的手工复制粘贴不仅效率低下,还容易出错。本文将介绍如何利用poi-tl这一强大的Word模板引擎,结合Spring Bo…...

Solidworks 2018+ 机器人模型避坑指南:用SW2URDF插件导出URDF,再导入Webots R2023a完整流程

SolidWorks 2018机器人模型导入Webots全流程避坑指南 在机器人仿真领域,将SolidWorks设计的机械模型准确导入Webots仿真环境是一个关键但充满挑战的环节。许多工程师和学生在初次尝试这一流程时,往往会在版本兼容性、文件路径、坐标系设置等环节遭遇各种…...

如何高效下载B站视频:BiliDownloader终极使用教程

如何高效下载B站视频:BiliDownloader终极使用教程 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 想要轻松保存B站上的精彩视频内容…...

【亲测免费】 YMODEM发送端程序C代码

YMODEM发送端程序C代码 【下载地址】YMODEM发送端程序C代码 YMODEM发送端程序C代码 项目地址: https://gitcode.com/open-source-toolkit/8ede80 资源文件介绍 文件名 YMODEM.7z 文件描述 本资源文件包含了一个完整的YMODEM发送端程序的C代码,适用于STM3…...

芯片与封装热协同设计:当“先进制程”遇上“散热墙”

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 211、985硕士,从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作,涉足消费电子、新能源、医疗设备、制药信息化、核工业等…...

告别黑盒:手把手教你用VTK在QT中‘组装’并驱动SolidWorks导出的机械臂模型

从STL零件到可交互机械臂:VTKQT三维可视化开发实战 机械臂的数字化仿真一直是工业自动化与机器人教学中的核心课题。想象一下,当你从SolidWorks中导出一堆零散的STL文件,如何在代码中让它们"活"起来——每个关节都能独立旋转&#…...

别再为测试视频发愁了!手把手教你用FFmpeg生成YUV/RGB原始数据(附播放命令)

音视频开发实战:FFmpeg高效生成与播放YUV/RGB测试素材指南 在音视频编解码器开发、计算机视觉算法测试或多媒体性能调优过程中,开发者经常面临一个共同难题:如何快速获取特定像素格式的原始视频数据作为测试素材?网上现成的YUV或R…...

【亲测免费】 Python Qt 图形界面编程资源下载

Python Qt 图形界面编程资源下载 【下载地址】PythonQt图形界面编程资源下载 《Python Qt 图形界面编程》课程涵盖了PySide2、PyQt5、PyQt和PySide等框架的使用,帮助学习者掌握Python图形化界面编程的核心知识。课程内容详实,适合初学者入门,…...

【免费下载】 MobaXterm 专业版 - 无Session限制免费版

MobaXterm 专业版 - 无Session限制免费版 【下载地址】MobaXterm专业版-无Session限制免费版 MobaXterm 专业版 - 无Session限制免费版欢迎使用MobaXterm专业版特别资源 项目地址: https://gitcode.com/open-source-toolkit/9ce1a 欢迎使用MobaXterm专业版特别资源。此版…...

告别WinForm!用C#和MetroFramework快速搭建现代化工控上位机UI(附完整源码)

用C#和MetroFramework打造现代化工控上位机界面的实战指南 在工业自动化领域,上位机软件的用户体验往往被忽视。许多工程师仍然在使用传统的WinForm开发界面,这些界面虽然功能完备,但视觉效果和交互体验已经远远落后于现代软件的标准。本文将…...

告别默认设置!用Altium Designer 21规则模板,5分钟搞定四层板全流程设计规范

告别重复劳动:Altium Designer 21规则模板的高效应用指南 在电子设计领域,效率与标准化往往决定了项目成败。想象一下这样的场景:当你接手一个新的四层板设计项目时,是否曾为反复配置那些看似相同却又容易遗漏的设计规则而烦恼&a…...

Sparse4D v3 去噪模块实战:手把手教你用PyTorch实现3D时序目标检测中的噪声抑制

Sparse4D v3去噪模块深度解析:从理论到PyTorch实战 1. 三维目标检测中的噪声挑战与去噪机制演进 在自动驾驶和机器人感知领域,三维目标检测系统面临着复杂的噪声环境。传感器噪声、遮挡、光照变化以及物体外观多样性等因素,都会在检测过程中引…...

【亲测免费】 OpenCV 4.5.5 + opencv-contrib-4.5.5 编译所需下载文件说明

OpenCV 4.5.5 opencv-contrib-4.5.5 编译所需下载文件说明 【下载地址】OpenCV4.5.5opencv-contrib-4.5.5编译所需下载文件说明 OpenCV 4.5.5 opencv-contrib-4.5.5 编译所需下载文件说明本仓库提供了编译OpenCV 4.5.5及其贡献模块(opencv-contrib)所需的第三方依赖文件和额外…...

CTF夺旗赛利器:手把手教你用GitHack挖掘.git泄露背后的Web漏洞

CTF夺旗赛利器:手把手教你用GitHack挖掘.git泄露背后的Web漏洞 在CTF竞赛和实战渗透测试中,.git目录泄露一直是Web安全领域的经典漏洞场景。这种看似简单的配置错误,往往能成为攻击者打开系统后门的金钥匙。本文将带您深入探索如何利用GitHac…...

【亲测免费】 Zebra打印机中文转ZPL指令的.NET实现

Zebra打印机中文转ZPL指令的.NET实现 【下载地址】Zebra打印机中文转ZPL指令的.NET实现 本项目提供了一个用于将中文文本转换为ZPL指令的.NET实现,旨在替代Zebra官方提供的非托管组件FNTHEX32.DLL。该组件在托管环境下需要额外的封装,并且缺乏64位程序的…...

Apple Music断供后歌单全没?别慌!用iTunes导出的XML文件+Excel手动抢救歌单(保姆级图文教程)

Apple Music断供后歌单全没?别慌!用iTunes导出的XML文件Excel手动抢救歌单(保姆级图文教程) 当你发现Apple Music因断供导致精心收藏的歌单全部消失时,那种心情就像突然失去了多年的音乐记忆。别担心,这份…...

【亲测免费】 ST官方开源电机库FOC5.0:电机控制的利器

ST官方开源电机库FOC5.0:电机控制的利器 【下载地址】ST官方开源电机库FOC5.0下载仓库 ST官方开源电机库FOC5.0 下载仓库本仓库提供ST官方开源的电机库FOC5.0的资源文件下载 项目地址: https://gitcode.com/open-source-toolkit/a21b5 项目介绍 在电机控制领…...

长期使用聚合API平台,对账单清晰度与费用追溯的满意度反馈

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用聚合API平台,对账单清晰度与费用追溯的满意度反馈 作为一名长期负责项目维护的开发者,我所在团队在…...

Perplexity视频查询效率提升300%的5个硬核参数配置,附可复用的CLI+Browser自动化脚本

更多请点击: https://kaifayun.com 第一章:Perplexity视频教程查询的性能瓶颈与优化价值 Perplexity 在处理视频教程类查询时,常面临语义理解深度不足、多模态信息对齐延迟及缓存命中率偏低三重性能瓶颈。当用户输入如“如何用 PyTorch 实现…...

Google关键词能带来多少流量?大词和长尾词的真实流量比例

一家销售软件的公司耗费六个月将“CRM”排至谷歌首页第五名。该词每月产生50万次搜索。网页获得2100次点击。跳出率高达89%。停留时间仅12秒。投入资金4万美元。获得零份询盘。做“外贸企业定制管理软件”排名首页第一。此词汇每月搜索量150次。每月收获62次点击。停留时间4分3…...

Armbian编译避坑指南:如何绕过‘Docker不可用’及国内网络依赖问题,成功构建RK3588固件

Armbian编译实战:RK3588平台高效构建与网络优化策略 当国内开发者尝试为RK3588这类高性能ARM平台定制Armbian系统时,往往会遇到两个"拦路虎":Docker环境配置报错和海外资源下载困难。本文将以Rock 5B开发板为例,通过全本…...

云英谷开启招股:拟募资11亿港元 5月27日上市 小米华为红杉是股东

雷递网 雷建平 5月18日云英谷科技股份有限公司(简称:“云英谷”,股票代码:“03310”)日前开启招股,准备2026年5月27日在港交所上市。云英谷发行价为20.81港元,发行5285.92万股,募资总…...