问答 为什么 playwright 会有异步调用?异步到底有什么用?

wilbur · 2023年08月21日 · 最后由 神梦无痕 回复于 2023年09月26日 · 6061 次阅读

在我用 playwright 作为内核,做 UI 自动化测试平台时,了解到 playwright 有两种方式调用:同步和异步
但是,同步不就已经能满足我们的日常测试了吗?为什么会出现异步调用的方式?有没有大神可以讲解一下,并列举一下使用场景

共收到 6 条回复 时间 点赞

异步和 ui 自动化没有关系,异步是你自己写用例时候,要考虑的。比如你想下载个东西,异步去调用,点了下载就不管了,可以继续执行别的东西。

这种问题百度必应谷歌一大把答案吧。

简单来说,我们把代码执行看成是一条时间线(我这样比喻是不贴切计算机底层实际运行的,但是就这个问题入门级可以这么理解),它是有先后顺序的。

按我们最开始学编程时的思维,代码就是一行一行往下执行,它的执行顺序可以通过人眼看代码完全判断出来现在跑到哪里。但是一行一行执行代码,有些工作是阻塞性的,比如执行一行读取磁盘、网络请求的代码,要到秒级的耗时。这时如果没有其他实现方式,代码就会阻塞,我们只能等待其完成,这显然是不合理的。

为什么不合理?想想你在烧水的时候,会傻傻的站在水壶前哪里也不去等着水沸腾吗?肯定不会,你会在这段时间里去做其他事,同时

  • 选择一:自己脑海里记着个时间,等到水差不多沸腾你自己跑回来确认 —— 定时轮询;不是异步,是同步非阻塞
  • 选择二:水沸腾会自动断电,自己随便找个足够长的时间回来处理 —— 本质上也是定时轮询,只是 “定时” 拉得很长
  • 选择三:水沸腾水壶会呼呼叫提醒你赶紧过来处理 —— 异步,水壶响就是事件,你听到水壶响就是接收到事件,你跑过来处理就是异步响应;怎么处理?你爱咋处理就咋处理,你可以关电、倒水、喝水,是你自己定义的处理逻辑

为什么会出现异步?应该解释清楚了,没有异步就只能各种同步或阻塞,效率低下,CPU 大量空转。

使用场景:你调用一个接口,这个接口要处理 10s 之后才会返回,怎么应用异步?

  1. 实现定义好接口返回之后你的处理逻辑
  2. 调用接口,把这个异步处理逻辑绑定上去,告诉它只要你接口返回,就运行这个处理逻辑
王稀饭 回复

你对异步的解释的很好,感谢。
但是 playwright 作为 UI 自动化工具,在我产品的日常工作中,并不需要做这些异步等待,和我们操作浏览器一样,所有操作是有先后顺序的;所以不知道有哪些场景需要等待,所以问这个问题;如果可以的话,请像一楼那样说一下你碰到过的使用场景,谢谢

wilbur 回复

直观例子:

  1. 发起了一个业务请求,后端处理有几秒时延,异步等待 ui 页面的相应,期间主动去做一些中间过程数据、日志的检查,发现有问题直接中断,不需要等待完整 ui 响应过程消耗时间

非直观例子:

  1. 业务接口是异步接口,想要做接口测试,天然就是写异步测试代码,强掰成同步反而更低效
  2. 自研测试框架,要实现同时运行多个测试用例且互相独立,做到测试用例不互相阻塞,可考虑套用异步概念,还能保持比较小的资源消耗(因为大概只需要一个单例类就能完成用例运行、断言,有排队的感觉)
wilbur 回复

我之前用 selenium 进行自动化测试,当用例数量过多 (同步) 一条一条执行很耗费时间,所以用 playwright 异步,直接异步执行所有测试用例,优化执行时间,并且 playwright 的智能等待、浏览器驱动也不错

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册