淺談如何在敏捷團(tuán)隊(duì)中優(yōu)化回歸測(cè)試

今天想要和大家聊聊一些回歸測(cè)試中遇到的問(wèn)題框弛,痛點(diǎn)以及實(shí)際項(xiàng)目中總結(jié)的一些優(yōu)化方案。

曾經(jīng)經(jīng)歷過(guò)一個(gè)項(xiàng)目在項(xiàng)目團(tuán)隊(duì)不斷壯大之后面臨的一個(gè)新問(wèn)題:回歸缺陷增多获三。當(dāng)時(shí)心里無(wú)數(shù)次在思考為什么我們的產(chǎn)品會(huì)是這樣的一個(gè)現(xiàn)狀只怎,為什么測(cè)試人員們已經(jīng)那么努力适肠,卻還是會(huì)有那么多的回歸缺陷?你無(wú)法想象制圈,作為一個(gè)測(cè)試人員们童,當(dāng)她們看到自己測(cè)試過(guò)的缺陷再次出現(xiàn)時(shí)心情,尤其當(dāng)這種現(xiàn)象周而復(fù)始的發(fā)生時(shí)鲸鹦,臉上是多么的羞愧慧库,心里是多么的著急,這讓我不得不又開(kāi)始分析我們整個(gè)測(cè)試活動(dòng)馋嗜。

由于在此之前一直在做微軟的產(chǎn)品測(cè)試齐板,眾所周知,微軟的測(cè)試在軟件行業(yè)是成熟且先進(jìn)的葛菇,他們有成熟的自動(dòng)化測(cè)試框架和工具甘磨,可以自動(dòng)分配,安裝眯停,釋放測(cè)試虛擬機(jī)济舆,測(cè)試環(huán)境,大量的回歸測(cè)試用例庵朝,測(cè)試用例的分類吗冤,優(yōu)先級(jí)又厉,編寫(xiě)者,?歷史記錄椎瘟,自動(dòng)分析失敗的測(cè)試用例覆致,失敗測(cè)試用例和缺陷的自動(dòng)連接,報(bào)告自動(dòng)生成以及分發(fā)肺蔚,這簡(jiǎn)直給測(cè)試人員帶來(lái)了極大的方便煌妈,他們真的可以集中精力在產(chǎn)品質(zhì)量上,全身心的投入在價(jià)值較高的測(cè)試活動(dòng)中,不會(huì)沉浸在無(wú)休止低效的非測(cè)試工作场梆,比如莉钙,“環(huán)境部署,安裝測(cè)試環(huán)境之宿,分析一次又一次的同樣原因失敗的測(cè)試用例,找對(duì)應(yīng)缺陷苛坚,一些反復(fù)的低效的溝通等等“比被。

由于剛畢業(yè)一直在做這樣的項(xiàng)目,完全處于一個(gè)美好而單純的測(cè)試環(huán)境泼舱,沒(méi)有看到過(guò)外面世界的紛紛擾擾等缀,直到進(jìn)入新的項(xiàng)目組,以前現(xiàn)成的成熟的工具和框架消失了娇昙,才對(duì)那些平時(shí)用起來(lái)順手到不會(huì)思考的東西開(kāi)始思考了尺迂。

那個(gè)項(xiàng)目組也有一套現(xiàn)有的BDD自動(dòng)化測(cè)試框架,這里面包括我們的冒煙測(cè)試以及回歸測(cè)試冒掌,?先來(lái)講講這里面的一些痛點(diǎn):

冒煙測(cè)試

1. 冒煙測(cè)試的投入遠(yuǎn)遠(yuǎn)超過(guò)產(chǎn)出噪裕。?由于80%失敗的測(cè)試用例都是產(chǎn)品一些小的前端布局或者功能上的改變,又或者是第三方服務(wù)不穩(wěn)定引起的宋渔,所以測(cè)試人員在修復(fù)這些失敗的測(cè)試用例時(shí)州疾,缺乏成就感,總覺(jué)得是一些低級(jí)的錯(cuò)誤引起測(cè)試用例掛掉皇拣,在其花費(fèi)的成本遠(yuǎn)遠(yuǎn)高于它所帶來(lái)的價(jià)值严蓖,這里的價(jià)值主要指的是監(jiān)控和確保開(kāi)發(fā)人員的的每一次提交都沒(méi)有影響產(chǎn)品主要流程。

