關(guān)于自動(dòng)化測(cè)試用例失敗重試的一些思考
自動(dòng)化測(cè)試用例失敗重跑有助于提高自動(dòng)化用例的穩(wěn)定性,那我們來(lái)看一下,python和java生態(tài)里都有哪些具體做法?怎么做如果是在python生態(tài)里,用pytest做測(cè)試驅(qū)動(dòng),那么可以通過(guò)pytest的插件pytest-rerunfailures來(lái)實(shí)現(xiàn)失敗用例重跑,具體的使用方式有兩種,一種是通過(guò)命令行指定pytest --reruns 2 --reruns-delay 1,reruns表示重復(fù)運(yùn)行次數(shù),reruns-delay 表示重復(fù)運(yùn)行是的延遲時(shí)間。另一種方式是通過(guò)@pytest.mark.flaky(reruns=2, reruns_delay=1),這種方式一般運(yùn)用,不想全局所有的測(cè)試用例都重跑,只是特定的測(cè)試用例需要跑,那就在特定的測(cè)試方法上使用這個(gè)標(biāo)記。如果是在java生態(tài)里,用junit做測(cè)試驅(qū)動(dòng),junit5提供了注解@RepeatTest(2),可以試下測(cè)試類或者測(cè)試方法的重復(fù)運(yùn)行,也可以自定義,通過(guò)實(shí)現(xiàn)個(gè)TestRule接口,來(lái)控制測(cè)試用例的運(yùn)行。@Override public Statement apply(Statement statement, Description description) { Statement result = statement; Repeat repeat = description.getAnnotation(Repeat.class); if (repeat != null) { int times = repeat.value(); result = new RepeatStatement(statement, times); } return result; }}還有就是如果使用到了maven可以添加一個(gè)rerunFailingTestsCount參數(shù),不過(guò)這個(gè)是控制所有的用例了。為什么要讓失敗用例重跑呢因?yàn)樽詣?dòng)化一般都會(huì)在測(cè)試環(huán)境或者其他非線上的環(huán)境,由于環(huán)境的不穩(wěn)定可能會(huì)導(dǎo)致測(cè)試用例莫名其妙的失敗,是用例的穩(wěn)定性大打折扣。這個(gè)時(shí)候加入失敗重跑機(jī)制,能夠在一定范圍內(nèi)提高測(cè)試用例的穩(wěn)定性,做出更多的產(chǎn)出。什么樣的自動(dòng)化用例要進(jìn)行失敗重跑接口自動(dòng)化測(cè)試用以建議可以加入這種失敗重跑,而對(duì)于UI接口接口自動(dòng)化,失敗重跑的話,覺(jué)得意義不大,因?yàn)橥?dāng)用例的失敗的時(shí)候,要么是由于界面元素沒(méi)加載出來(lái),要么是用例的邏輯有問(wèn)題,要么是意外的彈窗影響,這個(gè)時(shí)候應(yīng)該讓錯(cuò)誤盡早的拋出來(lái),好盡快的修復(fù),而不是在哪兒一個(gè)勁的重試,沒(méi)啥用。UI自動(dòng)化應(yīng)該做好顯式和隱式等待。什么樣的失敗用例應(yīng)該重跑在測(cè)試框架中,最好能區(qū)分出什么樣的異常時(shí)服務(wù)異常,什么是測(cè)試框架本身的異常,對(duì)于服務(wù)異常可以適當(dāng)重試,對(duì)于框架異常不進(jìn)行重跑,直接拋出。斷言失敗當(dāng)然更不需要重跑。所以在控制測(cè)試用例執(zhí)行的時(shí)候,不要一股腦兒的全都重跑,有選擇性的,既要保證穩(wěn)定性,還要保證效率,讓自動(dòng)化發(fā)揮價(jià)值。
頁(yè):
[1]