2010-10-20 13 views
9

Sytuacja

Używamy PHPUnit w naszym projekcie i używania phpunit.xml aby upewnić rzeczy jak backupGlobals jest wyłączony.Konfiguracja PHPUnit (phpunit.xml) - ładowanie w bootstrapie?

Aby dodatkowo zapewnić, że ścieżka dołączania jest ustawiona i automatyczne ładowanie jest aktywne, kaskadujemy również nasze bootstraps testowy. To znaczy, każdy test i alltests-suite ma na szczycie, require_once(__DIR__ . '/../bootstrap.php');, aż do poziomu folderu podstawowego, gdzie oczywiście czyta się require_once(__DIR__ . '/bootstrap.php');, a rzeczywisty plik bootstrap znajduje się.

Zasadniczo nasze testy są autonomiczne. Możesz zadzwonić pod dowolny numer AllTests.php w dowolnym folderze i dowolny *Test.php samodzielnie, a one będą działać z odpowiednią konfiguracją.

Z wyjątkiem braku. 'Poczekaj chwilę. '

To prawda, jeśli my albo zmusić naszych programistów do korzystania phpunit --configuration=path/to/phpunit.xml czy są one w folderze z phpunit.xml (tak, że PHPUnit ciągnie go z bieżącego katalogu roboczego, gdy jest wykonywany).

Czasami niezwykle trudno jest ustalić, dlaczego testy na jednym komputerze dewelopera ulegają awarii i dlaczego działają one na innym. Po prostu zapominamy, że bootstrap nie jest jedyną rzeczą, której potrzebujemy mieć to samo środowisko testowe. Pamiętaj, że ponieważ nie możesz zapomnieć o bootstrapie, jeśli próbowałeś, ponieważ znajduje się on w samych testach, zapominając o innych ustawieniach, zwłaszcza zwykle takich opcjonalnych (jeśli jesteś w folderze z phpunit.xml, jest on automatycznie pobierany) , jest proste.

W rzeczywistości - zdarzyło się to kilka razy.

Pytanie

Czy istnieje sposób mogę dostarczyć który phpunit.xml użyć w pliku testowego jest prowadzony takie jak w naszym dogodnie wszechobecnego pliku uruchamiającego, zamiast dostarczania go do PHPUnit wcześniej, możliwe, że za pomocą przełącznika wiersza polecenia lub będąc w jego katalogu ?

pobieżny rzut oka na kod sugeruje odpowiedź brzmi nie - konfiguracja dobrze i wydaje się być ładowany przed Pliki testowe są nawet pociągnął:

