测试那些事儿(一)- 同步和异步
网络编程中同步和异步的定义:
同步:就是发起一个功能调用时,在这个调用没有得到结果之前,该调用就不返回或调用者不继续执行后续操作。
异步:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态(轮询)、通知(消息)和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
从上面的定义中我们可以看出,同步和异步可以由调用者控制,也可以由被调用者控制。以下我们就暂认为调用者是客户端,被调用者是服务端。
客户端在调用服务端接口后,如果需要等服务端的返回结果才进行下一步操作,那就是同步。如果不需要,无论服务端返回什么,客户端都会进行下一步操作,那就是异步。
服务端本身也可以控制同步和异步。对于一个需要长时间计算的功能,服务端会将它做成异步的,在客户端请求后立即返回个结果给客户端,这个结果没有任何实际意义,只是说明服务端接收到了请求。对于一个很快就能得到结果的请求,那就使用同步好了,返回结果中包含了本次请求需要得到的数据。
那同步和异步测试需要注意什么呢?
1. 用户体验
现在有很多的app都有审核的功能,需要用户们提供各种资料完成相应的认证。这些审核有自动审核、人工审核等等。自动审核一般较快,因为需要对比的数据都存在服务端,直接程序比对即可。人工审核就慢了,快的话几分钟,如果赶上个周末,2-3天都不一定。所以,针对自动审核和人工审核,就需要合理的运用同步和异步,达到最好的用户体验。
自动审核快,用户在提交自己的资料后,稍事等待应该就能得到结果,在客户端上最多也不会等待超过5秒,看到个loading等一会就好了。在这种情况下,使用同步就很合适,客户端在没有得到服务端的结果时就等待,直到审核结果回传过来立即展示在客户端上,用户的体验会很好,毕竟很快得到了答案。
而人工审核,我们不能寄希望于总有一个人一直在那里审核,就算有,快的话也要几分钟吧,毕竟查数据什么的都是人工。用户在这种情况下是等不了的,也不可能一直在这个页面上等着。所以异步就派上了用场,客户端发出审核的请求,服务端接收到后立即告诉客户端我收到了,但不可能给出结果。客户端不论有没有接收到服务端的请求,都会告诉用户请等待XX时间后查看结果,用户不需要一直在这个页面等着。直到服务端计算完成,再通过推送消息的方式通知到客户端,或者用户再一次进入认证页进行认证结果请求,才会得知自己的认证结果。
对于测试来说,如果遇到需要很长时间才能得到结果的接口,就要建议客户端使用异步方式请求,减少用户差的体验
2. 功能实现
试想一下,如果一个功能需要两个接口配合才能完成,有可能存在什么问题呢?我们从本次同步和异步的主题考虑来举个例子:
有一个新建联系人的功能,能够新建联系人的入口有很多,假设其中一个入口是通过上传照片创建联系人。这个入口要是想完成新建就需要调用两个接口,一个是上传照片接口(A),另一个是创建联系人接口(B)。试想一下,如果A是客户端异步调用的,那是不是有可能会出现B调用完成后A还没有调用完成的情况?如果是那样,那本次创建的联系人就无法实时关联A接口上传的照片,轻则用户体验有问题(客户端可以使用轮询拉照片等),重则就会出现创建了联系人却没有照片的BUG。
测试人需关注
对于测试来说,如果一个功能需要>=2个接口的配合,一定要考虑这些接口是同步还是异步的,无论调用者还是被调用者。否则就会出现接口间本该有的联系却没有的情况