99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時(shí)代如何教AI吃雞?
如何教AI吃雞?
2020-07-23
收藏

導(dǎo)讀:光看標(biāo)題,你可能會(huì)以為今天會(huì)聊一個(gè)休閑的話題,不不,今天我們將要認(rèn)真聊的,是一個(gè)嚴(yán)肅的軟件工程話題:自動(dòng)化測試。具體來說,是手機(jī)游戲的自動(dòng)化測試。不是別家的游戲,正是騰訊游戲,保證半點(diǎn)也沒有標(biāo)題黨。(堅(jiān)持看完有福利)

作者:木羊同學(xué)

來源:大數(shù)據(jù)DT(ID:hzdashuju)

學(xué)過軟件工程的同學(xué)應(yīng)該都知道,軟件工程是一門老師都可能隨時(shí)不知道自己到底在講什么的計(jì)算機(jī)專業(yè)課。不過,這不是本篇的重點(diǎn)。

軟件工程告訴我們很多重要的事,其中一件事是軟件都有一個(gè)生命周期。沒錯(cuò),一說軟件開發(fā),我們都會(huì)很自然想到寫代碼,但軟件工程告訴我們,寫代碼遠(yuǎn)不是軟件開發(fā)的全部工作,甚至還不一定是最重要的工作。

按照軟件工程的說法,開發(fā)軟件你得首先和客戶談笑風(fēng)生,這叫需求分析,接著就是各種寫不完的文檔和開不完的研究會(huì),都弄好以后,差不多就可以把“碼農(nóng)”找過來,把滿頭青絲編成代碼。

你以為這就完了?沒有!從軟件編碼到軟件正式上線部署之間,有一個(gè)非常重要的階段,叫軟件測試,俗稱Debug。Debug完了軟件該上線了吧?NoNoNo,城里人的套路深著呢,還有QA和QC在前面等著。等著干嘛呢,翻來覆去地花式折騰你的程序,目標(biāo)只有一個(gè),加油努力把程序玩脫。

照一些軟工書本的說法,軟件開發(fā)最重要的是需求,其次是測試,接著可能是什么三姑六婆,至于程序員死了都要愛的寫代碼環(huán)節(jié),在軟工書里經(jīng)常是三甲不入的,沒啥存在感。

當(dāng)然了,理想很豐滿,現(xiàn)實(shí)很骨感,干了一輩子程序員,從沒見過活著的QA、QC的也大有人在。所以,象牙塔里的軟工老師,講著講著能把自己繞暈也不足為奇,這里就不展開了。

但是有一點(diǎn),雖然大公司、小公司、以及不同流派的開發(fā)團(tuán)隊(duì),在軟件工程上的玩法各不相同,但有一點(diǎn)毫無疑問,軟件測試是軟件開發(fā)必不可少的環(huán)節(jié)。前面說過,軟件測試就是花式折騰程序,直到折騰出毛病來。

聽著是不是挺有意思?但真的走一遍你就會(huì)發(fā)現(xiàn),這事費(fèi)時(shí)費(fèi)事還費(fèi)腦子。軟件測試有一個(gè)經(jīng)典的環(huán)節(jié),叫設(shè)計(jì)測試用例。什么意思呢?簡單來說,你不是要花式折騰程序嗎,花式虐狗還得先寫一本《花式虐狗手冊》呢,測試用例就是花式折騰程序的手冊。

測試用例可不好設(shè)計(jì),測試用例最希望的目標(biāo)是做到路徑全覆蓋,也就是把程序所有可能的流程都測一遍。

這是非常燒腦的,光這么說可能感受不直觀,接下來我們要講游戲怎么進(jìn)行軟件測試,這里那就拿游戲作為例子好了,譬如說農(nóng)藥,現(xiàn)在要你設(shè)計(jì)一套路徑全覆蓋的測試用例,就是要你把所有角色的所有技能在所有可能的場景全都組合試一遍,就是這個(gè)難度,而且這還只是一小部分,因?yàn)檗r(nóng)藥除了競技,還有社交、氪金等等別的各種功能,全都需要覆蓋一遍。

現(xiàn)在應(yīng)該可以看出來,軟件測試并不簡單,一套設(shè)計(jì)良好的測試用例,背后往往需要對軟件的種種缺陷有深刻的認(rèn)識(shí)。這就是為什么軟工的書講到軟件測試,往往都會(huì)提出一個(gè)有點(diǎn)反直覺的觀點(diǎn):測試用例應(yīng)該盡可能安排資深的專家來設(shè)計(jì)。