2. 冒煙測(cè)試在責(zé)任劃分上不明確氧急,大多數(shù)情況下都是測(cè)試人員在修復(fù)颗胡。當(dāng)冒煙測(cè)試失敗后,沒(méi)有第一時(shí)間快速去修復(fù)吩坝,因此毒姨,阻塞了開(kāi)發(fā)人員提交代碼,在這么一個(gè)龐大的項(xiàng)目組钉寝,一旦冒煙測(cè)試失敗弧呐,被阻塞的那可就不是某個(gè)人的代碼提交闸迷,可能是幾十個(gè)開(kāi)發(fā)。久而久之俘枫,開(kāi)發(fā)人員感受不到冒煙測(cè)試帶來(lái)的價(jià)值腥沽,反而感受到更多的是累贅,效率低等等代名詞鸠蚪。

回歸測(cè)試

1. 測(cè)試用例冗余今阳,由于團(tuán)隊(duì)人員一直在更新,導(dǎo)致會(huì)有一部分測(cè)試點(diǎn)相同的測(cè)試用例茅信。

2. 沒(méi)有優(yōu)先級(jí)劃分盾舌,在運(yùn)行時(shí)沒(méi)有任何偏向性和設(shè)計(jì)性,需要的時(shí)候全跑一次蘸鲸,然后逐個(gè)排查失敗的測(cè)試用例妖谴。

3. 在自動(dòng)執(zhí)行時(shí),沒(méi)有策略酌摇,比如窖维,在pipeline上設(shè)置的是每天晚上跑一次,這樣高頻率的跑回歸測(cè)試導(dǎo)致pipeline長(zhǎng)時(shí)間處于失敗狀態(tài)妙痹,并且測(cè)試人員第二天就要花時(shí)間去調(diào)查,修復(fù)鼻疮。想想測(cè)試人員每天除了當(dāng)下迭代中繁重的測(cè)試任務(wù)怯伊,還要天天去修復(fù)回歸測(cè)試,這會(huì)給他們帶來(lái)多大負(fù)擔(dān)判沟。

4. 測(cè)試用例責(zé)任劃分不明確耿芹,?在很多測(cè)試用例失敗的情況下,沒(méi)有明確的Owner挪哄,?或者沒(méi)有根據(jù)項(xiàng)目和工作量大小合理調(diào)節(jié)Owner?

5. 回歸測(cè)試覆蓋率不夠吧秕,發(fā)布前的回歸測(cè)試給測(cè)試人員帶來(lái)的幫助不大,幾乎還要靠測(cè)試人員手動(dòng)去測(cè)試一遍迹炼。

以上種種再加上項(xiàng)目組其他因素影響導(dǎo)致產(chǎn)品線上問(wèn)題數(shù)量增多砸彬,這種現(xiàn)象長(zhǎng)期下去,客戶和團(tuán)隊(duì)對(duì)測(cè)試團(tuán)隊(duì)信任度減少斯入,因此可能會(huì)提出更多的額外要求砂碉,惡性循環(huán)間接導(dǎo)致測(cè)試人員工作量增大,但是產(chǎn)生出來(lái)的有價(jià)值的東西卻不多刻两。

下面是筆者想到的一些優(yōu)化回歸測(cè)試的方法:

1. 保證覆蓋率到80%的回歸測(cè)試

