目前市場上已經有了不少自動測試工具,不過滿足自己需求的測試工具卻很難找到或者是難以支付其昂貴的費用,對于在Linux/Unix后臺運行的軟件產品,自己開發一個自動測試工具,不但可以滿足軟件的測試需求,還可以節省一大筆費用。
這個自動測試系統架構的設計,是基于Linux/Unix后臺運行的軟件產品,架構的思想,源于主流測試工具與前輩的實踐經驗。
軟件的自動測試,其實就是一種思想,不管是市場上的主流測試工具,還是自主開發的測試工具,都只是工具,關鍵的是怎樣去組織一個工具,怎樣將工具應用于軟件測試中。
第2章 系統架構
2.1 設計思想
1.自動測試的組成:自動測試主要有幾部分組成:(1)、自動測試工具(2)、測試案例(3)、模擬接口(4)被測試軟件(5)自動編譯與安裝
2.自動測試工具:自動測試工具的主控程序不需要理解業務,所有的業務邏輯和測試數據都寫在測試案例中,主控程序執行每個測試案例中的指令完成每個測試案例的測試,測試結果記錄在指定的文件中。
3.測試案例:業務邏輯和測試數據體現在測試案例中,一個完整的測試案例應該包括測試條件預置、測試步驟、每個測試步驟的輸入與輸出、預期結果、實際測試結果的獲取、實際測試結果與預期測試結果的對比。每個測試動作為一個操作指令,每個操作指令包括指令的ID、輸入與輸出,主動測試工具就是通過執行測試案例的這些指令來完成自動測試的。
4.黑盒測試:被測試軟件對于自動測試工具來說,是一個黑盒子,自動測試工具不關心被測試軟件的內部邏輯和業務流程,關心的被測試軟件的接口以及每個接口的輸入和輸出。自動測試工具向被測試軟件輸入測試數據,在相應的接口獲取測試結果,如果測試結果與預期結果相一致則測試通過,否則測試失敗。
5.模擬接口:與被測試軟件打交道的各個接口,需要模擬,在必要時可以設置模擬接口給被測試軟件的返回值,以達到測試的目的。
6.自動編譯與測試:自動編譯就是自動到源代碼管理服務器編譯軟件,將軟件上傳到測試服務器。自動測試就是自動更新或安裝被測試軟件,啟動自動測試工具執行自動測試案例,記錄測試結果并將測試結果以郵件的方式發送給相關的人員。
7.測試環境的恢復:在某個測試案例執行完成后,不管測試是成功還是失敗,都需要恢復被該測試案例特殊化后的測試環境。
8.重用策略:公用的模塊提取出來,被別的模塊或功能調用,提高模塊的公用性,減少程序冗余代碼。
9.自動測試工具模塊組成:
(1)主控程序:讀取測試案例以及每個測試案例的操作指令,根據不同的操作指令調用不同的指令接口執行每個測試案例的指令,記錄測試結果。
(2)指令接口:是測試案例操作指令與具體測試步驟實現之間的橋梁,與測試案例的操作指令相對應,指令接口就是實現測試案例的操作指令所需要做的事情,動作完成之后將該動作的操作結果返回給主控程序。
(3)驅動程序:驅動程序是實現具體的指令操作的程序,被指令接口調用完成具體的測試工作,并將測試結果返回給指令接口。
(4)輔助功能:實現系統的輔助功能,比如案例文件的處理,底層socket處理,文件處理或者數據庫操作。
2.2 系統架構
2.3 系統流程圖
[Page]
第3章 自動測試核心設計
3.1 系統組成
自動測試工具由主控程序、指令接口、驅動程序和輔助功能組成。
3.1.1 主控程序
控制模塊不理解業務,把業務邏輯和測試數據全部寫在案例里,控制模塊讀取所有需要測試的測試案例以及每個測試案例的每一個操作項的動作,調用不同的接口處理模塊來實現整個測試流程。
控制模塊處理流程:
1.讀取命令,獲得需要執行的命令以及配置文件。
2.分析命令以及命令的參數,比如如果命令是想查看幫助,則打印幫助提示;如果命令是執行測試案例,則開始執行自動測試的測試案例。
3.分析配置文件,獲取測試案例存放目錄,需要執行的案例的ID文件,數據庫連接信息,測試案例所使用到的參數。 (注:因為在測試案例的執行中,未必執行完整個測試案例,測試案例中的某些動作可能不需要執行,可在配置文件或測試案例中進行配置)
4.根據測試案例存放目錄以及測試測試的ID文件獲取具體需要測試的測試案例。
5.獲取每個測試案例需要執行的動作指令以及輸入數據。
6.逐個執行測試案例,根據測試案例的動作指令調用不同的接口執行不同的動作。
7.某個測試案例測試完成后,獲取該測試案例的測試結果,并將測試結果輸出到結果記錄文件中。
8.繼續執行下一個案例,直到所有的測試案例都被測試完為止。
3.1.2 指令接口
是測試案例操作指令與具體測試步驟實現之間的橋梁,與測試案例的操作指令相對應,指令接口就是實現測試案例的操作指令所需要做的事情,動作完成之后將該動作的操作結果返回給主控程序。接口模塊負責與接口的數據處理,包括輸入和輸出,同時必須包括數據處理的結果。主控程序在讀取了測試案例的操作指令之后,調用這些操作指令所對應的指令接口執行相應的操作,如果該接口執行操作成功則主動程序繼續下一步操作,否則測試終止,只有所有的測試步驟的指令都被成功之行,測試案例才通過。
為了方便管理與調用,所有的接口都實例化都一個接口工廠中,在實現了相應的指令接口后,需要將這些指令接口增加到接口工廠中,接口工廠根據案例中的接口類型來調用不同的接口實例。
指令接口,事實上就是執行測試案例中的每個指令要求做的事情,比如輸入測試案例的測試數據、執行相應的測試步驟、獲取測試結果、對比測試結果,指令接口完成一個指令之后將這個指令的操作結果返回給主控程序。
比如,話單檢查指令接口,指令接口需要做的事情就是初始化要監聽的話單文件,獲取話單文件,把獲取到的話單文件同期望話單進行比較,返回比較結果給主控程序。
又如:短信接收發送指令接口,指令接口的工作就是實現發送MT,收取狀態報告并把收到的狀態報告的狀態值與期望的狀態值進行比較,返回比較結果給調用者;收到本地MO,并把收到到的本地MO與期望的MO進行比較,返回比較結果給調用者。
3.1.3驅動程序
驅動程序是實現具體的指令操作的程序,被指令接口調用完成具體的測試工作,并將測試結果返回給指令接口。驅動程序是具體操作的完成者。
比如,話單檢查驅動程序,用于對特定話單格式的話單文件進行跟蹤,并且能夠把跟蹤結果解析成話單,話單檢查指令接口會調用話單驅動程序完成具體的每條話單的各個子段的比較,驅動程序完成檢查后將結果返回給指令接口。
3.1.4 輔助功能
實現系統的輔助功能,比如案例文件的處理,底層socket處理,文件處理或者數據庫操作。 [Page]
3.2 測試案例
3.2.1 測試案例的組成
測試案例包括了業務邏輯、測試步驟以及輸入與輸出,使用XML存儲測試案例,可以提高測試案例的可讀性、通用性以及可維護性。不過這樣有一個不好的地方就是測試案例看起來會比較龐大,不夠輕盈,但是非常清晰,即使是對測試案例完全不熟悉的人,只要看了也自然很快就對業務流程有了一個大致的了解;而且,業務邏輯體現在測試案例,也會增強系統的擴展性,如果需要增加某些測試步驟或修改測試數據,只需要修改測試案例即可。
測試案例主要由測試案例ID、測試案例描述、以及測試操作指令所組成。測試案例ID就是測試系統的案例ID,測試描述包括測試案例的簡要描述、測試產品名稱、測試功能點、測試版本、測試類型以及測試案例的作者,測試操作指令是測試案例的核心,每個測試步驟就是一個操作指令,操作指令的順序與業務邏輯或測試步驟相關。每個操作指令包括:
(1) 操作指令ID,在Test Case中唯一;
(2) 操作指令接口名稱,自動測試工具所提供的指令接口名稱,在一個Test Case中可以出現多次;
(3) 操作指令接口動作名稱,自動測試工具所提供的指令接口的具體操作的名稱,在一個Test Case中可以出現多次,自動測試工具操作指令接口名稱和操作指令接口動作名稱調用不同的指令接口的功能完成相關的動作;
(4) 操作指令的描述;
(5) 模擬接口的信息,如果需要使用到模擬接口,需要將模擬接口相關的信息再測試案例中輸入,模擬接口相關信息應該參數化;
(6) 輸入數據,也就是執行這個操作步驟所需要輸入的測試數據或是預期的結果或延時等待時間等。
(7) 輸出數據,也就是這個操作步驟的輸出結果。
一個測試案例就是一個完整的測試流程,由不同的操作步驟組成,每個操作步驟就是一個操作指令,一個完整的測試案例可能包括這些操作指令:
(1) 預置測試環境,比如修改某些特殊的配置、設置模擬接口的返回值、檢查某些數據等;
(2) 測試步驟,一個測試案例可能有多個測試步驟,每個測試步驟為一個操作指令,操作指令的輸入就是測試需要輸入的數據,動作就是需要執行的測試操作,測試案例的測試就是由一系列的操作指令完成;
(3) 檢查測試結果,一個測試案例中可能存在多個檢查點,每個檢查點為一個操作指令,這操作指令的輸入就是預期的測試結果,操作指令的動作就是獲取測試結果并將測試結果與預期測試結果相比較,如果相等則測試通過,否則測試失;
(4) 恢復測試環境,測試完成后應該恢復測試環境的原始數據或相關的資源。
為了提高測試的擴展性與靈活性,測試案例中的測試數據應該可以參數化,這樣即使是測試數據發生了變化,只需要修改參數的值即可,而不必把所有的測試案例的某些數據逐個修改。這些參數以及參數的值可以存放在配置文件中,被測試案例引用,自動測試工具根據測試案例的參數的名稱到相應的配置文件中讀取這個參數的值。
3.2.2 測試案例的命名
為了提高測試的可維護性,測試案例的命名必須規范,在此約束為測試案例的名與測試案例的ID一致。
3.2.3 測試案例的存放
對于不同的產品的測試案例,應該存放在不同的主目錄中,對于同一個產品的測試案例,根據不同的功能存放于不同的子目錄中。每個主目錄或子目錄應該有一個測試案例的ID文件,在這個文件中的測試案例會被自動測試工具執行自動測試。測試案例ID文件中,每一行為一個測試案例,每個測試案例由序列號、測試案例ID和該測試案例的描述組成。測試案例的存放位置,自動測試工具可通過配置文件獲取。
3.3 自動測試執行
3.3.1測試案例的編寫與測試
自動測試工具實現后,接下來很大部分的工作就是測試案例的編寫和測試了,根據業務邏輯和自動測試案例的規范將測試案例系統中的測試案例轉化成自動測試案例腳本,自動測試案例腳本編寫完成后對這些腳本進行測試,確保自動測試案例腳本能夠被正確地執行且正確地測試了測試案例所描述的功能。在利用自動測試工具進行測試之前,首先要測試自動測試工具和案例能否正確地進行相關功能的測試,否則自動測試的結果不可信,自動測試也就沒有意義了。 [Page]
3.3.2自動測試的執行
自動測試案例編寫完成后,自動測試就可以在無人干預的情況下進行測試了。
(1)需要進行自動測試的測試案例的ID寫在一個文件中,自動測試工具只執行這個文件中的測試案例;
(2)自動測試案例的目錄、數據庫連接、模擬接口的IP和Port等參數寫在配置文件中,自動測試工具會到配置文件指定的目錄讀取測試案例,也會讀取自動測試工具所使用到的數據庫連接信息和模擬接口信息;
(3)自動測試案例所使用到的參數寫在參數配置文件中,自動測試工具根據自動測試案例的參數的名字到參數配置文件中讀取該參數的值代替自動測試案例中的參數;
(4)指定測試結果的輸出文件,自動測試工具在測試完一個測試案例之后,將這個測試案例的測試結果輸出到測試結果文件中,測試結果文件每行表示一條測試案例,每條測試案例的輸出結果包括測試案例的ID,測試案例的功能描述和測試案例的結果;
(5)自動測試工具在測試案例的過程中,需要記錄測試日志,包括測試案例ID,讀取測試案例的內容,測試步驟,各個測試步驟的測試結果,測試結果的比較等;
(6)自動測試工具自動執行所需要測試的案例,并記錄測試結果,測試工程師在測試完成后查看測試結果,測試成功的測試案例意味著這個功能測試通過,對于測試失敗的測試案例,需要根據日志分析原因,如果是測試環境或測試腳本引起的則修改環境或測試案例或自動測試工具,否則需要記錄bug,通知開發修改測試失敗的測試案例所發現的問題。
第4章 自動編譯與自動測試
4.1.1自動編譯
自動編譯就是在源代碼管理服務器上進行自動編譯,對編譯的結果進行分析,并將編譯成功的并且是自動測試環境需要的文件更新到測試環境中。
自動編譯的過程可分為:
(1) Update源代碼服務器上的需要編譯的所有相關代碼,需要編譯的代碼的路徑在配置文件中讀;
(2) 自動編譯需要編譯的源代碼;
(3) 分析源代碼編譯結果,只有編譯成功了的執行文件用于自動測試才有意義,將編譯結果上傳到測試服務器并發送給相應的人員;
(4) 將需要更新的文件打包并上傳到測試服務器,并將上傳結果發送給相關人員。
自動編譯,可以寫一個腳本交給crontab去調用自動編譯程序,實現無人干預下的編譯自動化。
4.1.2自動測試
這里所說的自動測試,就是自動更新或安裝被測試軟件,自動啟動被測試軟件,然后跑自動測試案例進行自動測試,并將自動測試的結果發送給相關的測試或開發人員。
自動測試的過程可分為:
(1)到自動編譯結果上傳目錄獲取自動編譯結果,分析自動編譯結果,如果自動編譯失敗則自動測試結束,發送測試結果給相關人員,否則進行一步;
(2)到FTP被測試軟件的安裝文件上傳目錄獲取FTP上傳結果,分析ftp上傳結果,如果ftp失敗則自動測試結束,發送測試結果給相關人員,否則進行下一步;
(3)到被測試軟件的安裝文件上傳目錄獲取安裝文件;
(4)停止原正在運行的被測試軟件,如果是全新安裝的測試環境,不需要執行這一步;
(5)進行軟件安裝或更新:如果是一個全新的測試環境則進行軟件的安裝,如果是已經存在的測試環境則更新被測試軟件;
(6)啟動被測試軟件;
(7)調用自動測試工具進行自動測試,記錄測試結果;
(8)所有自動測試案例都測試完成之后,分析測試結果,將測試結果發郵件通知相關的測試和開發人員。
自動編譯,可以寫一個腳本交給crontab去調用自動測試程序,實現無人干預下的測試自動化。
配置文件應該包括以下信息:
(1) 自動編譯的結果文件和FTP的結果文件的路徑、文件名;
(2) 被測試軟件的安裝文件或更新文件的路徑; [Page]
(3) 存放自動測試結果的路徑和文件名;
(4) 停止原測試軟件的腳本的路徑和文件名;
(5) 啟動被測試軟件的腳本的路徑和文件名;
(6) 啟動自動測試軟件進行自動測試的腳本的路徑和文件名;
(7) 測試結果發送的郵件地址。
第5章 編后語
來到新的公司,戰戰兢兢地接下了自動測試的重任,在軟件測試的領域,這是我以往接觸得最少的一部分,也是我最沒把握的一部分,不過同時也是我最想學習的一部分。自動測試,在很早以前就想花時間去研究了,不過因為老公司產品的限制,也因為自己沒有足夠的決心去研究,所以一直沒有動作。這篇文章的完成后,自己忽然有了一種豁然開朗的感覺,我知道我已經找到了自動測試的感覺。
文章來源于領測軟件測試網 http://www.kjueaiud.com/