Testowanie Twojej strony na Drupalu właśnie stało się łatwiejsze dzięki Behat (obszerny samouczek)

Opublikowany: 2020-09-08

„Nie ma na świecie nic potężniejszego niż dobra historia”, powiedział król dowcipu i mądrości, Tyrion Lannister.

Siła historii i dobrej komunikacji umożliwia współpracę i wydajne dostarczanie oprogramowania. Ewoluując z metodyk zwinnych, technologie Behavior Driven Development (BDD) w pełni wykorzystują tę moc do automatyzacji procesu testowania. Behat jest jedną z takich technologii BDD, która umożliwia automatyczne testowanie przy użyciu „wszechobecnego języka”. Dowiedzmy się więcej o Behat, Mink, Gherkin i jak to zaimplementować w Drupalu.

behat drupal

Co to jest Behat?

Behat to framework PHP typu open source, który służy do automatyzacji testowania poprzez wykorzystanie Behavior Driven Development (BDD). Podejście BDD zapewnia wysoką jakość dostarczania oprogramowania, skupiając się na ciągłej komunikacji i prostych historiach tekstowych. Dzięki BDD tester buduje przypadki testowe w języku czytelnym dla człowieka. Z tego powodu łatwo jest umieścić cały zespół na tej samej stronie, ponieważ wszyscy, od właściciela produktu po programistę, mogą zrozumieć i uzyskać ciągłą informację zwrotną na temat bieżącego scenariusza.

Co to jest korniszon?

Językiem używanym przez narzędzie Behat jest Gherkin, który jest językiem czytelnym dla biznesu i specyficznym dla domeny. Korniszon służy również jako żywa dokumentacja i można generować raporty w celu udokumentowania każdego przebiegu testu. Ten prosty język oparty na białych znakach wykorzystuje proste słowa językowe jako słowa kluczowe. Wcięcia (przy użyciu spacji/tabulatorów) i zakończenia linii definiują strukturę przypadku testowego. Chociaż pisanie i rozumienie języka jest łatwe, efekt końcowy powinien koncentrować się na umożliwieniu lepszej współpracy, wydajności, automatyzacji i identyfikowalności. Przypadki testowe powinny być pisane intuicyjnie, skupiać się na ważnych elementach, unikać sprawdzania zduplikowanych zapisów i używać dobrej gramatyki.

Co to jest norka?

Mink to kontroler przeglądarki typu open source, który symuluje scenariusz testowy z aplikacją internetową. Po napisaniu przypadków testowych należy je wykonać i emulować działania użytkownika. Dzięki Mink możesz użyć tego samego scenariusza testowego i uruchomić go na różnych emulatorach przeglądarek, takich jak Goutte, Selenium, Chrome, Zombie i innych. Podczas instalacji rozszerzenia Behat Drupal zobaczysz zależność od Minka, więc upewnij się, że również je masz.

Instalacja i wdrożenie Behat w Drupal

Oficjalnym sposobem instalacji Behata w projekcie Drupal jest Composer. Nie tylko może zainstalować Behat za Ciebie, ale także będzie w stanie łatwo zaktualizować Cię do najnowszej wersji później, gdy taka się pojawi.

• Wewnątrz folderu projektu uruchom polecenie:

 $ kompozytor wymaga behat/behat

• Lub w pliku composer.json dodaj oświadczenie require

 "wymagać": {
                "behat/behat": "^3.0.0",
     „phpunit/phpunit”: „^5.0.0”
     }

• Następnie uruchom w terminalu polecenie instalacji kompozytora.
• Po zakończeniu zauważysz również nowy katalog bin / z plikiem Behat. To jest plik wykonywalny Behat i będziesz go używać do uruchamiania testów i uzyskiwania informacji debugowania.
• Następnie utwórz plik o nazwie behat.yml w głównym folderze projektu. Po uruchomieniu Behat szuka pliku behat.yml , którego używa do swojej konfiguracji.

domyślna:
  apartamenty:
    domyślna:
      konteksty:
        - Drupal\DrupalExtension\Context\DrupalContext
  rozszerzenia:
    Behat\MinkaRozszerzenie:
      dna moczanowa: ~
      base_url: http://example.org/ # Zastąp adresem URL swojej witryny
    Drupal\DrupalExtension:
      czarna skrzynka: ~

Aby zainicjować projekt, uruchom polecenie:

 sprzedawca/bin/behat –init

Spowoduje to utworzenie folderu funkcji / funkcji i domyślnego pliku kontekstowego bootstrap/FeatureContext.php w folderze funkcji / funkcji .

Pisanie historii i przeprowadzanie testów z Behat

Naszym celem jest jak najefektywniejsze opisywanie historii. Historie są napisane w czytelnym dla człowieka języku Korniszon, z rozszerzeniem . funkcja w funkcjach / katalogu.

Załóżmy, że musisz sprawdzić, czy możesz pomyślnie dodać zawartość do typu zawartości strony Podstawowe w swojej witrynie, czy nie. Aby to zrobić, musisz mieć dostęp do strony, wypełnić pola i zapisać ją jako administrator.

Napiszmy więc naszą pierwszą historię:

 Funkcja: Sprawdź stronę podstawową CT
 Aby stworzyć stronę
 Jako administrator
 Chcę uzyskać dostęp do /node/add/page
 Abym mógł stworzyć stronę