要想做好回歸測(cè)試增蹭,首先最重要的當(dāng)然是過(guò)關(guān)的覆蓋率,沒(méi)有足夠多的測(cè)試用例磅摹,其他理論滋迈,方法論都是空中樓閣霎奢。當(dāng)然實(shí)際項(xiàng)目中,也要結(jié)合項(xiàng)目人員配備等等其他因素的影響饼灿,期望的最大覆蓋率也可能會(huì)相應(yīng)變化幕侠,總之,適合自己團(tuán)隊(duì)的赔退,才是最好的橙依。我們只是希望它盡可能的高,當(dāng)回歸測(cè)試覆蓋率達(dá)到80%-90%的時(shí)候硕旗,是能很大程度解放測(cè)試人員雙手的窗骑,尤其在一個(gè)業(yè)務(wù)復(fù)雜,人員體系龐大的項(xiàng)目組中漆枚,沒(méi)有一套安全可靠的回歸測(cè)試安全網(wǎng)來(lái)把關(guān)创译,在產(chǎn)品發(fā)布后,是很難讓項(xiàng)目成員對(duì)產(chǎn)品質(zhì)量有信心的墙基,更甚者软族,會(huì)在發(fā)布前讓團(tuán)隊(duì)成員誠(chéng)惶誠(chéng)恐。在這一點(diǎn)上残制,測(cè)試人員有責(zé)任為團(tuán)隊(duì)編織這樣一條堅(jiān)實(shí)的安全防護(hù)網(wǎng)立砸,幫助團(tuán)隊(duì)建立質(zhì)量監(jiān)控,可視化的數(shù)據(jù)可以清晰的把產(chǎn)品質(zhì)量展現(xiàn)給團(tuán)隊(duì)初茶。


?2. 測(cè)試用例劃分優(yōu)先級(jí)

?站在測(cè)試的角度颗祝,個(gè)人很喜歡把每一次發(fā)布想象成一場(chǎng)博弈。每一條測(cè)試用例都是一枚棋子恼布,而測(cè)試人員就是這里的博弈人螺戳,產(chǎn)品是項(xiàng)目組的“帥”,缺陷則是對(duì)方的“將”折汞。為了贏得本次對(duì)弈倔幼,我們要很好的利用每一枚棋子,了解它們的特征爽待,什么時(shí)候出“車”损同,什么時(shí)候出“士”,什么時(shí)候再出“兵”堕伪,我們?yōu)榱硕沤^對(duì)方的攻陷揖庄,又要相應(yīng)擺什么陣做到無(wú)懈可擊,有的放矢欠雌,收放自如蹄梢。

在測(cè)試用例足夠多的時(shí)候,怎么管理好你這些棋子就至關(guān)重要了。那么在管理測(cè)試用例前禁炒,首先要了解測(cè)試用例而咆,并未它們加上標(biāo)簽,標(biāo)志它們不同的特征幕袱,這里我們想要提出的是最顯著的特征:優(yōu)先級(jí)

瀏覽一下我們的測(cè)試用例暴备,很大一部分是站在測(cè)試的角度去設(shè)計(jì)測(cè)試用例,沒(méi)有很精確的劃分優(yōu)先級(jí)们豌,設(shè)計(jì)出合理的測(cè)試用例等級(jí)緯度涯捻。參考眾所周知的二八法則,我們往往最重要的功能只占整個(gè)產(chǎn)品的20%望迎,其余的80%可能都沒(méi)那么重要障癌。在此基礎(chǔ)上,結(jié)合我們項(xiàng)目中的用戶數(shù)據(jù)分析統(tǒng)計(jì)辩尊,可以確定用戶實(shí)際使用較為頻繁的功能是和我們期望或者假想的功能是否一致涛浙,并且及時(shí)做出調(diào)整∩阌基于這里所定的劃分原則轿亮,在設(shè)計(jì)測(cè)試用例,映射出每條測(cè)試用例和功能模塊的優(yōu)先級(jí)胸墙。

?3.?測(cè)試用例責(zé)任劃分制

可以看到冒煙測(cè)試和回歸測(cè)試中出現(xiàn)問(wèn)題后我注,我們都缺乏一個(gè)很快的機(jī)制,讓它快速找到解決者迟隅,因此這里提出測(cè)試用例責(zé)任劃分制仓手。由于每次CI掛掉后,上面顯示的提交代碼人名字和實(shí)際真正搗蛋的提交代碼人名字不一致玻淑,大家總會(huì)在想是否是自己的代碼有問(wèn)題,或者存在僥幸心理呀伙,或者過(guò)分擔(dān)憂补履,總之不會(huì)有個(gè)明確的責(zé)任劃分,那也就不會(huì)第一時(shí)間去修復(fù)剿另。對(duì)于冒煙測(cè)試和回歸測(cè)試箫锤,我們可能不同的責(zé)任劃分制,比如冒煙測(cè)試雨女,會(huì)分兩種情況谚攒,一種是某個(gè)開(kāi)發(fā)人員的代碼導(dǎo)致CI掛掉,那么他就是責(zé)任人氛堕;另一種是測(cè)試用例失敗由非該開(kāi)發(fā)人員代碼原因引起的馏臭。這里的責(zé)任劃分制主要指的是我們需要確保每一條測(cè)試用例在后期是有人去維護(hù)的,在CI掛掉后讼稚,或者測(cè)試用例失敗后第一時(shí)間有人去修復(fù)括儒,不要阻塞其他人員工作绕沈。

