Python+requests+unittest+Excel:轻量数据驱动接口自动化测试框架实践
做接口自动化测试这几年我前前后后接触过不少方案商业平台、开源测试平台、自研测试网关都试用过但最后真正稳定用下来、团队协作成本也最低的反而是这套看起来没什么噱头的组合——Python requests unittest Excel。听起来朴素但它几乎能覆盖日常接口自动化的九成场景而且团队里哪怕完全不会写代码的同事只要会填表就能维护用例这一点在企业落地时比技术本身还重要。这套框架解决的核心问题只有一个把测试数据与测试逻辑彻底分离。接口地址变了、参数结构变了、预期结果调整了直接在Excel里改数据即可测试代码不需要跟着频繁改动。拿它做接口回归测试、冒烟测试、线上数据巡检都很顺手。我下面把完整的搭建思路、代码实现、踩过的坑、以及后续的演进方向全部摊开讲一遍适合正在选型或准备自研接口自动化框架的测试开发同学参考。1. 为什么选这四个组件背后是什么权衡先说选型。技术上能实现接口自动化的方案非常多但放进企业实际环境里要考虑的不只是“能不能跑通”还有“谁来维护”“多久能上手”“出问题能不能快速排查”。我用一张表说明我当时对比的几个方案方案优点缺点是否适合团队落地Postman Newman零代码门槛生态系统成熟断言和复杂逻辑受限数据驱动能力弱适合小范围冒烟长期维护成本高JMeter Ant Jenkins压测性能好有图形界面对接口字段级断言和自定义逻辑不友好偏重性能测试日常功能回归不适合Python requests unittest Excel轻量、灵活、可编程、数据驱动简单需要Python基础报告需要额外处理适合中小团队长期维护扩展性强开源测试平台界面友好功能丰富重、部署成本高、定制受限、学习曲线陡有专人运维的平台化团队更合适我最终选择Python requests unittest Excel核心原因是它同时满足了三个条件。第一requests库足够简洁又是Python生态中事实上的HTTP标准库。它封装的会话管理、超时控制、代理设置、文件上传等功能覆盖接口测试需求绰绰有余而且源码公开出了问题可以直接去查实现细节不像黑盒平台那样只能反馈给你的支持团队。第二unittest是Python内置的测试框架不需要额外安装任何依赖天然支持测试用例的组织、执行、跳过、失败重跑等基础能力。它虽然没有pytest那么花哨但胜在“零额外依赖”在任何部署环境里都能直接跑起来这对企业内部的CI集成来说非常重要——少一个依赖就少一个坑。第三Excel作为数据载体是绝大多数企业测试团队都认可的格式。业务侧同事、运维、产品经理几乎所有人都能打开Excel看到测试数据能直接修改参数去调整用例不需要学习JSON或YAML的语法也不用小心翼翼地怕破坏格式。这一点在跨团队协作时的价值远高于技术层面的优雅。当然这套组合也有短板比如没有内置漂亮的HTML报告需要自己集成第三方报告库也不像平台化管理那样有直观的看板和权限控制。但这些问题都可以用轻量方式补足后面我会一步步展示怎么补。2. 框架整体架构与数据流转设计2.1 分层架构思路一个能长期维护的自动化测试框架最重要的一点是分层清晰。我把整个框架切成四层数据层、请求层、用例执行层、报告输出层。每一层只负责自己的职责层与层之间通过明确的数据结构传递业务改动不会牵一发动全身。数据层就是Excel管理的一张张用例表存放接口地址、请求方法、请求头、请求参数、预期状态码、预期返回字段等。请求层负责把Excel里的数据变成真实的HTTP请求定义好超时、编码、会话保持等行为。用例执行层以unittest为骨架根据Excel的行数据动态生成TestCase执行并统一收集结果。报告输出层把结果汇总成HTML和日志供人工查看或对接CI系统。实际跑起来的数据流向是这样的unittest的runner启动后测试类加载器读取Excel内容把每一行用例映射为一个测试方法每一个测试方法执行时调起requests封装好的核心函数传入当前行的接口参数请求返回后框架把实际响应状态码、耗时、关键字段提取出来与Excel里填写的预期值做比较所有结果先汇总到内部的result容器里最后统一渲染到报告。2.2 目录结构怎么规划很多刚起步的框架最后维护不下去问题就出在目录太乱。我建议把项目按功能划分目录结构参考如下auto_api_test/ |-- config/ | -- settings.py # 全局配置环境地址、超时、数据库连接 | -- config.yaml # 环境差异配置比如dev/test/prod |-- common/ | -- request_util.py # requests统一封装 | -- excel_util.py # Excel读取封装 | -- assertion_util.py # 断言封装 | -- log_util.py # 日志模块 |-- test_data/ | -- test_cases.xlsx # 接口测试用例表 |-- test_cases/ | -- test_runner.py # 从Excel动态生成用例并执行 | -- base_test.py # unittest基类 |-- test_result/ | -- report/ # 生成的HTML报告 | -- logs/ # 运行日志 |-- requirements.txt |-- run.py # 主入口这个结构里最容易被人忽略的是config目录。接口自动化框架的环境切换、域名维护、超时设置如果不统一管理后期环境变化时就得改代码风险很大。我把环境相关配置全部抽到settings.py里接口测试数据里的URL路径只写相对路径运行前动态拼接域名这样同一套用例在测试环境和预发布环境都能跑。2.3 用例表的字段设计Excel用例表的每一列怎么定直接影响框架的通用性和维护成本。我建议最低要包含以下字段字段名含义是否必填说明case_id用例编号是唯一标识比如LOGIN_001case_name用例描述是一句话说明测试目的method请求方法是GET/POST/PUT/DELETEpath接口路径是相对路径不包含域名params请求参数否GET的query参数JSON格式data请求体数据否POST/PUT的请求体headers请求头否特殊请求头JSON格式check_status预期状态码是如200、400check_field预期字段校验否JSONPath或字段路径check_value预期字段值否与check_field配对is_run是否执行是1执行0跳过pre_sql前置SQL否用例执行前的数据准备after_sql后置SQL否执行后的数据清理这些字段看似多但实际操作下来非常有必要。特别要说一下pre_sql和after_sql这两个字段我强烈建议留出来哪怕暂时用不到。接口测试最烦的问题不是请求失败而是测试数据不干净导致的连锁反应。比如测试注册接口第一次跑成功账号已经在库里了第二次跑就会返回“用户已存在”。如果能在用例执行前插入一条临时数据执行完成后删掉用例的可重复性会大大提升。3. 核心模块实现请求封装与动态用例生成3.1 requests封装怎么做才顺手直接调用requests库当然也能写但跑上段时间就会发现问题每个用例都要重复写超时、编码处理、异常捕获、请求日志代码膨胀得厉害。我习惯封装一个核心函数把公共逻辑收敛进去。# common/request_util.py import requests import json import time import logging from config.settings import BASE_URL, TIME_OUT, DEFAULT_HEADERS logger logging.getLogger(__name__) class RequestUtil: requests统一封装 def __init__(self): self.session requests.Session() # 开启会话保持连接复用能明显提升大批量用例的执行速度 self.session.headers.update(DEFAULT_HEADERS) def send_request(self, method: str, path: str, paramsNone, dataNone, headersNone, timeoutNone): url BASE_URL path headers headers or DEFAULT_HEADERS timeout timeout or TIME_OUT method method.upper() start_time time.time() try: response self.session.request( methodmethod, urlurl, paramsparams, datajson.dumps(data) if data else None, headersheaders, timeouttimeout ) logger.info(f请求方式{method}URL{url}耗时{round(time.time() - start_time, 3)}s, 状态码{response.status_code}) return response except requests.exceptions.Timeout: logger.error(f请求超时{url}) raise except requests.exceptions.ConnectionError: logger.error(f连接失败{url}) raise except Exception as e: logger.error(f请求异常{str(e)}) raise这里有几个细节值得细说。第一个细节是使用Session而不是直接调用requests.get/post。Session可以复用底层的TCP连接大量用例依次跑时消耗明显减少。如果你要跑几千条用例这个差别是肉眼可见的从几百秒降到几十秒很常见。第二个细节是data参数需要手动json.dumps。因为Excel里的参数读出来是字符串直接塞给requests会被当作表单格式发送接口如果要求Content-Type为application/json就会报参数解析错误。统一在封装层做转换能避免每个用例去处理这个边界问题。第三个细节是日志一定要把URL和耗时记录下来。接口自动化肉眼排查问题时没有耗时信息会很难判断是网络慢了还是接口本身性能有问题。有了耗时字段即便脚本本身没有专门的性能测试逻辑也能顺手抓到明显变慢的接口。3.2 从Excel读取数据并生成unittest用例这是整套框架最核心的一段逻辑。unittest本身是写死的测试类怎么变成“Excel有多少行用例就生成多少条测试”我用的是unittest的load_tests协议它允许动态生成测试集合并返回给TestRunner执行。先封装一个简单的Excel读取模块我用的是openpyxl库它支持xlsx格式读写方便格式控制也比xlrd友好。# common/excel_util.py import openpyxl class ExcelUtil: def __init__(self, file_path): self.file_path file_path self.workbook openpyxl.load_workbook(file_path) def get_sheet_data(self, sheet_nameNone): 读取指定Sheet的全部数据返回list[dict] sheet self.workbook[sheet_name] if sheet_name else self.workbook.active rows list(sheet.iter_rows(values_onlyTrue)) if not rows: return [] headers [str(col).strip() for col in rows[0]] result [] for row in rows[1:]: # 跳过完全为空的行 if all(cell is None or str(cell).strip() for cell in row): continue row_dict {} for i, cell in enumerate(row): key headers[i] row_dict[key] cell if cell is not None else result.append(row_dict) return result读取的逻辑很简单但有一个地方要提醒Excel里如果单元格什么都没填openpyxl读回来是None而实际用例里可能希望它为空字符串或者None不同场景语义不一样。我在封装里统一把None转成空字符串然后在请求层再按需处理这样后续代码不需要反复判空逻辑清爽很多。接着是动态生成unittest用例的部分。这里的关键思路是用例类本身只定义公用的执行模板具体的用例数据通过类参数注入。# test_cases/base_test.py import unittest from common.request_util import RequestUtil class BaseTest(unittest.TestCase): 所有测试类的基类动态属性由TestLoader注入 request None case_data None classmethod def setUpClass(cls): cls.request RequestUtil() def test_interface(self): row self.case_data # Excel里存的参数是字符串需要json.loads解析成dict import json params json.loads(row.get(params)) if row.get(params) else None data json.loads(row.get(data)) if row.get(data) else None response self.request.send_request( methodrow[method], pathrow[path], paramsparams, datadata ) # 状态码断言 self.assertEqual(response.status_code, int(row.get(check_status)), msgf状态码不符合预期{row.get(case_name)}) # 字段断言默认不做 if row.get(check_field): self.assert_response_field(response, row.get(check_field), row.get(check_value)) def assert_response_field(self, response, field, expected_value): try: response_json response.json() except ValueError: self.fail(f响应不是合法JSON无法完成字段校验{response.text}) # 简单的点号路径取值支持嵌套字段 node_list field.split(.) val response_json for node in node_list: val val.get(node) if isinstance(val, dict) else None self.assertEqual(str(val), str(expected_value), msgf字段 {field} 预期值 {expected_value}实际值 {val})到了这一步核心执行能力已经具备了。但直接运行是不行的还得有一个loader把所有Excel用例行的数据注入到BaseTest中然后返回给runner执行。# test_cases/test_runner.py import unittest from common.excel_util import ExcelUtil from test_cases.base_test import BaseTest EXCEL_PATH test_data/test_cases.xlsx SHEET_NAME InterfaceTestCases def load_tests(loader, standard_tests, pattern): 动态生成unittest用例集 excel_data ExcelUtil(EXCEL_PATH).get_sheet_data(SHEET_NAME) # 只有is_run为1的用例才会生成 runnable_cases [row for row in excel_data if str(row.get(is_run, )) 1] suite unittest.TestSuite() for row in runnable_cases: # 复制类动态绑定用例数据 case_cls type(fTestCase_{row[case_id]}, (BaseTest,), {case_data: row}) # 为类配置test方法 # load_tests返回的TestSuite优先级高于标准加载结果 suite.addTest(case_cls(test_interface)) return suiteload_tests这个协议我当时弄了很久才搞明白。unittest默认会扫描test_cases目录下所有test开头的方法但我们需要的是完全由Excel数据驱动的方法所以必须通过load_tests函数返回自己构造出来的TestSuite并且unittest会优先使用这个返回值而不是自己去扫描。这是unittest提供的官方扩展点只是平时用得少文档也不显眼很多教程完全没有提及。4. 断言机制与报告输出4.1 断言怎么做才灵活接口自动化的断言是框架的“眼睛”做不好就会一堆假绿。真正完备的接口断言至少要覆盖三个层面状态码、响应字段、业务逻辑。状态码是基础但不等于一切。很多接口即使业务处理失败也会返回HTTP 200所以光断言状态码不够必须有字段层校验。我封装了简单的点号路径取值方式比如响应是{data: {token: abc123}}在Excel里填check_field为data.tokencheck_value为abc123就能自动提取出token并比较。但对于复杂业务这种简单路径就不够用了。如果响应里有数组或者需要根据条件动态取值我建议引入jsonpath库。它类似XPath专门用于从JSON中提取数据。我在实际项目里遇到过一个场景下单接口成功返回一个订单ID但用点号路径不好取因为响应结构里还套了一层列表。后来我改成用jsonpath提取$..order_id一下就拿到了。如果做企业级框架推荐直接把jsonpath集成进断言模块字段断言支持两种语法简单点号路径和jsonpath表达式。另外断言失败的信息一定要包含实际响应内容否则排查问题要重新跑一次用例效率很低。我在每个断言里都把响应文本写入msg参数这样看报告时直接能看到接口返回了什么不用再回放请求。4.2 自研轻量测试报告生成unittest默认的文本输出只有“OK”“FAILED”几行字对于企业里的规范管理远远不够。我推荐集成HTMLTestRunner它是从unittest的TextTestRunner扩展出来的能输出带图表的HTML报告。但注意它的老版本是Python2时代的产物Python3下要稍微改一下。另外还有个问题是老版本已经多年不更新新版本类的导入路径不同我建议直接用pypi上的html-testRunner包。安装的方式很简单pip install html-testRunner集成到run.py主入口# run.py import unittest import time from htmltestrunner import HTMLTestRunner if __name__ __main__: now time.strftime(%Y%m%d_%H%M%S) report_path ftest_result/report/{now}_report.html with open(report_path, wb) as f: runner HTMLTestRunner( streamf, verbosity2, title接口自动化测试报告, description用例执行详情与结果统计 ) suite unittest.defaultTestLoader.discover(test_cases, patterntest_runner.py) runner.run(suite) print(f报告已生成{report_path})HTML报告能直观看到每条用例的通过失败、耗时、失败原因对团队分享时非常有用。另外有个细节报告文件名带上时间戳可以避免覆盖历史报告方便回溯。如果是集成CI建议再增加一个“仅保留最近N份报告”的清理逻辑否则连续跑几周报告文件会越来越多磁盘占用还挺吓人的。4.3 失败用例自动重跑接口自动化最让人头疼的就是偶发失败。网络抖动、上游服务重启、缓存未命中都会导致用例偶然红灯。如果频繁重跑全量用例浪费时间不重跑又影响可靠性所以我倾向于在框架层实现“失败用例自动重跑一次”的机制。做法其实不复杂在unittest的TestResult基础上包一层动态记录失败用例跑完后再次执行失败用例。不过我试下来更轻量的方式是加一个装饰器封装测试方法捕获首个断言异常后重新发一次请求。# common/retry.py import functools def retry_on_failure(max_retry1): 断言失败后自动重试的装饰器 def decorator(func): functools.wraps(func) def wrapper(self, *args, **kwargs): try: func(self, *args, **kwargs) return except AssertionError: if max_retry 0: raise # 重新执行一次完整测试逻辑 for _ in range(max_retry): try: func(self, *args, **kwargs) return except AssertionError: continue raise return wrapper return decorator但这里有个原则性问题要讲清楚不是所有断言失败都适合重跑。状态码等于500这类问题是服务端处理失败重跑大概率还是失败徒增耗时超时、连接重置这类网络层问题重跑价值最大。我实际使用时给BaseTest里的test_interface挂上这个装饰器同时在Excel里加一列retry_time默认填0由用例维护者自己决定哪些用例需要重试。这种做法既保留了灵活性又不会因为盲目重试掩盖真实的代码问题。5. 实际落地时的配置管理与环境切换5.1 多环境配置的正确姿势接口自动化不管理好环境配置就是把项目往火坑里推。测试环境、预发布环境、生产环境的域名不一样数据库不一样有些接口的Key也不同。把这些写死在Excel里换环境改一堆单元格既不安全也容易漏改。我的方案是配置分层用settings.py定义一个基类保存通用配置用不同子类保存各环境的差异配置运行时通过环境变量选择加载哪个类。# config/settings.py import os import yaml class BaseConfig: BASE_URL TIME_OUT 10 DEFAULT_HEADERS {Content-Type: application/json} class DevConfig(BaseConfig): BASE_URL https://dev-api.example.com TIME_OUT 5 class TestConfig(BaseConfig): BASE_URL https://test-api.example.com TIME_OUT 10 class ProdConfig(BaseConfig): BASE_URL https://api.example.com TIME_OUT 15 ENV_MAP { dev: DevConfig, test: TestConfig, prod: ProdConfig } # 运行时通过环境变量API_ENV切换 env os.getenv(API_ENV, test) CurrentConfig ENV_MAP.get(env, TestConfig) BASE_URL CurrentConfig.BASE_URL TIME_OUT CurrentConfig.TIME_OUT DEFAULT_HEADERS CurrentConfig.DEFAULT_HEADERS在run.py里加入一个参数比如--env test或者直接在CI的环境变量里设置API_ENV就能实现同一套用例在不同环境跑。这里要提醒一个关键点Excel里的接口路径一定不要带域名只写相对路径比如/user/login。如果写死全路径环境切换就彻底失效了。这一点我在前期吃过亏后面深刻反省过。5.2 多线程执行提升跑批效率单线程跑几百条用例在接口自动化里是能接受的但要是上千条、且每条用例都有前置SQL操作等待时间会让人崩溃从半小时优化到两分钟是完全可能的。unittest原生不支持多线程但框架层面可以通过线程池来执行多条用例然后汇总结果。不过多线程执行有一个大坑线程不安全。如果多个线程同时操作同一个requests.Session对象或者同时读写同一个日志文件、同一个报告输出流会出现数据错乱、报错阻塞。我建议按线程各建一个Session实例日志使用线程安全的queue收集后统一落盘。实际跑大批量用例时线程数建议控制在CPU核心数的2倍以内不要追求无脑的并发数否则反而会因为等待响应把资源全部占满。如果业务上不允许接口并发访问比如服务端有并发限制或者需要按顺序测试状态机流转的接口那就老老实实单线程跑。并发是好事但也要分场景。批量接口回归中那些无状态的查询接口适合并发有状态依赖的流程类接口还是顺序执行更稳。6. 常见问题排查与经验补充6.1 我实际踩过的那些坑搭建这套框架的过程中我遇到的最典型问题集中在以下几类我把现象、原因和解决方案整理成了表格供你排查时参考现象根本原因解决方案Excel里中文参数请求后变成乱码openpyxl读出来的字符串没有按UTF-8处理在请求封装里统一设置data编码字符串encode再放入请求体接口一直报请求体格式错误Excel参数被当作表单格式发送在session请求里手动将data参数json.dumps并设置Content-Type为application/json动态生成的用例在unittest里总是重复执行load_tests函数返回的suite和默认扫描逻辑重复叠加在test_runner.py里定义load_tests并明确返回它不要再继承混用默认扫描报告里的失败case数量正确但耗时异常HTML报告输出流没有正确flush日志堆积报告文件打开方式用二进制wb跑完手动调用f.flush()再关闭前置SQL在并发模式下偶发数据冲突多线程同时操作同一批数据记录给前置SQL数据加唯一前缀或者按线程各自生成独立测试数据跑完一次后再次运行必失败没有清理后置数据脏数据残留在用例表里配置after_sql或用独立的临时数据空间某个接口响应偶发慢导致用例超时误报超时设置过小将框架超时调大到15秒对慢接口单独使用Excel里的timeout字段覆盖其中Excel中文乱码这个问题尤其容易在从Windows环境迁移到Linux环境时出现因为两个系统的默认编码不一样。我习惯在读取Excel后统一做一次字符串编码处理比如加一行str(value).encode(utf-8).decode(utf-8)保证后续流程一致。如果你的用例还在用GBK编码的数据强烈建议全部转成UTF-8再维护否则换一台服务器就可能冒出奇怪的错。6.2 关于框架扩展的一些实用想法这一个框架成型之后你大概率不会停留在只跑基本接口请求。随着业务深入我陆续引入了几个轻量扩展成本低但效果明显。第一个是加数据库校验前置操作。有些接口虽然返回成功但数据库没落库这种接口问题光靠前端响应是抓不到的。我在Excel里增加pre_sql字段在base_test执行请求前先执行一遍前置SQL比如查询或插入一条测试数据。另外配合after_sql在用例结束后清理数据保证可重复性。第二个是对接CI。我接的是统一的流水线平台。做法非常简单把run.py作为shell命令执行报告生成的HTML文件作为产物上传测试通过或失败通过退出状态码判断。代码层面只需要在run.py最后根据执行结果决定是否调用sys.exit(1)。很多人忽略这一步其实CI对接能让全团队共享测试结果比测试同事在本地闷头跑要有价值得多。第三个是引入数据校验的独立层。很多接口返回的不是单个断言字段而是一整段JSON数据比如订单列表、用户信息字段可能多达几十个。如果全塞在Excel里维护会很痛苦。我后来做了一步优化对于这种复杂结构的接口不依赖Excel的check_field而是把校验逻辑抽成一个独立的校验函数模块用代码维护用例表里加一个check_type字段来指定走哪类校验器。这样简单接口用Excel校验复杂接口用代码校验两全其美。第四个是接口依赖的处理。有些接口必须依赖上个接口的返回值比如登录后拿token再带token访问用户信息。我一开始的做法是写一个公共的依赖缓存层在用例表增加一个字段save_field把接口返回的某个字段值存到全局变量中下一个接口通过${token}这样的占位符引用。这种方式维护简单业务方也能看懂。凡是拿到token、订单ID、用户ID这类高频动态参数我都建议按这个思路做。6.3 维护这套框架最需要养成的好习惯最后说点和代码无关、但对长期使用影响巨大的事。第一Excel用例表一定要有人守在最后统一维护口径。没有规范的话几天后就会出现张三用驼峰命名、李四用下划线命名、王五干脆不写预期值的情况。框架再好用例数据一乱就没法用。我从第二个月开始就固定了一个简单规范路径用小写、参数用JSON字符串、预期值类型必须标明字符串还是数字并在readme里写清楚。第二跑测试之前一定要先做基础校验。有一次我改了Excel里某个sheet名结果整个框架跑出来全部用例“加载失败”查了半天才发现是sheet名对不上。后来我在run.py里加了启动自检读取Excel前先检查sheet是否存在用例必填字段是否有空值如果有直接终止并打印具体提示减少无意义的调试时间。第三多花一点时间维护通用断言库。框架里断言越能覆盖公共场景后续新增用例的成本就越低。比如常见的“成功标志字段必须是0”“错误码必须返回在errorCode字段”这些在通用断言库里定义成公共方法后新进来的同事只需要知道调哪个即可不需要重新理解断言逻辑。我在实际使用中还有一个特别深刻的体会这套框架一定要做成“工具”而不是做成“项目”。也就是说不要执着于把所有能力都堆进去而是找到那个让团队用起来最顺手的边界。能力越复杂使用门槛越高最后很可能变成只有写框架的人自己能用的“黑魔法”。最后分享一个小经验很多人会忽略跑完大批量用例后养成翻一眼最近生成的日志的习惯。框架里的日志是我排查线上疑点的第一个入口比直接看报告管用得多。接口自动化不只是证明“功能没问题”它也是你可以随身携带的线上状态探测工具。这套框架小到个人维护、大到企业落地都具备足够的承载空间只要你的核心设计思路——数据驱动、分层清晰、易扩展——立得住后面就会越来越顺手。