Scenariusz: Strona podstawowa CT
 Biorąc pod uwagę, że jestem zalogowany jako użytkownik z rolą „administratora”
 Kiedy przechodzę do "/node/add/page"
 I wpisuję „Podstawowy tytuł strony” dla „edytuj-tytuł-0-wartość”
 Kiedy nacisnę „edytuj-prześlij”
 Następnie powinienem zobaczyć „Strona podstawowa Utworzono podstawowy tytuł strony”

Plik ten może mieć nazwę basic_page.feature . Każda funkcja może mieć wiele scenariuszy, które opisują konkretne zachowanie funkcji. Każdy scenariusz będzie miał sekcje:
Podane – wyszczególnia stan początkowy systemu
Kiedy — zawiera czynność, którą podejmuje użytkownik
Następnie — opisuje, co widzi użytkownik po wykonaniu działania
Oraz - utrzymanie łączności w scenariuszu.
Nie ma dużej różnicy między Wtedy, I i Ale . Te słowa są dostępne, aby Twoje scenariusze były naturalne i czytelne.

Wszystkie pliki funkcji mogą być uruchamiane przez dostawcę/bin/behat . Jeśli chcesz uruchomić określony plik funkcji, uruchom vendor/bin/behat features/basic_page.feature. Istnieje również sposób na uruchomienie pojedynczego scenariusza przez dodanie numeru wiersza, w którym jest zdefiniowany scenariusz: vendor/bin/behat features/basic_page.feature:11 .

Istnieją polecenia, takie jak vendor/bin/behat -dl, które udostępniają całą składnię instrukcji używaną w scenariuszach, a vendor/bin/behat -di udostępnia składnię wraz z przykładami.

Jak pisać pliki funkcji

 Behat uruchamia żądania curl względem adresów URL w Twojej witrynie, co sprawia, że ​​proces testowania jest dość szybki, ale także sprawia, że ​​Behat traci możliwość testowania funkcji wymagających JavaScript. Tak więc, aby przetestować funkcje, wystarczy dodać tag @javascript przed każdym scenariuszem, który wymaga JavaScript, na przykład:

Funkcja: Sprawdź stronę podstawową CT
 Aby stworzyć stronę
 Jako administrator
 Chcę uzyskać dostęp do /node/add/page
 Abym mógł stworzyć stronę

@api @javascript
Scenariusz: Strona podstawowa CT
 Biorąc pod uwagę, że jestem zalogowany jako użytkownik z rolą „administratora”
 Kiedy przechodzę do "/node/add/page"
I wpisuję „Podstawowy tytuł strony” dla „edytuj-tytuł-0-wartość”
I wypełniam wysiwyg w polu "edit-body-0-value" z "Basic page content"
Kiedy nacisnę „edytuj-prześlij”
 Następnie powinienem zobaczyć „Strona podstawowa Utworzono podstawowy tytuł strony”


Aby to przetestować, uruchom vendor/bin/behat . Spowoduje to wyświetlenie niezdefiniowanych kroków w scenariuszach, ponieważ scenariusze muszą być mapowane na funkcję.

behat


Możesz skopiować i wkleić fragment kodu do pliku kontekstowego FeatureContext.php lub uruchomić vendor/bin/behat --dry-run --append-snippets .

Następnie możesz napisać definicje funkcji w FeatureContext.php, jak pokazano:

 <?php

użyj Behat\Mink\Exception\ExpectationException;
użyj Drupal\DrupalExtension\Context\RawDrupalContext;

/**
 * Definiuje funkcje aplikacji na podstawie konkretnego kontekstu.
 */
class FeatureContext rozszerza RawDrupalContext {

  /**
   * Kontekst norek.
   *
   * @var Drupal\DrupalExtension\Context\MinkContext
   */
  chroniony $minkContext;

  /**
   * Inicjuje kontekst.
   *
   * Każdy scenariusz ma własną instancję kontekstu.
   * Możesz również przekazać dowolne argumenty do
   * Konstruktor kontekstu poprzez behat.yml.
   */
  funkcja publiczna __construct() {
  }

  /**
   * Wypełnij wysiwyg na polu.
   *
   * @Następnie wpisuję wysiwyg w polu :locator z :value
   */
  funkcja publiczna iFillInWysiwygOnFieldWith($locator, $wartość) {
    $el = $this->getSession()->getPage()->findField($locator);
    if (pusty($el)) {
      throw new ExpectationException('Nie można znaleźć WYSIWYG z lokalizatorem: ' . $locator, $this->getSession());
    }
    $fieldId = $el->getAttribute('id');
    if (pusty($fieldId)) {
      throw new Exception('Nie można znaleźć identyfikatora pola z lokalizatorem:' .$locator);
    }
    $this->getSession()
      ->executeScript("CKEDITOR.instances[\"$fieldId\"].setData(\"$value\");");
  }

}

Teraz uruchom polecenie vendor/bin/behat i wszystkie napisane scenariusze muszą przejść. Zdefiniowana funkcja JS zmapuje instrukcję scenariusza „ I wypełnię wysiwyg on-field „edit-body-0-value” z „Basic page content ”.