Nginx 單元測試自動化淺析之一-Test::Nginx源碼分析和使用

  http://www.taobaotest.com/blogs/2433html

主題 Nginx 源碼分析 單元測試java

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 語法文檔連接

http://perldoc.perl.org/index-tutorials.html

http://jianlee.ylinux.org/Computer/Perl/perl_base.html

相關文章
相關標籤/搜索