相关新闻

系统掌握Markdown语法:从基础到写作工作流完整指南

系统掌握Markdown语法:从基础到写作工作流完整指南

前段时间把一套Markdown教学视频从头到尾刷了一遍。说实话,刚开始有点不以为然,Markdown不就是个标记语法嘛,会打字就会写。可真到了逐条敲下来才发现,自己过去的使用方式相当粗糙:写表格经常对不齐,贴代码…

2026/10/13 5:24:01 阅读更多 →
从Markdown语法到内容库:构建高效写作与排版工作流

从Markdown语法到内容库:构建高效写作与排版工作流

我第一次用 Markdown 写正经文档,是在一个被排版折磨到崩溃的深夜。当时手头有一篇带截图、带命令、带层级说明的长文,用富文本编辑器来回调整标题字号、列表缩进和表格边框,内容每改一版,排版就得重来一遍。后来有人扔给我一个看…

2026/10/13 3:25:09 阅读更多 →
基于PJ85718DM与STM32F303VE的本地及远程温度监测方案

基于PJ85718DM与STM32F303VE的本地及远程温度监测方案

1. 项目背景与核心需求拆解温度监测这件事,听起来像是电子工程里最基础的入门实验,但真正把它做到工业级可靠、做到能同时覆盖本地和远程两个维度、做到在HVAC这种电磁环境复杂的场景下稳定运行,里面的门道远比想象中多。我这次要聊的方案&am…

