2011-08-04 16 views
13

Próbuję napisać testy jednostkowe dla aplikacji, w których wiele zmian kodu nie jest możliwe. Prawie wszystkie pliki .php w bazie kodu używa niektóre $ _SERVER [ '] zmienne jak

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

Więc teraz, gdy mam napisać i uruchomić przypadków testowych phpunit mam jakoś ustawić te zmienne. Obecnie jestem ustalania tych zmiennych w środowisku użytkownika, a następnie robi

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

Pierwsze zmienne serwera, jak to działa poprawnie. Testy przeprowadzam przez linię poleceń jako $ phpunit test.php.

Ques1: Czy można ustawić zmienne $ _SERVER podczas uruchamiania testów phpunit za pomocą linii poleceń?

Muszę również przeprowadzić te testy jednostkowe za pośrednictwem Jenkinsa i nie mogę ustawić tych zmiennych serwera poprzez ANT/plik kompilacji.

Ques2: Czy to możliwe, aby ustawić te zmienne przez ant pliku kompilacji w Jenkins lub uruchamiając dowolny skrypt przed wykonaniem testów phpunit przez Jenkinsa?

Próbowałem eksportu zmiennej serwera za pomocą skryptu powłoki

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

i wywołanie tego skryptu w build.xml w Jenkins

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

ale jej nie działa. Czy jest jakieś ustawienie, które mogę dla tego zrobić? Dzięki!

Odpowiedz

6

Nie jestem pewien co do numeru 1, ale sama PHPUnit musiałaby go obsługiwać. Nie widzę sposobu, aby to zrobić za pomocą wiersza polecenia. Jeśli jednak umieścisz obecne obejście problemu w bootstrap.php, nie musisz tego robić w każdym teście.

Dla # 2, <exec> pozwala ustawić zmienne środowiskowe za pomocą zagnieżdżonych elementów <env>. Używam tego w Jenkins.

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

Aktualizacja: Zazwyczaj utworzyć bootstrap.php skonfigurować dodać do katalogu źródłowego do ścieżki include i zainicjować środowiska testowego jednak trzeba. Ten plik nie jest dostarczany przez PHPUnit - w przeciwieństwie do phpunit.xml.

Umieszczam go w tym samym katalogu co phpunit.xml, ale to dlatego, że mam osobny plik dla każdego projektu. Przechodzi do katalogu, który zwykle przechowuje twoje testy. Pozwala to na uruchamianie phpunit z wiersza poleceń bez informowania, jak znaleźć te pliki konfiguracyjne. W przeciwnym razie musisz użyć --bootstrap i/lub --configuration, aby wskazać im.

Oto jak wyglądać struktura typowego projektu:

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

możemy ustawić '$ _SERVER [ 'DOCUMENT_ROOT']' bezpośrednio przez plik build?Twoja metoda '' działa idealnie dobrze, ale mam tak wiele zmiennych SERVER w moim kodzie, że będę musiał napisać wszystkie '$ _SERVER [] = getenv()' w pliku php i będzie musiał zaimportować ten plik we wszystkich klasach testowych. Czy istnieje sposób, aby go zmniejszyć? – Sumitk

+0

@Sumitk - Możesz wykonać przypisania w 'bootstrap.php', które PHPUnit ładuje automatycznie przed uruchomieniem jakichkolwiek testów. Albo umieść plik w katalogu w katalogu głównym twoich testów lub wskaż na nim PHPUnit używając argumentu wiersza poleceń '--bootstrap'. –

+0

Czy to 'bootstrap.php' to plik, który tworzymy wraz z plikami testowymi, czy też pochodzi z PHPUnit? Bo nie mogę tego zobaczyć w moim systemie. Również jeśli go tworzymy, gdzie powinienem go umieścić? ze wszystkimi plikami testowymi lub z 'phpunit.xml.dist '? – Sumitk