http://www.taobaotest.com/blogs/2433html
Nginx 單元測試自動化淺析之一 -Test::Nginx 源碼分析和使用 linux
Test::Nginx 是用來進行 Nginx 測試的一個 perl 語言的框架。該框架提供動態編寫、更改 nginx 配置文件的功能,提供 Nginx 服務器啓動關閉的功能以及提供 http 請求等功能。接下來經過分析源碼來介紹該測試框架的使用。nginx
源碼分析服務器
接下來介紹 Test::Nginx 測試框架中經常使用的功能的實現,主要包括構造函數, Nginx 配置文件的加載,服務器的啓動,服務的獲取,以及服務器的關閉的實現。數據結構
構造函數:框架
使用 Test::Nginx 模塊應該先調用其構造函數,在 perl 中的構造函數是調用的是 new() 方法。構造函數完成了測試須要的臨時文件夾的創建,構造函數源碼以下:函數
其中 $self->{_testdir} 實例化 hash 變量,並在 /tmp/ 文件夾下建立名爲 nginx-test-XXXXXXXXXX 的文件夾, XXXXXXXXXX 表示這些位的文件夾名稱爲隨機生成。理論每次實例化對象時建立的文件夾名稱都不同。源碼分析
經過在測試用例中用 Test::Nginx->new() 來獲取 Test::Nginx 的實例。單元測試
Nginx 配置文件加載:
Nginx 測試的配置文件是 write_file_expand() 函數傳入的。該函數要求傳入兩個參數,第一個參數是配置文件的名稱,第二個參數傳入的是配置的內容。配置的內容能夠是以文件讀取爲字符串的方式進行傳入,還能夠經過 write_file_expand('nginx.conf', <<'EOF') 。第二種傳參方式函數後面, 'EOF' 標誌以前的全部字符在輸入字符將做爲該函數的第二個字符串,即配置參數被傳入到寫入到配置中。
實現方式爲 write_file_expand() 先將傳入的配置文件隨機生成的測試的根路徑的臨時文件夾,在該路徑下建立 Nginx.conf 文件,其中 $self->write_file($name, $content) 方法的寫文件是經過覆蓋寫的方式進行的。
Nginx 測試對象的啓動:
Nginx 測試對象的啓動是經過調用 run() 函數進行的啓動的。 run() 函數能提供 0 個或者一個函數的傳參。 run() 函數經過建立一個子線程來對 nginx 進行啓動。父線程等待直到子線程啓動完畢再設置 $self->{_started} 來保證 nginx 服務器的啓動。 $self->{_started} 設置爲 1 表明該測試服務器已經啓動,源碼以下。
測試服務器服務的獲取:
服務器的獲取是經過 Test::Nginx 向外曝露的接口 http_get() 獲取的。該方法 http_get() 相似於 java 中的靜態方法,不須要實例化 Test::Nginx 的實例就能提供調用。該方法提供一個變量或者一個 hash 數據結構的傳參,該方法是調用 http() 方法進行實現的。源碼以下圖。
http() 函數調用了 IO::Socket::INET 模塊,設定請求協議爲 TCP 協議,請求地址爲測試框架的本地地址。該函數能經過 hash 的方式設置請求超時時間,該請求默認是用 get 的方式。經過 $s->getline() 方式讀取服務的返回值,該返回值包括響應 head 和 body ,並返回給用戶。
服務器的關閉:
測試服務器的關閉是經過 stop() 函數來實現的,該函數終止 run() 啓動的全部線程。並將 $self->{_started} 設置爲 0 ,退出該服務。
簡單的使用說明:
下列代碼功能是配置 Nginx 的啓動配置,進行 Nginx 服務器的啓動,制定測試用例計劃,啓動後驗證提供的服務的正確性,關閉服務器。初略的解釋爲代碼的 12 行聲明使用 Test::Nginx 模塊, 18 行經過一個自定義的讀取文件的方法,將配置文件值存儲於在變量 $conf 中。 20 行經過 write_file_expand() 函數將該 nginx 配置文件存在零時文件夾的一級目錄下。 25 行經過 http_get() 方法獲取服務器的服務。 30 行關閉服務器。
Perl 語法文檔連接