2026/10/13 3:16:20 阅读更多 →

最新新闻

实习和校招到底在选什么?从简历到面试的完整求职指南

实习和校招到底在选什么?从简历到面试的完整求职指南

1. 实习和校招到底在选什么很多同学第一次接触实习和校招的时候,脑子里冒出来的第一个问题往往是“我该投哪家”“简历怎么写”“面试问什么”。这些问题当然重要,但如果只盯着这些操作层面的东西,很容易陷入一种“做了很多准备却始终不得要领…

2026/10/13 16:36:05 阅读更多 →
xqffi 使用指南:用 PyO3 在 Python 中调用 XQuad Rust 虚拟机(xqvm + xqasm)

xqffi 使用指南:用 PyO3 在 Python 中调用 XQuad Rust 虚拟机(xqvm + xqasm)

【免费下载链接】xquad A rust implementation of the Quip Networks quantum virtual machine. 项目地址: https://gitcode.com/gh_mirrors/xq/xquad 点击查看 免费下载 xqffi 是 XQuad 工具链的 Python 扩展层:它通过 PyO3)和 .xqasm 汇编…

2026/10/13 16:36:05 阅读更多 →
固定资产管理之—硬件产品的分类

固定资产管理之—硬件产品的分类

企业固定资产品类繁杂:办公电脑、工控设备、仪器仪表、货架机具、IT 硬件、精密配件,传统人工盘点耗时耗力、错盘漏盘频发、资产去向无从追溯。随着数字化资产管理普及,RFID 标签打印机、RFID 发卡器、手持数据采集器、RFID 通道门四款核心硬…

