當咱們談論人工智能及其姊妹詞機器學習時,咱們是什麼意思?我想我會澄清咱們的用法,以便清楚咱們如何使用AI和機器學習來推動最早進的API測試。算法
人工智能是數字市場中最超負荷的流行語之一。「人工智能」讓人聯想到諸如全能的超級計算機,一心想要毀滅人類;Alexa或Siri的語音控制協助;電腦棋牌對手;或自動駕駛汽車。安全
維基百科將人工智能研究定義爲「......對‘智能代理人’的研究:任何可以感知環境並採起最大限度地提升其成功實現目標的機會的行動的設備」。但這有點太抽象了。我喜歡把人工智能看做是計算機程序或機器的思考(爲本身推理)和學習(收集數據並以有益的方式修改將來行爲)的能力。正是在這個定義中,咱們開始看到一些更有意義的東西,即AI對軟件開發工具和技術的意義。網絡
一樣重要的是要意識到,被認爲是「AI」的範圍會隨着時間的推移而改變。例如,曾經,人們認爲光學字符識別(OCR)是人工智能中最早進的技術。或者是Siri和Alexa的問答式回答,在一段時間內,其影響被認爲是最早進的,但如今基本上被認爲是理所固然的,並不老是被認爲是AI系統。一樣的事情也會發生在軟件測試工具上--隨着新功能的發展,今天自動化方面的創新將成爲預期。但如今,讓咱們考慮2019年軟件測試自動化中的AI。數據結構
目前,人工智能在軟件開發中的應用還處於起步階段,與自動駕駛系統或語音輔助控制等發展較快的工做領域相比,自主化程度要低得多,不過仍在向自主測試的方向推動。人工智能在軟件測試工具中的應用主要集中在讓軟件開發生命週期變得更容易。經過應用推理、解決問題,以及在某些狀況下應用機器學習,人工智能能夠用來幫助自動化和減小開發和測試中的平凡而繁瑣的任務。框架
「測試自動化工具不是已經作到了嗎?」你可能會問。機器學習
答案固然是,「是的!他們作的!」......但它們有侷限性。工具
人工智能在軟件開發中大放異彩的地方是,當它被應用於消除這些限制時,使軟件測試自動化工具可以爲開發人員和測試人員提供更多的價值。AI的價值來自於減小開發人員或測試人員對最平凡任務的直接參與。(在應用業務邏輯等方面仍然很是須要人類智能。)單元測試
例如,考慮到大多數(若是不是所有)測試自動化工具爲你運行測試並提供結果。大多數人不知道要運行哪些測試,因此他們會運行全部的測試或一些預約的集合。那麼,若是一個支持人工智能的機器人可以審查測試狀態的當前狀態、最近的代碼變化、代碼覆蓋率和其餘指標,決定運行哪些測試,而後運行它們呢?將基於變化數據的決策引入,就是應用AI的一個例子(順便說一下,Parasoft也是這樣作的)。在決策過程當中,軟件可以有效地取代開發人員/測試人員。將其應用於CI/CD流水線的好處是顯而易見的。學習
那麼,機器學習呢?機器學習能夠經過應用算法,讓工具經過收集測試產生的大量數據自動改進,從而加強人工智能的功能。開發工具
機器學習研究是整我的工智能研究的一個子集,重點是基於以前觀察到的數據進行決策管理。這是總體人工智能的一個重要方面,由於智能須要隨着學習的提升而修改決策。不過在軟件測試工具中,機器學習並不老是必要的--有時,一個支持AI的工具最好是手動微調,以適應使用該工具的組織,而後每次均可以應用相同的邏輯和推理,不管結果如何。
在其餘狀況下,數據收集是決策過程的關鍵,機器學習可能很是有價值,最初須要一些數據,而後隨着收集更多的數據而改進或適應。例如,代碼覆蓋率、靜態分析結果、測試結果或其餘軟件指標,隨着時間的推移,可讓人工智能瞭解軟件項目的狀態。
機器學習有本身的子集,叫作深度學習,它創建在處理大量數據的基礎上進行學習。這些數據,在大多數狀況下,是由多層分析神經網絡表明的--它們是受人類神經元網啓發的模型,幫助計算機獲取新知識,並進行高度智能的推理。
深度學習的關鍵方面是由神經網絡表明的海量信息來驅動決策過程。這樣的數據量在軟件測試中並不老是可用或不適用——也許這就是爲何咱們尚未看到不少深度學習在這些領域的應用案例。一個可能的例子是,從數千萬行代碼中「學習」,以瞭解不一樣類型的安全違規行爲,並實現基於深度學習模型的靜態分析引擎。
這是Parasoft研發的一個重要領域。使人振奮的是,目前的產品只是一個開始,其在AI和ML方面的持續研究將繼續帶來新的方法,將這些技術整合到Parasoft的產品中。如下是Parasoft已經將它們引入的幾種方式。
第一個例子是在Parasoft Jtest中,Jtest爲Java開發者提供的軟件測試解決方案,包括靜態分析、單元測試、覆蓋率和可追溯性等。在這裏應用人工智能,Jtest發佈了自動測試用例生成功能,當從稀疏的JUnit線束開始時,它能夠幫助開發人員填補空白。
Parasoft Jtest的IDE插件爲單元測試實踐增長了有用的自動化功能,經過簡單的一鍵操做來建立、擴展和維護單元測試。經過使用支持AI的Jtest,用戶能夠實現更高的代碼覆蓋率,同時將構建一套全面而有意義的Junit測試用例所需的時間和精力減小一半。
它實現這一目標的方式之一是使建立用於隔離被測代碼的存根和mocks變得更加容易。底層的AI使Jtest可以觀察被測單元,以肯定其對其餘類的依賴性,當這些依賴性的實例被建立時,它建議用戶對其進行mock,以建立更多的隔離測試。自動建立必要的mock和存根,減小了測試建立中最耗時的一個環節的工做量。
Parasoft Jtest還能自動檢測現有測試套件未覆蓋的代碼,並遍歷源代碼的控制路徑,以弄清哪些參數須要傳遞到被測方法中,以及須要如何初始化子/mocks才能到達該代碼。經過啓用這個AI,Jtest能夠自動生成新的單元測試,應用修改後的參數來提升整個項目的總體代碼覆蓋率。
另外一個很好的例子,將機器學習加入其中,是Parasoft SOAtest的智能API測試生成器,它超越了記錄和回放測試,利用人工智能和機器學習將人工UI測試轉化爲完整的自動化API測試場景。
智能API測試生成器使用推理來理解行使UI時進行的不一樣API調用的模式和關係。從該分析中,構建了一系列的API調用,表明了UI流程中的底層接口調用。而後,它經過觀察它能觀察到的關於不一樣API資源的信息來應用機器學習,並將它們做爲模板存儲在一個專有的數據結構中。這個內部結構經過檢查用戶庫中的其餘測試用例來更新,以學習行使API時的不一樣類型的行爲,例如,一個斷言,或者在正確的位置添加一個特定的頭。
AI在這裏的目標是建立更高級的測試(而不是像簡單的記錄和回放測試那樣,只是重複用戶在作什麼)。該工具能夠識別流量內部的模式,建立觀察到的參數的綜合數據模型,生成自動化的API測試,並能夠將學習到的模式應用到其餘API測試中,以加強這些測試,幫助用戶建立更高級的自動化測試場景。生成的自動化API測試更加完整可重用、可擴展、彈性變化。
自動驗證UI層是你的測試策略的另外一個關鍵組成部分,以確保產品在投入生產前獲得充分驗證。Selenium框架做爲用戶的明確選擇,已經被普遍地應用於UI測試,但用戶仍然從常見的Selenium測試挑戰的可維護性和穩定性中掙扎。這就是人工智能技術,尤爲是機器學習能夠提供幫助的地方,在運行時提供自我修復功能,以解決與UI測試執行相關的常見可維護性問題。
Parasoft 經過Parasoft Selenic提供了這一功能,它能夠在你按期執行Selenium測試的過程當中「學習」你的內部數據結構。Selenic引擎能夠監控每一次的運行,並捕捉關於被測應用程序的Web UI內容的詳細信息。它提取DOM元素,它們的屬性,定位器等,並將它們與UI驅動的測試所執行的動做相關聯。Selenic採用了Parasoft專有的數據建模方法,將這些信息存儲在其AI引擎內部,而且模型會不斷更新,分析全部測試的歷史執行狀況,繼續變得「更聰明」。
在網頁的UI元素被移動或大幅修改,致使測試失敗的狀況下,這是一個關鍵的時間節省。經過Selenic,引擎使用的AI啓發式方法能夠將這些變化的元素與模型所表明的歷史數據進行「匹配」,並自動生成抗變化的「智能定位器」,在運行時恢復Selenium測試的執行。這些變化的信息會自動在模型中傳播,將來生成的新定位器也會根據這些變化進行調整。
成功採用靜態分析工具的障礙之一是管理大量的警告和處理結果中的誤報(不是真正錯誤的警告)。分析遺留或現有代碼庫的軟件團隊對使用靜態分析獲得的初始結果感到苦惱,並對這種體驗感到反感,以致於再也不繼續努力。感到不知所措的部分緣由是現代靜態分析工具所能提供的標準、規則(檢查器)、建議和指標的數量。
軟件開發團隊有獨特的質量要求,檢查器或編碼標準沒有一刀切的建議。每一個團隊都有本身對誤報的定義,一般意味着「不在意」,而不是「這在技術上是不正確的」。Parasoft對此的解決方案是應用人工智能和機器學習對靜態分析報告的結果進行優先排序,以改善用戶體驗和此類工具的採用。
Parasoft使用一種方法,經過審查少許的發現,並根據與這些發現相關的元數據構建一個分類器,將靜態分析工具輸出中的發現快速分類爲團隊但願看到的東西或團隊但願抑制的東西。這個分類器是基於以前人工對靜態分析發現進行分類的結果,既包括歷史上對不相關警告的抑制,也包括事先對代碼庫內部有意義的發現進行優先修復。
最終結果分爲兩種狀況:
這極大地改善了用戶體驗,將開發人員引導到適用於其項目的可能性最高的警告上。經過這些創新,組織能夠當即減小採用和使用靜態分析的人工努力。
那麼接下來會有什麼發展呢?咱們正在這個領域積極研發,繼續尋找人工智能和機器學習的進一步應用來加強咱們的軟件測試工具套件。研究的路線有不少,但最終的目標是明確的:幫助團隊更高效地開發和測試代碼,以最快的速度建立更高質量的軟件。