Skip to content

n-educatio-pl/TestBundle

Repository files navigation

TestBundle

Paczka usprawnia mechanizm Symfonowskiego ładowania fixturesów. Paczka jest całkowicie autonomiczna, oraz jest pokryta testami jednostkowymi w 100%. Co więcej, TestBundle wprowadza nową zasadę odwoływania się do konkretnych elementów na stronie za pomocą tak zwanych uchwytów.

Build Status

Instalacja

Zmiany dla pliku composer.json

"repositories": [
    {
        "type": "package",
        "package": {
            "name": "n-educatio/testbundle",
            "version": "dev-master",
            "source": {
                "type": "git",
                "url": "[email protected]:n-educatio/TestBundle.git",
                "reference": "master"
            }
        }
    }
],
"require": {
    "n-educatio/testbundle": "dev-master"
},
"autoload": {
    "psr-0": { 
        "Neducatio\\TestBundle": "vendor/n-educatio/testbundle/src"
    }
}

Następnie instalujemy brakujące vendorsy:

php composer.phar install

Uruchamianie testów paczki TestBundle

ant test - testy phpunit oraz testy behat

Przykład użycia fixturesów

Przykład można zobaczyć tutaj

Przykład użycia uchwytów

Przykład testu dla zmiany języka:

Kontekst

class LanguageContext extends BaseSubContext
{
  /**
   * Change website language
   *
   * @param string $language New langauge
   *
   * @When /^I change language to ([^"]*)$/
   */
  public function changeLanguage($language)
  {
    $this->setPage(LanguagePanel::NAME);
    $this->getPage()->changeLanguage($language);
  }
}

W naszym przypadku PageObjectem może stać się każdy element na stronie, taki jak menu, panel językowy, itp. Na co należy zwrócić uwagę to pole $proofSelector, które informuje o zasięgu działania PageObjectu.

class LanguagePanel extends BasePageObject
{
  const NAME = __CLASS__;
  protected $proofSelector = '.t_languages';
  /**
   * Changes language
   *
   * @param string $language Language
   */
  public function changeLanguage($language)
  {
    //Nasze uchwyty w tym przypadku to 
    //t_language_polish
    //t_language_english 
    $this->get('language_' . $language)->click();
  }
}

Zauważ, że metoda get() pobiera teraz uchwyt id, który musi być zahardkodowany w htmlu jako t_uchwyt.

Podział na Persony/itp

Naszym celem jest wczytanie tylko konkrentych Fixturesów potrzebnych do odpalenia testów, stąd każdy Fixture deklarowany jest jako konkrenta Osoba/Kurs/Komentarz/itd, który posiada unikatowe właściwości i atrybuty. Powiedzmy, że w naszym systemie istnieje dwóch testowych użytkowników: Julia Lazy ( persona, która jest już zarejestrowana w serwisie ) oraz Amy Fresh ( persona nie powiązana jeszcze w żaden sposób z aplikacją, ale posiadająca swój własny adres email, nazwę itp. Tworzymy je w następujący sposób: Nasza Amy Fresh

class LoadAmyFreshUserData extends LoadActorUserData
{
  const NAME = __CLASS__;
  protected $order = 100;
  protected $userData = array(
    'AmyFresh' => array(
      "username" => "[email protected]",
      "description" => "Teacher that visits the app for the first time and wants to give it a try",
      "roles" => "ROLE_USER",
      "firstname" => "Amy",
      "lastname" => "Fresh",
      "registered" => false,
    ),
  );
}

Oraz Julia Lazy

class LoadJuliaLazyUserData extends LoadActorUserData
{
  const NAME = __CLASS__;
  protected $order = 101;
  protected $userData = array(
    'JuliaLazy' => array(
      "username" => "[email protected]",
      "description" => "User that is only registered in the system",
      "roles" => "ROLE_USER",
      "firstname" => "Julia",
      "lastname" => "Lazy",
      "registered" => true,
    ),
  );
}

Obie persony w tym przypadku muszą dziedziczyć po klasie LoadActorUserData. Oczywistym staje się fakt, że każdy rodzaj person będzie miał analogicznie budowaną klasę, po której dziedziczą persony tego samego rodzaju.

Zależności

###Dodawanie Przejdżmy teraz do sedna możliwości naszego TestBundle. Załóżmy, że chcemy dodać do naszych Fixturesów pewne zależności. Robimy to w bardzo prosty sposób. W klasie Fixture A, która jest zależna od klasy Fixture B dodajemy taki oto krótki wpis:

protected $dependentClasses = array(
  B::NAME,
);

Teraz za każdym razem, gdy będziemy próbowali wczytać Fixture A, nasz TestBundle doczyta nam zależny Fixture B.

###Wczytywanie Czas na ostatni krok, jakim jest wczytanie Fixturesów. By móc tego dokonać należy w metodzie kontekstu dodać poniższy kod:

public function mojaMetodaKontekstowa()
{
  $this->loadFixtures(array(
    KLASA_Z_MOIM_PORZADANYM_FIXTUREM::NAME
  ));
  // Dalej robie coś tam z Fixturesami 
  // Dla przykładu:
  $this->getReference('mojaReferencja')->jakasMetoda();
}