2026/10/13 16:36:05 阅读更多 →
HOG+SVM实战:从特征提取到滑窗检测的完整指南

HOG+SVM实战:从特征提取到滑窗检测的完整指南

简介:本资源是一套基于HOG特征与SVM分类器的手写字符识别完整工程方案,面向计算机视觉入门者、模式识别课程学习者及需要完成相关实验或课程设计的学生。方案以CASIA-NLPR手写字符数据集为处理对象,涵盖特征提取、模型训练与分类预测的完整流…

2026/10/13 16:36:05 阅读更多 →
Frank-Wolfe求解交通用户均衡:SiouxFalls网络实战解析

Frank-Wolfe求解交通用户均衡:SiouxFalls网络实战解析

简介:本资源是一份面向交通工程、运筹优化与智能交通系统方向的Python实践代码包,聚焦用户均衡(UE)问题的算法实现与小规模网络验证,适合交通规划初学者、研究生课程设计及算法爱好者动手复现。资源采用经典Frank-Wolf…

2026/10/13 16:36:05 阅读更多 →
从grep到rea:命令行日志分析工具的字段提取实践

从grep到rea:命令行日志分析工具的字段提取实践

半夜两点,我对着一个 1.8GB 的访问日志发呆。我要在几十万条请求里,把某次超时链路涉及的所有记录捞出来,按请求 ID 拼成完整时间线,再看哪个环节耗时异常。第一反应是 grep,grep 也确实把行筛出来了,但筛完…

2026/10/13 16:35:03 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →