2011-08-04 72 views
13

我正在嘗試爲大量代碼更改不可用的應用程序編寫單元測試。幾乎所有的代碼庫中的PHP文件,使用一些$ _ SERVER [「」]變量,如

require_once $_SERVER['DOCUMENT_ROOT'] . '/mainApi.php'; 

所以,現在當我有編寫和運行PHPUnit的測試情況下,我必須以某種方式設置這些變量。 目前我在用戶環境中設置這些變量,然後做

$_SERVER['DOCUMENT_ROOT'] = getenv('DOCUMENT_ROOT'); 
require_once $_SERVER['DOCUMENT_ROOT'] . '/mainApi.php'; 

獲得這樣的服務器變量工作正常。我通過命令行運行我的測試,如$ phpunit test.php

Ques1:是否可以設置$ _ SERVER變量在運行命令行通過在PHPUnit測試?

我還必須通過Jenkins運行這些單元測試,並且我無法通過ANT /構建文件設置這些服務器變量。

Ques2:是否可以通過Jenkins中的ant構建文件設置這些變量,或者在通過Jenkins執行phpunit測試之前運行任何shell腳本?

我試圖通過一個shell腳本

export DOCUMENT_ROOT=/server/path-to-root-dir 

出口服務器變量並調用腳本在build.xml在詹金斯

<export name="setEnv" description="set server var"> 
    <exec executable="sh"> 
     <arg value = "sumit.sh" /> 
    </exec> 
</target> 

,但它不工作。有沒有我能爲此做的任何設置? 謝謝!

回答

6

我不確定#1,但PHPUnit本身必須支持它。我看不出有什麼辦法通過命令行來做到這一點。但是,如果您將當前的解決方案放入bootstrap.php中,則無需在每個測試中執行此操作。

對於#2,<exec>允許您使用嵌套的<env>元素設置環境變量。我在詹金斯使用這個。

<exec executable="phpunit" ...> 
    <env key="DOCUMENT_ROOT" value="/var/www/php"/> 
</exec> 

更新:您通常會創建bootstrap.php設置添加源目錄包含路徑和初始化測試環境,但是你所需要的。該文件不是由PHPUnit提供的 - 與phpunit.xml不同。

我把它放在與phpunit.xml相同的目錄下,但這是因爲我爲每個項目都有一個單獨的文件。它通常位於保存測試的目錄中。這使您可以從命令行運行phpunit,而不必告訴它如何找到這些配置文件。否則,您必須使用--bootstrap和/或--configuration指向它們。

這是我如何結構的典型項目:

<project-root>/ 
    build.xml 
    src/ 
     MyClass.php 
    test/ 
     MyClassTest.php 
     phpunit.xml 
     bootstrap.php 
+0

我們可以設置'$ _ SERVER [ 'DOCUMENT_ROOT']'直接通過構建文件?你的方法'''完全正常,但我的代碼中有很多SERVER變量,所以我必須寫所有'$ _SERVER [] = getenv()'在一個PHP文件中,並將不得不在所有的測試類中導入該文件。有沒有辦法可以減少它? – Sumitk

+0

@Sumitk - 您可以在'bootstrap.php'中執行PHPUnit在運行任何測試之前自動加載的任務。將文件放置在測試根目錄下,或使用'--bootstrap'命令行參數將PHPUnit指向它。 –

+0

這個'bootstrap.php'是一個我們與測試文件一起創建的文件,還是與PHPUnit一起提供的?因爲我無法在我的系統上看到它。另外,如果我們創建它,我應該在哪裏放置它?與所有的測試文件或'phpunit.xml.dist'? – Sumitk

相關問題