折騰軟件聽起來簡單,寫程序有門檻,測程序誰還不會(huì)對吧。但是,真要做到路徑全覆蓋,還真不是這么簡單。隨著軟件規(guī)模越來越大,邏輯越來越復(fù)雜,傳統(tǒng)的手工測試成本自然也隨之暴漲,已經(jīng)到了純手工幾乎不可能完成的地步。這個(gè)時(shí)候,軟件測試人員想到了一個(gè)辦法。

玩游戲感覺難度太高怎么辦?開掛。那測試游戲也感覺難度太高怎么辦?沒錯(cuò),同樣也是開掛。軟件測試人員開發(fā)出一種技術(shù),叫自動(dòng)化測試技術(shù)。當(dāng)然了,雖然名字上叫“技術(shù)”,其實(shí)一開始也是測試人員零敲碎打甚至一拍腦門的產(chǎn)物。

根據(jù)《AI自動(dòng)化測試》這本書的介紹,自動(dòng)化測試技術(shù)的發(fā)展大致可分為四個(gè)階段:

第一個(gè)階段叫“錄制-回放”技術(shù),名字聽起來好像很厲害,其實(shí)就是利用按鍵精靈或者之類的軟件先記錄鍵盤和鼠標(biāo)的操作,然后不斷重放進(jìn)行測試。這套技術(shù)的優(yōu)點(diǎn)很明顯,簡單易學(xué),缺點(diǎn)也很明顯,軟件稍一改版,譬如稍微調(diào)整了一下某個(gè)按鈕的位置,原先錄制好的內(nèi)容就完全作廢了。

第二個(gè)階段叫腳本化的自動(dòng)化測試。腳本化意思就是要寫腳本來測軟件了,這應(yīng)該是現(xiàn)在軟件測試工作最常見的做法。不過和軟件測試腳本和寫軟件一樣,如果每次都從頭開始,很快就會(huì)發(fā)現(xiàn)很多功能其實(shí)高度類似,大量時(shí)間都是在做重復(fù)性的工作。那怎么辦呢?于是就有了第三個(gè)階段。

第三個(gè)階段叫測試框架。測試框架就是把測試腳本框架化,框架的好處不必多說了,在自動(dòng)化測試中,框架也具有同樣好處。有了測試框架,就可以把主要的時(shí)間精力,放在新增功能和核心功能的編寫上面,能夠顯著提升了測試腳本的編寫效率。

如果依據(jù)軟件開發(fā)的經(jīng)驗(yàn),應(yīng)該說自動(dòng)化測試到了這個(gè)階段,理論上就能難取得什么新突破了,實(shí)踐上能做的工作主要就是對現(xiàn)有框架進(jìn)行各種優(yōu)化升級(jí),或者開發(fā)新框架。那自動(dòng)化測試的第四個(gè)階段還能玩出什么新花樣呢?答案就是真·自動(dòng)化測試。

第四個(gè)階段叫AI自動(dòng)化測試。從自動(dòng)化測試的前面三個(gè)階段可以看出,雖然自動(dòng)化測試名叫“自動(dòng)化”,但實(shí)際上還是有許多工作需要人來完成,譬如說自動(dòng)化測試的腳本就必須人來編寫。

如果能夠把這部分工作也“自動(dòng)化”了,那豈不就是真正的自動(dòng)化?想法很好,畢竟偷懶是IT技術(shù)發(fā)展的源動(dòng)力,一樣工作偷懶了,就樣樣工作都想偷懶??墒?,可能嗎?以前是不太可能,現(xiàn)在隨著AI技術(shù)的進(jìn)步,“不太可能”也隨之變成了“也許可能”。

下面我們開始介紹如何基于AI技術(shù)對游戲類軟件進(jìn)行自動(dòng)化測試。關(guān)于AI技術(shù),我前面寫過很多的文章,所以在開始之前,我想分享一個(gè)關(guān)于AI技術(shù)的觀點(diǎn)。

技術(shù)的發(fā)展,尤其是計(jì)算機(jī)技術(shù)的發(fā)展,一定都是有一個(gè)不斷發(fā)展成熟的過程,都是從一個(gè)“也許可能”開始,步履蹣跚跌跌撞撞,甚至可能會(huì)中途夭折,但都必須熬過這個(gè)艱難的過程,最終才能百煉成鋼。

這幾年AI技術(shù)很熱,很多人已經(jīng)著急地開始討論用AI來取代人工,但在我看來,AI技術(shù)也并不例外,也需要經(jīng)歷那么一個(gè)跌跌撞撞的過程,選擇了AI技術(shù),并不意味著就選擇了萬事大吉,在通往應(yīng)用的路上,還有大大小小無數(shù)的坑在等著勇敢的先驅(qū)們?nèi)ヌ顫M。

現(xiàn)在的AI技術(shù)還正站在那個(gè)“也許可能”的起點(diǎn)上,更多地是告訴我們還有一種可能的選項(xiàng)。下面,我們就來一起看看,AI技術(shù)給游戲類軟件測試帶來怎樣的可能選項(xiàng)。

說到游戲,行業(yè)內(nèi)的同學(xué)第一個(gè)想到的應(yīng)該都是最能“用心創(chuàng)造快樂”的騰訊互娛,有好幾作爆款手游。最近騰訊互娛事業(yè)群的TuringLab實(shí)驗(yàn)室出了一本書,叫《AI自動(dòng)化測試》,書里提到了一點(diǎn)不快樂的事。什么事不快樂呢?就是前面一直在說的軟件測試。

手游也是軟件,當(dāng)然也需要進(jìn)行軟件測試,最常規(guī)的做法就是前面介紹的用自動(dòng)化腳本測試。但編寫測試現(xiàn)代手游的自動(dòng)腳本,有三點(diǎn)難題:

  • 第一點(diǎn),版本迭代頻繁。App時(shí)代,軟件版本更新是家常便飯,這個(gè)我們都不陌生,但是對于測試人員來就簡直是災(zāi)難了,每次更新自然都要調(diào)整腳本,有時(shí)甚至還做大幅度的改動(dòng),制造了大量的工作。
  • 第二點(diǎn),游戲本身就不太好測。游戲是一類特殊的軟件,其中一個(gè)特點(diǎn)就是場景較多,而且具有一定的隨機(jī)性,要通過腳本做到路徑全覆蓋尤為不易。
  • 第三點(diǎn),正式版本不帶測試API。測試腳本依賴軟件提供的測試接口才能完成各種測試動(dòng)作,但正式版本肯定不可能提供測試API,這就導(dǎo)致了測試腳本無法正常工作。那怎么辦呢?只好回到最原始的方式,用人工來測。

還有一點(diǎn)書里沒提,但我覺得這應(yīng)該也算是一大難題。騰訊互娛素來有“養(yǎng)蠱”的傳統(tǒng),同一類游戲題材,通常會(huì)選擇讓自家的多個(gè)制作團(tuán)隊(duì)同時(shí)獨(dú)立開發(fā)競品游戲,這一策略在市場上大獲成功,但不難想象會(huì)給背后的測試團(tuán)隊(duì)帶來多大的工作壓力。

畢竟人無論多努力,時(shí)間和精力都是有瓶頸的,但機(jī)器沒有,所以,騰訊互娛開始探索用AI技術(shù)來完成手游測試工作的自動(dòng)化道路。

要實(shí)現(xiàn)真·自動(dòng)化測試手游,首先需要解決三大問題。

第一個(gè)大問題是手游的“讀寫”問題,這是一切工作的基礎(chǔ)。手游是安裝在手機(jī)上的,必須得先找到一些方法能夠?qū)κ謾C(jī)進(jìn)行各種操作。

這個(gè)問題相對容易,Android操作系統(tǒng)就自帶了調(diào)試工具,此外還有許多好用的第三方工具包,譬如OpenSTF發(fā)布的minicap和minitouch,基于ADB實(shí)現(xiàn)了對Android手機(jī)運(yùn)行App的實(shí)時(shí)截屏和觸屏操作,這就首先為自動(dòng)化測試手游解決了“讀寫”問題。

第二個(gè)問題是“讀”的問題。玩手游被親切地稱為“擦玻璃”,這是有原因的,游戲的畫面呈現(xiàn),和對游戲角色的操作,都是在同一塊屏幕上進(jìn)行的。