這種責(zé)任劃分制還會(huì)發(fā)生在一旦出現(xiàn)產(chǎn)品需求改變,或者測(cè)試用例有問(wèn)題時(shí)帮寻,又或者是測(cè)試用例失敗的情況下乍狐,可以很明確的知道這條測(cè)試用例對(duì)應(yīng)到項(xiàng)目組的哪位成員,他有義務(wù)去更新或者分析這條測(cè)試用例固逗。

另外需要提到的一點(diǎn)是浅蚪,在測(cè)試用例失敗之后,最好可以自動(dòng)觸發(fā)出一條提示信息烫罩,這條提示信息包括這條測(cè)試用例的編寫(xiě)者惜傲,失敗日志,失敗時(shí)間等等.

4. 迭代回歸測(cè)試和發(fā)布回歸測(cè)試

結(jié)合敏捷原則“盡早發(fā)現(xiàn)問(wèn)題”和一般項(xiàng)目發(fā)布前的回歸測(cè)試嗡髓,我們衍生出來(lái)“迭代回歸測(cè)試”操漠。

迭代回歸測(cè)試:在迭代結(jié)束后期,項(xiàng)目應(yīng)識(shí)別出本次迭代所涉及的功能饿这,以及開(kāi)發(fā)本迭代功能可能會(huì)影響到的功能浊伙,對(duì)這些功能做一次有針對(duì)性的回歸測(cè)試。在實(shí)際項(xiàng)目中长捧,結(jié)合功能模塊相互間的依賴性和完整性嚣鄙,這個(gè)周期可以做適當(dāng)調(diào)整,比如兩個(gè)迭代做一次串结,只要確保本階段開(kāi)發(fā)的產(chǎn)品代碼質(zhì)量就可以了哑子。

迭代回歸測(cè)試的好處是既可以保證在本次迭代結(jié)束后,下一個(gè)迭代開(kāi)始前肌割,回歸測(cè)試代碼能夠盡可能的跟上功能開(kāi)發(fā)進(jìn)度卧蜓,及早發(fā)現(xiàn)和解決本次迭代產(chǎn)生的技術(shù)債務(wù),又能夠在宏觀上可視化本次迭代的產(chǎn)品質(zhì)量把敞。有了迭代回歸測(cè)試弥奸,我們不再需要每天去跑繁重的發(fā)布回歸測(cè)試,不再每天花費(fèi)測(cè)試人員額外去關(guān)注回歸測(cè)試奋早,可以全心全意工作在日常真正的測(cè)試中盛霎;不再看到一個(gè)長(zhǎng)時(shí)間失敗狀態(tài)的回歸測(cè)試?,讓項(xiàng)目組成員噫唏噓耽装。

?發(fā)布回歸測(cè)試:在發(fā)布前愤炸,為了保證我們本次發(fā)布中不會(huì)有我們遺漏掉的缺陷,并且整個(gè)產(chǎn)品所有能夠涉及到功能都沒(méi)有問(wèn)題掉奄,我們需要針對(duì)將要發(fā)布功能规个,范圍,?優(yōu)先級(jí),用戶绰姻,對(duì)回歸測(cè)試制定測(cè)試策略

做一次全覆蓋性的回歸測(cè)試枉侧,把所有回歸測(cè)試運(yùn)行一次,或者多次狂芋。

當(dāng)然榨馁,這里的方法論看上去很簡(jiǎn)單,但是在實(shí)際項(xiàng)目中似乎沒(méi)那么簡(jiǎn)單帜矾,它需要和開(kāi)發(fā)團(tuán)隊(duì)翼虫,測(cè)試團(tuán)隊(duì)無(wú)縫的溝通合作,借用他們專業(yè)的技術(shù)能力和業(yè)務(wù)能力屡萤,確保最終的功能劃分是正確并且合理的珍剑,在這里推薦在迭代開(kāi)始前創(chuàng)建一個(gè)idea board,?在本次迭代中,不管是需求分析師死陆,開(kāi)發(fā)人員招拙,測(cè)試人員,在識(shí)別到當(dāng)前代碼或者功能模塊可能會(huì)影響到某個(gè)功能時(shí)措译,及時(shí)記錄下來(lái)别凤,最后確定出來(lái)優(yōu)先級(jí),在迭代回歸測(cè)試和發(fā)布回歸測(cè)試中參考领虹。

5.?最后规哪,工欲善其事,必先利其器

一個(gè)好的測(cè)試用例管理工具會(huì)給測(cè)試工作者帶來(lái)很大便利塌衰,它最好可以幫助我們?cè)趦?yōu)先級(jí)诉稍,測(cè)試用例責(zé)任人,測(cè)試用例所屬功能模塊最疆,測(cè)試用例運(yùn)行次數(shù)杯巨,缺陷連接等等,滿足過(guò)濾分類功能努酸,建立測(cè)試資產(chǎn)的可跟蹤性舔箭,創(chuàng)建測(cè)試用例集,測(cè)試報(bào)告分發(fā)與分析蚊逢。這里推薦VS TFS,Zephyr箫章,它們都是很不錯(cuò)的測(cè)試用例管理工具烙荷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市檬寂,隨后出現(xiàn)的幾起案子终抽,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昼伴,死亡現(xiàn)場(chǎng)離奇詭異匾旭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)圃郊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)价涝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人持舆,你說(shuō)我怎么就攤上這事色瘩。” “怎么了逸寓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵居兆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我竹伸,道長(zhǎng)泥栖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任勋篓,我火速辦了婚禮吧享,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘生巡。我一直安慰自己耙蔑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布孤荣。 她就那樣靜靜地躺著甸陌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盐股。 梳的紋絲不亂的頭發(fā)上钱豁,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音疯汁,去河邊找鬼牲尺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幌蚊,可吹牛的內(nèi)容都是我干的谤碳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼溢豆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜒简!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起漩仙,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搓茬,失蹤者是張志新(化名)和其女友劉穎犹赖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體卷仑,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峻村,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锡凝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘昨。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖私爷,靈堂內(nèi)的尸體忽然破棺而出雾棺,到底是詐尸還是另有隱情,我是刑警寧澤衬浑,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布捌浩,位于F島的核電站,受9級(jí)特大地震影響工秩,放射性物質(zhì)發(fā)生泄漏尸饺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一助币、第九天 我趴在偏房一處隱蔽的房頂上張望浪听。 院中可真熱鬧,春花似錦眉菱、人聲如沸迹栓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)克伊。三九已至,卻和暖如春华坦,著一層夾襖步出監(jiān)牢的瞬間愿吹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工惜姐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犁跪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓歹袁,卻偏偏與公主長(zhǎng)得像坷衍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子条舔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.問(wèn):你在測(cè)試中發(fā)現(xiàn)了一個(gè) bug 枫耳,但是開(kāi)發(fā)經(jīng)理認(rèn)為這不是一個(gè) bug ,你應(yīng)該怎樣解決逞刷。 首先嘉涌,將問(wèn)題提...
    qianyewhy閱讀 9,259評(píng)論 4 123
  • 一、 軟件測(cè)試基本概念 1 bug的概念 bug類型:defect夸浅、fault仑最、problem、error… pr...
    三口一個(gè)瓜閱讀 3,692評(píng)論 0 12
  • 34****帆喇、在C/C++****中static****有什么用途警医?(請(qǐng)至少說(shuō)明兩種)1)在函數(shù)體,一個(gè)被聲明為靜...
    一箭閱讀 2,307評(píng)論 0 59
  • 銀行軟件測(cè)試面試問(wèn)題 軟件測(cè)試經(jīng)典面試題 軟件測(cè)試面試題匯總 測(cè)試技術(shù)面試題 1坯钦、什么是兼容性測(cè)試预皇?兼容性測(cè)試側(cè)重...
    天宇逍遙heart閱讀 1,445評(píng)論 0 20
  • 我聽(tīng)風(fēng)踏月 我腳踩山河 我逆流而上 我不能來(lái)到你身旁。
    曉曉博士閱讀 228評(píng)論 0 0