资讯详情 方案测试的 Python 只有一种正当用法:替你发 AT、收日志、填表格
📅 2026/10/16 6:35:24
副标题板端仍是 C电脑侧 50 到 80 行脚本跑回归不是做网站专栏《嵌入式学生的方案测试课》第 14 篇胶水前置第 4 篇会手发 AT第 12 篇理解要统计数字第 13 篇厌倦手抄拷机表标签嵌入式、Python、串口、软件测试、自动化读者会一点 Python 语法没写过带超时的串口脚本JD 写了简易 PC 工具学完交什么脚本 csv READMECOM 口和波特率 10 次错密码统计主实验ESP8266。没有板可以用串口环回或只跑解析函数的单元测试但要写明。0. 这篇结束你能干什么写 50 到 80 行脚本打开串口发AT判断OK/ERROR有超时。错密码连接 10 次输出次数、每次耗时、ERROR 原文到 csv。能说明产品固件仍是 CPython 在电脑上当手。不要和板子日志抢同一串口。脚本判定条件写进缺陷单「有回显」不等于成功要看ret/OK/FAIL。嵌入式校招 JD 公开要求简易 PC 调试工具控制台/对话框。方案测试用脚本跑回归不是做 Web。1. 为什么手发 AT 不够却也不能一上来上框架手发学习协议、写第一份会话。回归 10 次错密码、100 次重连、2 小时一行手会作弊、会漏。学生容易跳到 pytest 插件宇宙或写一个带登录页的平台。岗位要的是发得对新行、超时、编码收得全不要读一行当成功判得严关键字落得盘csv方便贴报告泰芯公开 WiFiTestTool 通过串口下 AT 做 SRRC 发包AH 有 netat/netlog 网口工具。学生脚本是同类胶水的迷你版。不逆向官方工具只学「串口下命令 用返回值判定」。公开 SRRC 警告改 gain 要先暂停发包AT 返回失败才是失败。脚本如果把「串口有回显」当成校准成功会制造假通过。2. 最小原理2.1 串口是字节流不是函数调用pyserial读到的是流。AT 以\r\n分行第 4 篇新行模式。你要写命令 \r\n读直到OK/ERROR/FAIL或超时超时宁可判失败不要死等编码先latin-1或按字节避免日志里的中文/乱码把decode(utf-8)摔死。保存原文。2.2 不要抢串口同一 COM 口不能你脚本开着串口助手也开着。拷机日志如果要人工看脚本把日志 tee 到文件人看文件。2.3 判定写清楚现象判定收到独立一行 OKAT 成功对 AT 探活收到 ERROR / FAIL / CWJAP:x按用例错密码可能是期望失败超时失败记录已收部分有乱七八糟回显但无 OK失败板子复位横幅单独事件不是 OK错密码 10 次的「成功」定义是每次都在超时前给出明确失败且之后 AT 仍探活。不是「连上了」。3. 参考脚本约 70 行读懂再改 COM把下面存成labs/week14/at_wrongpass.py。COM 口改成你的。# at_wrongpass.py 教学脚本错密码 10 次统计importcsvimporttimeimportargparseimportserialdefread_until(ser,tokens,timeout):读到 tokens 之一或超时。返回 (text, hit, elapsed).ser.timeout0.2bufbt0time.time()tokens_b[t.encode(latin-1)fortintokens]whiletime.time()-t0timeout:chunkser.read(256)ifchunk:bufchunkfori,tbinenumerate(tokens_b):iftbinbuf:textbuf.decode(latin-1,errorsreplace)returntext,tokens[i],time.time()-t0# 无数据也继续等到 timeouttextbuf.decode(latin-1,errorsreplace)returntext,None,time.time()-t0defat_cmd(ser,cmd,tokens(OK,ERROR,FAIL),timeout5.0):ser.reset_input_buffer()ser.write((cmd\r\n).encode(latin-1))returnread_until(ser,tokens,timeout)defmain():apargparse.ArgumentParser()ap.add_argument(--port,defaultCOM3)ap.add_argument(--baud,typeint,default115200)ap.add_argument(--ssid,defaultlab-ap-01)ap.add_argument(--badpass,defaultwrong-password-xx)ap.add_argument(--n,typeint,default10)ap.add_argument(--out,defaultwrongpass.csv)argsap.parse_args()serserial.Serial(args.port,args.baud,timeout0.2)time.sleep(0.2)text,hit,dtat_cmd(ser,AT)ifhit!OK:raiseSystemExit(AT probe failed: %r %r%(hit,text))rows[]foriinrange(1,args.n1):cmdATCWJAP%s,%s%(args.ssid,args.badpass)text,hit,dtat_cmd(ser,cmd,tokens(FAIL,ERROR,OK,WIFI GOT IP),timeout15.0,)# 错密码期望 FAIL/ERROR若 OK/GOT IP 则判异常成功expected_failhitin(FAIL,ERROR)probe_text,probe_hit,_at_cmd(ser,AT,timeout3.0)rows.append({i:i,hit:hitorTIMEOUT,seconds:%.3f%dt,still_ok:probe_hitOK,expected_fail:expected_fail,excerpt:text.replace(\r,\\r).replace(\n,\\n)[:200],})print(i,rows[-1][hit],rows[-1][seconds],aliveifrows[-1][still_ok]elsedead)withopen(args.out,w,newline,encodingutf-8)asf:wcsv.DictWriter(f,fieldnameslist(rows[0].keys()))w.writeheader()w.writerows(rows)n_failsum(1forrinrowsifr[expected_fail])n_alivesum(1forrinrowsifr[still_ok])print(expected_fail %d/%d, alive_after %d/%d, csv%s%(n_fail,args.n,n_alive,args.n,args.out))ser.close()if__name____main__:main()依赖pip install pyserial。README 写 Python 版本、COM、波特率、新行已经由脚本发\r\n。可选作业从ATCWLAP文本里用正则抠 RSSI 数字追加一列。抠不到就留空不要编。可选用subprocess调iperf3 -c ...把最后一行 Mbps 解析进另一张 csv。解析失败当失败不要用「进程返回 0」当吞吐合格。4. 实验步骤手发 AT 探活仍 OK第 4 篇。先关串口助手。改--port。跑--n 1看能否完整结束。--n 10生成 csv。人工抽看第 1、第 10 次 excerpt 是否真是错密码失败。若 10 次里出现WIFI GOT IP密码其实对了或 AP 开放环境错不是脚本胜利。把 csv 贴进测试记录。缺陷只在超时、死后不探活、偶发连上。没有板把read_until用假字节喂单元测试io.BytesIO不够串口可用自己写 FakeSer。交测试代码同样及格注明无硬件。5. 缺陷单脚本判定条件标题【工具】自动化把「串口有回显」当成 AT 成功SRRC 发包实际 ret-1 说明教学公开 SRRC/AT 文档以返回码为准。脚本必须匹配 OK/ERROR/ret。 期望ret-1 记失败不写校准通过 实际脚本见任意字节就点绿灯 分层测试工具不是芯片你自己的脚本若超时当成功同样提单打自己。6. 泰芯对照公开工具学生迷你版WiFiTestTool 串口 AT 发包pyserial 发 ATnetat 网口 AT本篇不实现知道网桥可以不插 UARTnetlog 拉日志脚本 tee 到文件对话框/控制台小工具嵌入式 JD本篇控制台即可对话框是加分不是主业不反编译、不破解授权、不把官方 exe 当自己作品写进简历。7. 30 秒口径Python 在电脑上发 AT、收日志、写 csv固件仍是 C。脚本必须有超时用 OK/ERROR/FAIL 判定不把有回显当成功。错密码 10 次我用来统计失败是否可观察、之后是否还活着。不和串口助手抢同一 COM。8. 作业labs/week14/ README.md at_wrongpass.py wrongpass.csv requirements.txt # pyserialREADME 至少COM、波特率、如何停、不要抢口、期望失败的定义。Git 提交可以但不要提交真实 SSID 密码。--ssid用实验名。9. 自测题为什么 decode utf-8 可能把日志读炸错密码用例里收到 OK 该高兴吗脚本和串口助手同时打开会怎样死等没有 timeout 的危害简历写精通 Django 对这个岗有帮助吗iperf 返回码 0 能否当吞吐达标官方 WiFiTestTool 能否写进「我开发的工具」10 次统计的分母为什么重要10. 学生常见翻车简历精通 Python Web。脚本无 timeout。抢串口。把期望失败当成脚本 bug 反复改密码。csv 不提交只交「感觉 10 次都挂了」。真密码进 Git。11. 下一篇预告第 15 篇《先查供电、天线和传感器 CRC方案测试怎么跟硬件同事对话》。脚本再绿天线没接也是红。下一篇松天线、拔传感器、波特率设错、劣质线供电把锅从协议栈拿开。附录 A. 自测题参考答案非 UTF-8 字节抛异常后面的 OK 再也读不到。不高兴。错密码连上是安全/逻辑缺陷。端口占用或各读走一半字节判定随机。拷机脚本卡死假阳性过夜。几乎没有。要串口和表格。不能。要解析 Mbps 和丢失对照需求。不能。可写「使用过公开工具理解串口 AT 发包」。3/3 和 3/100 决策完全不同。附录 B. 公开资料嵌入式软件工程师 JDPC 端控制台/对话框小工具Wi-Fi4 SRRCWiFiTestTool 串口 AT返回值AHnetat / netlog第 4 篇新行与超时第 14 篇完12. README 最低限度作业按此抄# at_wrongpass Python 3.x pip install pyserial 用法 python at_wrongpass.py --port COM5 --baud 115200 --ssid lab-ap-01 --badpass xx --n 10 前置关闭串口助手模组已 AT OK实验 AP 存在 期望10 次均为 FAIL/ERROR之后仍 AT OK 不要真实家庭密码把 TIMEOUT 当通过 输出wrongpass.csv13. 常见脚本病和对应缺陷病现象修没\r\n永远 timeout第 4 篇新行timeout 太短正确连网被判失败CWJAP 用 15s探活用 3s读一行就当结束漏掉 FAIL 在后面读到 token 或超时utf-8 decode异常退出latin-1不 reset 输入缓冲上次尾巴污染本次reset_input_buffer和助手抢口随机关助手把 OK 当错密码成功逻辑反了expected_fail第 14 篇脚本里WIFI GOT IP出现在错密码实验 立刻停检查 SSID/密码是否其实对了或 AP 开放。14. 把 iperf 解析进 csv 的边界subprocess.run([iperf3,-c,ip,-t,5], capture_outputTrue, textTrue)然后找Mbits/sec。解析不到 失败返回码 0 不够。不要在脚本里写if bitrate 10: pass除非需求签字。脚本负责记数人负责对照需求。15. 和官方工具的关系简历一句「使用串口 AT 做过回归统计脚本了解原厂 WiFiTestTool/netat 是同类胶水。未逆向。」不要「开发了泰芯产线校准软件」。