minicap雖然實(shí)現(xiàn)了截屏,但是哪一部分是畫面,哪一部分又是操作呢?單就游戲畫面來說,至少還能細(xì)分成兩個(gè)部分,狀態(tài)畫面和獎(jiǎng)勵(lì)畫面。這不是規(guī)范叫法,這里我是借用了強(qiáng)化學(xué)習(xí)的部分概念。

強(qiáng)化學(xué)習(xí)里有一個(gè)智能體(Agent)的概念,不妨理解成玩游戲時(shí)你操作的游戲角色,智能體要干什么呢?三件事,觀察周圍環(huán)境,采取一些行動(dòng),爭取得到最高的獎(jiǎng)勵(lì)。

觀察周圍環(huán)境,術(shù)語叫做狀態(tài)(State),譬如說競速類游戲,當(dāng)前是在形勢在直路上,還是準(zhǔn)備進(jìn)入彎道。那獎(jiǎng)勵(lì)是什么呢?最容易能想到的就是游戲得分,不過,在一些游戲,譬如前面所舉的競速類游戲,還有一些其它的實(shí)時(shí)獎(jiǎng)勵(lì),比如當(dāng)前的車速等等。

強(qiáng)化學(xué)習(xí)就是通過觀察狀態(tài),分析出當(dāng)前應(yīng)該采取什么行動(dòng)(術(shù)語稱為“策略”),從而獲得最高獎(jiǎng)勵(lì)。這個(gè)過程稱為策略優(yōu)化。而要找到最優(yōu)策略,必須將狀態(tài)-行動(dòng)-獎(jiǎng)勵(lì)以三元組的形式保存下來作為訓(xùn)練樣本。這就要求必須首先從畫面中獲取狀態(tài)畫面和獎(jiǎng)勵(lì)畫面。

對于這個(gè)問題,《AI自動(dòng)化測試》介紹了如何使用基于深度學(xué)習(xí)的圖像處理算法,來完成場景覆蓋性測試和游戲場景圖像物體識(shí)別。

▲強(qiáng)化學(xué)習(xí)使用的各個(gè)區(qū)域示意圖,來源:《AI自動(dòng)化測試》圖3-8

第三個(gè)問題是操作的問題。解決了第二個(gè)問題,我們就獲取了手游的各種信息,那接下來應(yīng)該進(jìn)行什么動(dòng)作操作呢?這是軟件測試最關(guān)鍵的問題,也是自動(dòng)化測試最難解決的問題。對于這個(gè)問題,《AI自動(dòng)化測試》給出了兩種思路,第一種就是前面已經(jīng)提到的強(qiáng)化學(xué)習(xí),另一種名字就比較新鮮了,叫“模仿學(xué)習(xí)”。

什么叫模仿學(xué)習(xí)呢?很簡單,就是現(xiàn)在爭議非常大的“云通關(guān)”。模仿學(xué)習(xí)是這么玩游戲的,現(xiàn)在要我玩一款游戲,但我首先做的不是上手去玩,而是先到B站刷高手通關(guān)視頻,一直刷一直刷,一直刷到我認(rèn)為已經(jīng)把所有細(xì)節(jié)都印入腦海了,我就開始憑著記憶去玩游戲。

可想而知的是,很多的操作我雖然不清楚是為什么,也就是很多人說的失掉了探索游戲的樂趣,但我多半能很快通關(guān)。這就是模仿學(xué)習(xí)想要達(dá)到的結(jié)果。

好了,前面大致介紹了游戲自動(dòng)化測試所會(huì)遇到的問題,和《AI自動(dòng)化測試》給出的解決思路,但讀完你肯定感覺和我一樣,就算這些方法真的對路,不過要一一從頭實(shí)現(xiàn)實(shí)在太麻煩。

還記得我前面說的話嗎,偷懶是IT技術(shù)發(fā)展的源動(dòng)力,騰訊互娛顯然也知道這個(gè)道理,已經(jīng)推出了一款名叫GAME AI SDK的自動(dòng)化測試平臺(tái),提供了許多已經(jīng)封裝好了的工具,來逐一解決前面提到的這些問題。

關(guān)于這部分內(nèi)容,可以仔細(xì)閱讀《AI自動(dòng)化測試》這本書,GAME AI SDK正是本書的作者TuringLab團(tuán)隊(duì)的作品。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }