網(wǎng)絡(luò)編程中同步和異步的定義:
同步:就是發(fā)起一個(gè)功能調(diào)用時(shí),在這個(gè)調(diào)用沒(méi)有得到結(jié)果之前,該調(diào)用就不返回或調(diào)用者不繼續(xù)執(zhí)行后續(xù)操作。
異步:異步與同步相對(duì),當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者在沒(méi)有得到結(jié)果之前,就可以繼續(xù)執(zhí)行后續(xù)操作。當(dāng)這個(gè)調(diào)用完成后,一般通過(guò)狀態(tài)(輪詢)、通知(消息)和回調(diào)來(lái)通知調(diào)用者。對(duì)于異步調(diào)用,調(diào)用的返回并不受調(diào)用者控制。
從上面的定義中我們可以看出,同步和異步可以由調(diào)用者控制,也可以由被調(diào)用者控制。以下我們就暫認(rèn)為調(diào)用者是客戶端,被調(diào)用者是服務(wù)端。
客戶端在調(diào)用服務(wù)端接口后,如果需要等服務(wù)端的返回結(jié)果才進(jìn)行下一步操作,那就是同步。如果不需要,無(wú)論服務(wù)端返回什么,客戶端都會(huì)進(jìn)行下一步操作,那就是異步。
服務(wù)端本身也可以控制同步和異步。對(duì)于一個(gè)需要長(zhǎng)時(shí)間計(jì)算的功能,服務(wù)端會(huì)將它做成異步的,在客戶端請(qǐng)求后立即返回個(gè)結(jié)果給客戶端,這個(gè)結(jié)果沒(méi)有任何實(shí)際意義,只是說(shuō)明服務(wù)端接收到了請(qǐng)求。對(duì)于一個(gè)很快就能得到結(jié)果的請(qǐng)求,那就使用同步好了,返回結(jié)果中包含了本次請(qǐng)求需要得到的數(shù)據(jù)。
那同步和異步測(cè)試需要注意什么呢?
1. 用戶體驗(yàn)
現(xiàn)在有很多的app都有審核的功能,需要用戶們提供各種資料完成相應(yīng)的認(rèn)證。這些審核有自動(dòng)審核、人工審核等等。自動(dòng)審核一般較快,因?yàn)樾枰獙?duì)比的數(shù)據(jù)都存在服務(wù)端,直接程序比對(duì)即可。人工審核就慢了,快的話幾分鐘,如果趕上個(gè)周末,2-3天都不一定。所以,針對(duì)自動(dòng)審核和人工審核,就需要合理的運(yùn)用同步和異步,達(dá)到最好的用戶體驗(yàn)。
自動(dòng)審核快,用戶在提交自己的資料后,稍事等待應(yīng)該就能得到結(jié)果,在客戶端上最多也不會(huì)等待超過(guò)5秒,看到個(gè)loading等一會(huì)就好了。在這種情況下,使用同步就很合適,客戶端在沒(méi)有得到服務(wù)端的結(jié)果時(shí)就等待,直到審核結(jié)果回傳過(guò)來(lái)立即展示在客戶端上,用戶的體驗(yàn)會(huì)很好,畢竟很快得到了答案。
而人工審核,我們不能寄希望于總有一個(gè)人一直在那里審核,就算有,快的話也要幾分鐘吧,畢竟查數(shù)據(jù)什么的都是人工。用戶在這種情況下是等不了的,也不可能一直在這個(gè)頁(yè)面上等著。所以異步就派上了用場(chǎng),客戶端發(fā)出審核的請(qǐng)求,服務(wù)端接收到后立即告訴客戶端我收到了,但不可能給出結(jié)果。客戶端不論有沒(méi)有接收到服務(wù)端的請(qǐng)求,都會(huì)告訴用戶請(qǐng)等待XX時(shí)間后查看結(jié)果,用戶不需要一直在這個(gè)頁(yè)面等著。直到服務(wù)端計(jì)算完成,再通過(guò)推送消息的方式通知到客戶端,或者用戶再一次進(jìn)入認(rèn)證頁(yè)進(jìn)行認(rèn)證結(jié)果請(qǐng)求,才會(huì)得知自己的認(rèn)證結(jié)果。
對(duì)于測(cè)試來(lái)說(shuō),如果遇到需要很長(zhǎng)時(shí)間才能得到結(jié)果的接口,就要建議客戶端使用異步方式請(qǐng)求,減少用戶差的體驗(yàn)
2. 功能實(shí)現(xiàn)
試想一下,如果一個(gè)功能需要兩個(gè)接口配合才能完成,有可能存在什么問(wèn)題呢?我們從本次同步和異步的主題考慮來(lái)舉個(gè)例子:
有一個(gè)新建聯(lián)系人的功能,能夠新建聯(lián)系人的入口有很多,假設(shè)其中一個(gè)入口是通過(guò)上傳照片創(chuàng)建聯(lián)系人。這個(gè)入口要是想完成新建就需要調(diào)用兩個(gè)接口,一個(gè)是上傳照片接口(A),另一個(gè)是創(chuàng)建聯(lián)系人接口(B)。試想一下,如果A是客戶端異步調(diào)用的,那是不是有可能會(huì)出現(xiàn)B調(diào)用完成后A還沒(méi)有調(diào)用完成的情況?如果是那樣,那本次創(chuàng)建的聯(lián)系人就無(wú)法實(shí)時(shí)關(guān)聯(lián)A接口上傳的照片,輕則用戶體驗(yàn)有問(wèn)題(客戶端可以使用輪詢拉照片等),重則就會(huì)出現(xiàn)創(chuàng)建了聯(lián)系人卻沒(méi)有照片的BUG。
測(cè)試人需關(guān)注
對(duì)于測(cè)試來(lái)說(shuō),如果一個(gè)功能需要>=2個(gè)接口的配合,一定要考慮這些接口是同步還是異步的,無(wú)論調(diào)用者還是被調(diào)用者。否則就會(huì)出現(xiàn)接口間本該有的聯(lián)系卻沒(méi)有的情況