[PHPUnit/TextUI/Command.php] 
... 
if (isset($this->arguments['configuration'])) { 
    $configuration = PHPUnit_Util_Configuration::getInstance(
     $this->arguments['configuration'] 
    ); 
    $phpunit = $configuration->getPHPUnitConfiguration(); 
    ... 

To ma jakiś sens, zważywszy, że konfiguracja może zawierać testową białą lub czarną listę.

Naprawdę, to nie ma sensu, aby obciążenie próbne filtry w teście bootstrap sama, więc to pół potencjał konfiguracja przez okno z, ale rzeczywiste flagi behawioralne PHPUnit ...

[sample of part of our phpunit.xml] 
<phpunit 
    backupGlobals="false" 
    backupStaticAttributes="false" 
    convertErrorsToExceptions="true" 
    convertNoticesToExceptions="true" 
    convertWarningsToExceptions="true" 
    syntaxCheck="false" 
    processIsolation="false" 
    colors="true"> 

... może z wyjątkiem "kolorów" uderza mnie coś, co sam test powinien być w stanie podjąć decyzję na pewnym poziomie.

Nagroda pocieszenia za ...

Prawdą jest, że w tej chwili byłbym szczęśliwy wiedząc, czy mogę nauczyć PHPUnit backupGlobals="false" z pliku bootstrap, jeśli ktoś zna jakiś sposób.

(Jeśli bezowocne, praktyczna odpowiedź będę dążyć będzie prawdopodobnie skopiować phpunit.xml do wszystkich podfolderów. Chciałbym uniknąć tego rozwiązania, ponieważ tworzy nadmiarowe kopie, i jeśli kiedykolwiek zdecydujesz się zmienić ustawienie ... tak, ouch!)

Odpowiedz

10

Bezpośrednia odpowiedź: Nie, nie możesz tego zrobić.

Dłuższa historia - tego rodzaju problem jest lepiej rozwiązywany poprzez zmianę nawyków programistów.

Tutaj możemy zrobić:

  • Wszyscy deweloperzy zawsze uruchomić testy z katalogu głównego badania, które ma wyłączną phpunit.xml wszelkich niezbędnych konfiguracji - w tym bootstrap, który konfiguruje autoloadery klasy .
  • Nie mamy testów jako takich, testy zgrupowane są przy użyciu katalogów, bez AllTests.php w dowolnym miejscu, ponieważ nie jest to konieczne. PHPUnit może pobrać nazwę katalogu i uruchomić wszystkie testy wewnątrz niego.
  • Nadal można uruchomić dowolny pojedynczy test, podając ścieżkę do niego lub całego zestawu testowego (podając ścieżkę do katalogu). Musi to być po prostu wykonane z katalogu głównego testów przez cały czas, albo nie będzie działać.

Postępowanie w ten sposób oznacza rezygnację ze swobody uruchamiania PHPUnit z dowolnego katalogu, ale szczerze mówiąc - nie wydaje mi się, żeby to była strata.

Zyski są znacznie większe: ilość kodu sprzątającego jest zmniejszona, programiści nie mogą o niczym zapomnieć, a wyniki są konsekwentne.

+0

Widzimy, naszym problemem jest to, że mamy tę pierwszą zasadę - ale deweloperzy są opowiadani raz i nic nie przypomina o tym, aby to zrobić.Działa 99 na 100 przypadków, gdy chcesz uruchomić cały pakiet testowy, ponieważ musisz upewnić się, że twoje zmiany nie były budowane, i robisz to z katalogu głównego - a potem zapominasz, kiedy chcesz wykonać szybkie ponowne przetestowanie gałęzi katalogu. – pinkgothic

+0

W tym, myślę, że twój punkt # 2 jest bardzo wnikliwy; być może usunięcie AllTests.php w podkatalogach nieco "wymusiłoby" proces myślenia, służy jako przypomnienie 'phpunit.xml'. Dam ci to trochę więcej uwagi i odbijam to od moich kolegów, może to lepsze rozwiązanie. – pinkgothic

+0

Jest to wybór pomiędzy zmianą nawyków a tworzeniem piekła utrzymania (z dużą ilością plików konfiguracyjnych, które muszą być zsynchronizowane). Powodzenia :) –

4

Moje rozwiązanie jest dodać funkcję Bash

function phpu() 
{ 
    phpunit --colors --bootstrap ~/path/to/bootstrap.php "[email protected]"; 
} 

następnie dodać to do wszystkich dev .bashrc plików i mogą przełączyć się na używanie tego.

Chcemy, aby połączyć je z vim więc musiałem dodać do .vimrc. set shellcmdflag=-ic

Następnie dodać nmap ;t :! phpu % uruchomić plik testowy w którym aktualnie jesteś

0

Można zaktualizować skrypt startowy (Plik Windows bat lub shell na * nix) i logikę tam, aby skonfigurować lokalizację pliku phpunit.xml. Jeśli znajduje się w katalogu bieżącym, użyj go, inaczej wskaż główny.

Zgadzam się również z Anti, że wszystkie testy powinny być zawsze uruchomione, ponieważ chcesz mieć pewność, że zmiany, nawet w gałęzi katalogu, nie wpłyną na inny kod. Dlatego zawsze biegnij od góry drzewa. Wymaga to również szybkiego wykonania testu, ale tak naprawdę nie miałem problemu z PHPUnit.

Utrzymanie pliku PHPUnit.xml w każdym katalogu byłoby koszmarem utrzymania, chyba że symbolicznie zostało powiązane z innymi ścieżkami, aby upewnić się, że istnieje tylko jeden rzeczywisty plik.