精通语言、函数与变量:自动化测试提效之钥
|
去年六月,我蹲在三号测试机房里改一个页面对象模型,空调坏了,风扇嗡嗡的,像一百只蜂在铁皮筒里撞。隔壁工位老张接电话,声音黏糊:“……对对对,UI走查完再提PR……”他一边说一边把半块冷掉的蛋黄酥塞进嘴里,渣子掉在键盘缝里。我盯着那个 wait_for_element_clickable 被嵌在第七层 try-except 里的样子,突然就笑出声——不是高兴,是牙根发酸。 我说精通语言、函数与变量是提效之钥,不是因为它多优雅,是它会咬人。咬得你疼了才记得松手。上个月我们组重构登录流,小陈写了个 login_flow(),里面硬编码了三处 xpath,两个 sleep(2),还顺手把 token 存进了全局变量 TOKEN_CACHE。跑通了。上线前两天,前端把 login 按钮 class 名从 btn-primary 改成 c-btn--login,所有用例集体飘红。没人改 xpath,因为“login_flow 封装好了啊”。谁封装的?他写的。谁修的?我蹲着看日志看到凌晨一点十七分,眼珠子干得像砂纸擦过。这个我敢打包票:那行 TOKEN_CACHE = None 写在 finally 块底下,压根没执行——他忘了缩进,四空格写成三空格。我删掉那个空格的时候,窗外在下雨,雨点砸在机房玻璃上,咚、咚、咚,节奏比 Jenkins 的构建失败提示音还准。 优胜劣汰不是形容词,是血淋淋的筛选机制。不是你写得好,是你活下来了。去年六月我们推 Pytest 插件规范,硬性要求所有 fixture 必须标注类型提示、所有断言必须用 assert …, "msg" 显式声明。王工当场拍桌:“你们这是把测试员当编译器使!”——结果两周后他写的 17 个数据驱动用例,有 9 个因参数未注解导致 mock 错位,连错在哪都报不出来。他后来没再吵,自己重写了装饰器,叫 @typed_parametrize,现在还在用。但你知道最讽刺的是啥?他重写那天,工位对面新来的实习生,在看 Python 官方文档里那个 def greet(name: str) -> str: 的例子,一边看一边啃煎饼果子,酱挤到鼠标滚轮上,滚轮卡住,页面一直往下翻,停不下来。他没关浏览器,直接拔 USB 线,插回去时,IDE 正好崩了三次。
文章配图,仅供参考 函数不是黑盒,是接口契约。你把它当黑盒用,契约就反手把你告了。我原以为把重复逻辑抽成函数就万事大吉,结果上周发现三个项目共用一个 generate_test_data(),参数全靠 dict 传,里面用 .get('start_date', '2023-01-01') 默认兜底,可某个分支偏偏把 'start_date' 拼成 'satrt_date'——字都打错了,函数照常返回默认值,用例还 pass。这事儿我说不准,是测不出来,还是根本就没人在意时间字段是否真被用了?反正我那天下午盯着 CI 流水线等结果,手指头无意识抠桌面,把漆抠下一块白印。旁边保洁阿姨推着车经过,桶里泡着抹布,水浑得能养金鱼。 变量名更他妈是照妖镜。有人写 res,有人写 response_from_api_but_actually_it_is_a_dict_with_error_handling_just_kidding_no_wait_its_not,还有人写 xxx_v2_temp_fix_really。我们组去年清理命名混乱,删掉四百多个 tmp/data1/list123 类型变量。删完之后,覆盖率没涨,但 PR 审查时间从平均四小时降到五十三分钟。这事儿我没记错。但我记错了另一件:那天下午三点零八分,测试环境挂了,我切过去看日志,发现一个 user_id 被当成字符串参与了加法运算,而那个字符串开头带空格。不是谁故意加的,是某次 API 返回值多了个不可见字符,刚好被 strip() 漏掉了——因为有人把 strip() 写成 strip(' '),括号里只写了空格,没写 \\t\ 说到冒烟……昨天早上八点四十,运维在群里吼了一句:“ECS 重启中”,我就顺手点了杯咖啡。杯子还没拿稳,手机震,小杨发截图过来:NameError: name 'browser' is not defined。他说“刚合的PR,肯定没问题”,然后撤回了。十分钟后他发来新截图,错误变成 TimeoutException,这次真不是变量问题,是 selenium 版本升级后,find_elements 返回空列表的行为变了。他补了个 if len() > 0 才进去操作。我回他:“你那个 if 里没抛 AssertionError?”他秒回:“哦。”然后就没然后了。我看窗外,乌云裂开一道缝,光直戳机房玻璃,晃得人睁不开眼。 别跟我扯什么抽象设计模式。能一眼看出 for i in range(len(arr)): 和 for item in arr: 哪个更容易埋 bug 的人,才有资格谈设计。能记住 copy.copy() 不递归拷贝嵌套 dict 的人,才配写 setup。剩下那些,等哪天用例集体超时,或者并发跑起来内存直接爆掉——那时再说吧。反正我今天下班前得把 test_api_pagination 里那个 page_size=100 改成 page_size=int(os.getenv("TEST_PAGE_SIZE", "50")),不然下周压测一跑,API 监控图又得跟心电图似的跳。至于那个漏掉的 \\t\ (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


无障碍编程:变量命名如何无声包容视障开发者