"測試已死」的觀點在業內仍然存在着爭議,不少公司縮減了測試人員,開發測試比屢創新高。本文旨在經過介紹軟件測試的新趨勢和新技術來展現軟件測試行業面臨的機遇與挑戰,爲軟件測試工程師的職業規劃提供參考。算法
安全測試編程
從孟加拉國銀行 8100 萬美圓被黑客成功盜取到美國民主黨郵件泄露事件能夠看出,網絡安全事件已經被推到了風口浪尖。隨着物聯網逐步普及,智能家居、汽車電子等設備的網絡化水平大幅提高。但物聯網的安全卻不容樂觀,不少中小企業每每忽視安全防禦。開源軟件的源代碼公開,黑客能夠經過閱讀源代碼更容易的分析出軟件的安全漏洞,使得網絡安全迎來了新的挑戰。當開源社區中發佈出 cve 漏洞時,須要廠商及時的合入補丁,不然將給黑客入侵敞開大門。安全
新的編程語言的出如今提升了編碼效率的同時,也爲軟件產品增添了安全挑戰,須要安全廠商儘快推出相應的安全工具和安全加固方案。隨着 SaaS 的普及,相信會有更多的安全工具問世。滲透測試須要測試工程師閱讀源碼來找出漏洞,與安全合規測試相比,須要更高的技術水平。在將來至關長的一段時間內滲透測試工程師將有很大的缺口。網絡
人工智能測試數據結構
近年來,人工智能(AI)被愈來愈多的應用在 IT 行業,如智能汽車、智能家居和機器人等。尤爲是 2016 年 AlphaGo 在圍棋領域掀起一股熱潮以後,AI 更多地成爲人們熱議的焦點。人工智能是一個新的領域,對於人工智能自己的測試方案和測試工具還有待完善。架構
對於人工智能在軟件測試領域的應用,即利用人工智能來優化其餘軟件的測試,目前已經取得了必定的進展。人工神經網絡是軟件測試領域使用相對普遍的 AI 技術之一。神經網絡是基於生物學中神經網絡的基本原理,在理解和抽象了人腦結構和外界刺激響應機制後,以網絡拓撲知識爲理論基礎,模擬人腦的神經系統對複雜信息的處理機制的一種數學模型。目前在 OCR,語音識別,醫學診斷等方面已經取得了很大的成功。在軟件測試中,它很是適合 GUI 測試、內存使用測試及分佈式系統功能驗證等場景。框架
遺傳算法是另外一個軟件測試中用到的 AI 技術。它是模仿生物遺傳和進化機制的一種最優化方法,它把相似於遺傳基因的一些行爲,如交叉重組、變異、選擇和淘汰等引入到算法求解的改進過程當中。遺傳算法的特色之一是,它同時保留着若干局部最優解,經過交叉重組或者解的變異來尋求更好的解。在軟件單元測試中,已知輸入的參數的範圍,求解哪些參數的組合可以達到最大的代碼覆蓋率(也有些研究是能達到最大的路徑覆蓋 / 分支覆蓋)。所以,遺傳算法能夠用於選擇最優的單元測試用例,也就是單元測試的最優輸入集。同時利用人工智能還能夠優化測試工具,將軟件測試的上下文與測試用例結合起來,選擇最優的測試用例集進行測試。運維
靜態分析與符號執行機器學習
軟件可靠性是對軟件在設計、開發以及所預約的環境下既有能力的置信度的一個度量,是衡量軟件質量的主要參數之一。而軟件測試則是保證軟件質量、提升軟件可靠性的最重要手段。靜態分析工具能夠直接對源碼進行掃描,但其誤報率的問題有待改善。編程語言
大量可靠性問題隱藏在未知場景和不熟悉的開源代碼中,有必要經過程序行爲分析工具來遍歷各類異常分支、代碼的全部路徑。符號執行技術是精確的路徑遍歷,是隨機測試、FUZZ 測試的有益補充。
符號執行表明工具 KLEE,在第一次學術使用(2008)便發現了 unix 系統中最經常使用的程序的多個問題,有的問題已經存在超過 15 年。符號執行技術在以前沒有獲得大規模應用,主要緣由是技術自己須要大量的計算資源(路徑爆炸)。隨着軟硬件技術的發展,平均計算成本比以前下降了不少,爲符號執行的發展和推廣提供了有利的客觀條件。目前符號執行技術已應用在許多公司的產品測試當中,如 HP、微軟等公司都已經有 10 年以上的符號執行探索經驗。當前基於 KLEE 的二次開發工具已經大量應用在軟件可靠性測試中,如 Mayhem 已發現了 DebianOS 的上千個 crash 問題,以及 Linux 和 Windows 系統的幾十個可利用漏洞。
精準測試
在當前敏捷測試的時代,版本發佈日趨頻繁,快速發佈高質量的軟件是不少企業的目標。對於急於發佈的軟件版本,全量運行全部的用例每每須要花費較長的時間,已經不能知足產品發佈的節奏。如何避免過分測試並在時間、質量、成本中找到最佳的平衡?
精準測試可以讓軟件測試過程可量化衡量、可追溯,清楚的展現出測試用例運行的路徑,並能夠實現測試用例與代碼的雙向追蹤。對於代碼量較大的系統的軟件,經過精準測試能夠獲取到曾經執行過某段代碼的測試用例,當這部分代碼進行修改後,只需執行對應的用例便可,大大縮短了測試的時間,加快了產品上線速度。所以精準測試成爲了近期軟件測試技術的新方向之一。精準測試的實施對測試人員的代碼開發、測試設計、需求理解、架構理解、自動化測試能力均有較高的要求。
雲測試
雲計算是一種按需提供計算資源的技術,它能夠減小用戶基礎設施投入並下降管理成本。然而,雲平臺在近年來不斷出現大面積宕機的狀況,這爲雲計算測試技術提出了新的挑戰。須要測試人員深刻理解雲平臺底層、中間層和上層技術,構建符合雲平臺質量要求的測試工程能力和質量保障方案。
不少測試服務提供商已經將測試服務部署到雲上,這種方式有不少的優點。首先,它能夠按需提供服務,用戶能夠根據需求靈活的佔用雲端資源,避免了傳統測試中的資源浪費。例如手機應用提供商能夠把應用程序經過雲平臺進行主流手機的兼容性測試,而沒必要直接購買各品牌的手機。其次,雲平臺能夠提供較爲全面的測試環境和測試工具,免去了部署環境和工具的時間,使測試工程師能夠將更多的精力投入到業務中。再次,當雲平臺和容器技術結合起來時,能夠快速構建可擴展可伸縮的測試環境,並行執行測試用例,從而減小測試執行時間。
物聯網測試
IoT 是一個包含大量網絡設備、傳感器和計算基礎設施的龐大系統。IoT 的應用覆蓋了軍事、家庭、醫療、零售等多個領域。其使用場景複雜,解決方案多元化,使得 IoT 設備以及解決方案的測試面臨很大的挑戰。下面筆者提出了一些觀點和思路供你們參考。
仿真
基於效率和成本的考慮,測試人員沒法針對全部的 IoT 設備、鏈接協議以及服務節點進行全面覆蓋。依靠 IoT 場景仿真能力,測試人員能夠在少許可用的物理設備上建立各種虛擬設備並創建不一樣協議的虛擬鏈接,從而模擬出真實應用場景,達到全面測試覆蓋的目的。不只可以節約時間和成本,還具備更好的靈活性和擴展性。
安全
當前 IoT 發展的重點是技術的創新、推廣和應用,安全問題沒有受到足夠的重視。相對傳統移動互聯網,IoT 的規模、應用和服務都更加龐大複雜,安全問題無疑具備極大的挑戰性。
自動化
在 IoT 領域,目前自動化測試工具和系統的發展還處於比較初級的階段。在測試執行、場景構建、性能度量及狀態監控等各個方面都須要有強有力的工具、框架和規範的出現,來支撐複雜的 IoT 自動化測試。
開源測試
開源軟件本着「不要重複造輪子」的原則,與商業軟件相比,擁有使用成本低、可定製性高等特色。目前開源測試工具種類繁多,涵蓋測試管理、缺陷管理、持續集成、功能測試、性能測試、測試框架、測試設計、安全測試等類別。下面列舉了這些分類中一些典型的測試工具。而針對咱們自身的業務需求,能夠經過修改源代碼來適配本身的業務,從而實現工具定製化。
測試管理: TestLink、Testopia
缺陷管理:Redmine、Bugzilla、Mantis
持續集成:Jenkins、Buildbot
功能測試:Selenium、LTP
性能測試:lmbench、Sysbench、Iperf、Fio
測試框架:JUnit、Autotest
測試設計:Xmind、StarUML、UML Designer
安全測試:Metasploit、Nessus、AppScan
爲了減小研發成本,不少公司都制定了基於開源軟件進行二次開發的策略。在重點測試自研特性的同時,面對大量的開源代碼,測試工程師須要與開源社區互動,及時將發現的問題提交給社區並同步社區的問題單和 cve 補丁。
然而,當前不少開源社區中的測試並不到位,不少特性在發佈以後長時間沒有對應的文檔和測試用例。以 kernel 社區的 user namespace 內核特性爲例,其是在 2013 年 2 月 18 日隨內核 3.8 版本正式發佈的,然而直到 2015 年 5 月 21 日,社區才擁有第一個該特性的測試用例。兩者時間間隔在兩年以上,版本的質量保證使人堪憂。對於這部分特性,須要測試工程師根據業務須要自行補充測試。測試工程師同時還要注意構建社區影響力,以保證與本身平臺相關的測試用例可以順利的被社區接收,從而減小測試代碼維護成本。感興趣的讀者能夠閱讀 《讓咱們成爲開源軟件測試者》。
容器化 /Devops/ 微服務
容器爲開發、測試、運維三個團隊提供一致的環境,避免由於環境不統一產生的缺陷誤報。同時使開發人員能夠很容易的經過容器鏡像復現測試人員和客戶報來的缺陷。利用容器還能夠避免環境污染和批量快速的啓動多個測試環境並行測試來提升測試效率。微服務將軟件細分爲多個子模塊,各模塊間相對獨立,便於測試進行遷移以便及早的發現缺陷。Devops 經過成熟的自動化解決方案,同時配合容器、微服務技術,打通了開發、測試、運維團隊的壁壘。隨着容器、微服務時代的到來,配置基於 CI/CD 的 Devops 流程成爲了測試人員必備的技能。感興趣的讀者能夠閱讀 《Docker 引領測試革新》。
敏捷測試
傳統的軟件測試方法將開發和測試視做兩個團隊的兩種不一樣的工做模式,團隊之間溝通比較有限,團隊壁壘較爲明顯。在這種開發模式下,軟件缺陷一般在項目後期才逐步被發現。近年來,在客戶需求頻繁變化、高強度的外部競爭壓力和軟件交付迭代頻繁的大環境下,傳統的軟件測試方式已經不能知足需求。
敏捷測試強調從客戶的角度進行測試,重點關注持續迭代地測試新開發的功能,而再也不強調傳統測試過程當中嚴格的測試階段,同時提倡儘早開始測試。它強調開發和測試團隊在合做、透明、靈活的環境下協同工做,以測試前移、持續集成、自動化等方式爲優化手段,能夠很好的適應快速、需求變動頻繁的軟件交付。
目前敏捷測試已經受到了行業內的承認,相信會有更多的公司將會進行敏捷轉型,敏捷教練的薪水也會水漲船高。
大數據測試
當前全球信息數據量增加迅猛,據市場調研機構 IDC 預測,到 2020 年,全球數據總量將達到 40ZB,至關於每人擁有一千張 DVD 光盤以上的信息量。如此大量的數據爲測試數據的備份和管理帶來了挑戰,測試人員須要確認數據完整性,保證數據質量。面對大量而動態變化的數據和有限的測試時間,須要制定出行之有效的測試策略,開發出適用的測試工具,並完善自動化測試。
隨着大數據應用的快速增加,咱們須要更快速的完成數據處理。大數據挖掘的目的是找出數據與數據的關聯關係,與傳統軟件相比,不少大數據場景中的輸出是沒法直接肯定的,同時數據又具備多樣性,須要測試人員具有更多的發散思惟;面對爆炸式的數據服務,測試時須要搭建可擴展伸縮的測試平臺模擬大量的測試客戶端。而面對大數據中不少場景下程序輸出的不肯定性、大數據結構多樣化、定位數據因果關係困難等問題爲測試工程師帶來了新的挑戰。
自動化測試
傳統的自動化測試須要測試工程師直接編寫測試程序,而這樣的程序每每可維護性不強,當開發代碼變動時每每須要從新適配自動化測試程序。測試驅動開發是軟件工程中的一個里程碑,即開發在提交開發代碼修改時同時要提交測試代碼,但這種方式仍然須要較多的人力投入到測試代碼的編寫中。而一些程序能夠經過錄制或符號執行等方法自動生成自動化代碼,免去了手工編寫的不便。另外經過埋點、mock 等技術還能夠輔助自動化測試。隨着測試業務日趨多樣化,須要不斷開發新的自動化測試框架、測試平臺來知足業務需求。當自動化測試與雲平臺相結合時,能夠方便的進行任務遷移、回滾、故障自動修復等功能。
移動互聯網測試
隨着智能移動設備的普及,測試範疇也從智能手機、智能平板擴展延伸至包含了運動手環、車載聯網應用、共享單車、無人機等事物。移動平臺也呈現多樣化趨勢,而每一個平臺的版本升級速度很是快。移動應用種類繁多,從社交到遊戲、教育、辦公、旅行、工具等類別。爲知足用戶需求,熱門應用的迭代更新很是頻繁。面對衆多的移動設備硬件型號、多個終端平臺版本、繁多的移動應用、各應用的不一樣版本號,測試人員不得不制定新的測試策略和方案來應對業務。即便應用沒有新的特性引入,但自動化測試不得不根據新的平臺進行適配工做。而多種組合的測試爲測試人員、測試工程能力、自動化測試提出了更高的要求。
目前已經出現了針對移動測試的自動化設備和 SAAS 平臺。測試設備能夠模擬出用戶真實的終端操做的方式。在 SAAS 平臺中,使用者能夠將應用提交到平臺中進行全量的自動化測試,來確保應用的多個版本能夠適配到不一樣的平臺和硬件中。此外,領域中的專項測試,如性能測試、功耗測試、安全測試、兼容性測試、跨地域跨時區測試、老化測試,也將產生很大的測試需求。
寫在最後
當前不少公司已經將基本的功能測試任務交由開發團隊負責,測試人員主要專一於自動化測試開發、安全測試、測試建模、精準測試、性能測試、可靠性測試等專項測試中。這部分測試任務可以很好的體現測試人員的價值。雖然「測試已死」的爭論還在繼續,但只要把握好軟件測試發展的趨勢並憑藉自身的努力,相信測試人員是可以在行業中受到承認的。
做者簡介
孫遠,華爲中央軟件院資深工程師,我的網站:www.enjoytesting.cn
孟憲偉,華爲中央軟件院資深工程師,碩士畢業,軟件行業 10 年以上從業經驗。目前從事華爲雲計算產品虛擬化平臺的測試以及相關測試工具的開發工做。加入華爲前供職於 IBM,Thomson Reuters 以及 VMware 等多家公司,期間曾從事軟件開發,項目管理,軟件測試等各種工做。
文章來源:InfoQ