时间旅行调试与自动化测试的支持
前言
调试工作的本质是对逻辑链的整理,我们定义设计为给一个事物或一个系统制订演绎基础的计划过程,而应用系统的有机组成是代码逻辑,一旦系统运行过程出现的非计划行为,就需要我们根据有限信息去发现问题所在,修正逻辑。显然,掌握越多信息,越有助于问题的解决,时间旅行调试相比其他调试方式提供了更加丰富的信息,使用该调试工具的项目工程调试难度骤降。iofod 近期发布重磅更新,为用户带来时间旅行调试体验,在此基础上更进一步,我们实现了让项目工程支持跨平台自动化集成测试!
调试与逻辑
一个逻辑学家不需要亲眼见到或听过大西洋或尼亚加拉瀑布,他从一滴水中就能推测出它们存在的可能性。 —— 阿瑟·柯南·道尔
很多人将调试当成一门艺术,我们先入为主地将逻辑能力与调试能力挂钩,并且多数时候发现确乎如此,平时面试时,逻辑思维能力几乎成为考核候选人的一条硬要求。
古人观天,可从星芒闪动中得出空间与时间必有一个有限的结论,这便是逻辑的魅力。逻辑首先是脆弱的,逻辑链的任意一环出错,即使其他部分无论多么精妙绝伦,结果都是错误的并且无需争议,但恰恰是脆弱给逻辑带来无可比拟的强大,只要任意一环不被证明是错的,那么它可以被定性为正确的(可证伪性),在宏观光速不可超越这一宇宙“参数”面前,时间的存在被赋予意义,事物之间产生因果联系,逻辑作为规律武器推导因果,这几乎预告着一种令人心安的必然。
开发者在可维护可复用上所付出的努力:代码公共模块/库封装、UI 组件的提炼、数据库表一对多的设计、微服务拆分和中台搭建等等,从测试和调试的角度看来,正是保持着“脆弱性”,对于这部分我们深谙其价值,不惜用各种测试手段去验证它“不出错”。
调试依赖于逻辑,而逻辑的燃料就是眼前可收集的信息,无论是代码加 log 或断点,还是配合一系列工具如 IDE 分析与 debug 工具,执行日志,抓包等,都是提供尽可能多的信息来辅助思考。bug 在这一套组合拳下来,几乎无处可匿,包括时间旅行调试也是,只不过更进一步,bug 如同掉入黑洞般,未来失去了意义。
时间旅行调试
维基百科对时间旅行调试的定义是:
时间旅行调试是通过对源代码回溯以了解计算机程序执行期间发生的情况的过程。
iofod 聚焦于面向用户类应用系统的开发与设计,这类应用有个特点就是,几乎是事件驱动的,类比物理世界发生的事件,应用响应用户的事件输入与之交互。因此我们从众多调试方式中选择了时间旅行作为默认调试方式,iofod 以事件作为时间旅行记录点的单位,事件单位内的构成,如模型变量的改变,状态的切换,属于只有先后顺序但没有时间上差异的整体,我们认为这样的设计更符合人脑认知,因此 iofod 给出的如下定义:
时间旅行调试(Time Travel Debugging, TTD)是一种结合时间观察程序运行状态变化的调试方式。它记录程序在不同时间点的状态,借助记录点在时间上的倒退或前进来重现非期望状态,以便我们可以全息观察程序变化的过程,从而找到解决 bug 的方法。
定义颇为抽象,我们不妨换一种视角看,日常模块开发完成后的自测,交付测试环节的集成测试,验收环节的交付测试和 hotfix 时的冒烟测试,都可以看作不同角色对应用系统进行了只记录特定状态的“人肉版”时间旅行调试。整个环节是串联的,往往发现 Bug 后打回到开发环节,不断重复直到所有问题都被修复处理。
相信很多读者都能感同身受,阉割版 TTD 几乎是让团队走向 996 的一大根源,一旦链路中的角色有经验不足的,甚至可以形成测试交付时间远超开发时间的吊诡局面,因此,我们迫切需要一款豪华全 DLC 版的真·时间旅行调试来 cover 这些问题。iofod 团队最近都在做这方面的尝试,所幸略有小成,我们很自豪与大家分享此次成果。
在 iofod 里搭建完应用,预览测试应用的时候,可以点击顶部工具栏【调试模式】开启时间旅行调试功能:
接下来在应用里进行的所有交互动作和状态变化都会被记录,在【日志】面板输出,输出的内容可以展开详情或者点击跳转到对应的配置面板,检查当前事件导致应用内部发生的各种变化,点击左侧的【记录点】可触发时间旅行,还原到特定时间点下的现场:
点击右侧的【重放】按钮可以回放当前时间线的记录,便于重复观察:
还原现场后,支持在当前记录点下继续与应用交互产生新的历史记录,时间线将开启新的分支,该特性允许你在调试过程变更各种参数,观察变更在新分支的表现。
自动化测试实现
技术部门有独立测试团队的公司,内部或多或少制定过自动化测试相关的 KPI 项目,这类笔者接触过的自动化测试系统,在应对单元测试和后台服务测试多数能达到可用,应对集成测试则基本无法落地,即便系统引进 AI 技术也只能限定在特定场景。我们基于经验总结,当下基于“黑盒”去实现自动化测试是不可取的,即是说自动化测试可行的实现对代码必须是侵入式的,类似于有埋点统计的设计。
不难发现,时间旅行调试的录制记录点步骤,与自动化测试的录制存在一定的重合,我们只需舍弃记录点的状态信息,只保留记录点的事件交互和指针信息,就是自动化测试的录制内容了!在 iofod 调试模式下,等【日志】面板输出交互和状态记录后,点击右侧的【保存为用例】,当前录制的所有记录点,将以事件为颗粒保存为测试用例:
可在【用例】面板运行测试用例于当前编辑器或测试模式,也可以通过自动化测试拓展,让用例在解析器环境运行。换句话说,通过自动化测试拓展,iofod 同时支持在 Web PC/H5 网站,小程序,桌面和移动端应用的自动化测试!
跨平台自动化测试
自动化测试拓展默认添加到 iofod 拓展区,假如你是老用户或者还没安装该拓展的用户,可在 iofod 编辑器里点击超级菜单里的【拓展管理】按钮唤起拓展管理面板,点击【添加拓展】,搜索关键词【自动化】:
点击搜索结果进去,即可看到拓展详情界面,点击【安装拓展】,
关闭拓展管理面板,可以发现自动化测试拓展已经添加到右下角的拓展区里。
点击开启自动化测试拓展,选择需要运行的用例/组,填写 WebSocket 目标源,点击【运行】即可让连接到目标源的工程接收用例/组,执行自动化测试。
值得注意的是,点击【运行】前需要在工程里执行允许自动化测试的命令,执行命令前可以修改配置文件(一般无需变动,存在端口占用或者多工程同时联调才需要改)
Web PC/H5 工程以及 Flutter 工程,可以修改工程根目录的.env
配置文件:
小程序工程修改 /config
目录 的 dev.js
:
配置修改完成后,在工程目录执行命令:
自动化测试拓展支持同步项目的用例配置到多个目标源,在目标源表单分别输入 Web 工程,小程序工程以及 Flutter 工程的自动化测试服务地址:
点击【运行】,接下来就是休息时刻,静候你的自动化 worker 工作结果即可:
结语
如果说优良的可视化编辑体验,多人实时协同,原子化组件,极致的资产复用,高保真跨全平台,自在的拓展系统这些都不能让屏幕前的你投入低代码的怀抱,相信 TTD 与自动化测试的加入是你愿意选择低码工具作为日常业务支撑的又一个重要理由,同时这些特性也是 iofod 区别于其他产品的重要标志。
笔者认为,在工业 4.0 的时代背景下迟早会淘汰掉原始低效的协作方式,体力不应是知识密集型行业的标配,人作为目前“通用智能”的唯一实现,该在恰当的位置发光发热,iofod 是在这一愿景下所做的尝试,时间旅行调试和自动化测试的实现给我们第一个小里程碑划上句号,希望能帮助到大家。
评论