Wprowadzenie do automatycznego testowania wtyczek WordPress za pomocą PHPUnit

Opublikowany: 2022-03-10
Szybkie podsumowanie ↬ Naprawdę nie chcesz spędzać godzin na ręcznym testowaniu każdej części wtyczki WordPress, aby upewnić się, że nic nie jest zepsute za każdym razem, gdy wdrażasz nową wersję — prawda? W tym samouczku dowiesz się, jak skutecznie testować za pomocą testów automatycznych.

WordPress to popularny system zarządzania treścią do tworzenia stron internetowych, ponieważ łatwo jest zacząć od niego, a także dostępnych jest mnóstwo motywów i wtyczek, które rozszerzają jego zestaw funkcji. Głównym powodem, dla którego WordPress ma wiele wtyczek i motywów, jest to, że programiści na każdym poziomie mogą łatwo rozpocząć ich tworzenie. Większość jego programistów nie ma doświadczenia i nie piszą testów swojej pracy, być może z następujących powodów:

  • Nie ma wielu dyskusji na temat testów jednostkowych, więc mogą nie wiedzieć, że testowanie jest w ogóle możliwe.
  • Nie wierzą w wartość pisania testów dla ich kodu lub uważają, że to ich spowolni.
  • Uważają, że wystarczy przetestować, czy ich wtyczka lub motyw działa w przeglądarce.

W tym samouczku dowiemy się, czym jest testowanie automatyczne i jakie jest jego znaczenie, poznamy PHPUnit i WP-CLI, nauczymy się pisać test, a na koniec ustawimy ciągłe testy automatyczne z Travis CI.

Wybieramy Travis CI, ponieważ oferuje bezproblemową integrację z GitHub; nie musisz wchodzić do swojego repozytorium i konfigurować żadnego połączenia między nimi. I jest bezpłatny dla repozytoriów publicznych. W przeciwieństwie do swoich konkurentów, takich jak Semaphore CI, GitLab CI i CircleCI, Travis CI nie oferuje bezpłatnego planu prywatnego repozytorium. Jednak żaden z jego konkurentów nie oferuje bezproblemowej integracji z GitHub, jak to robi.

Co to jest testowanie automatyczne?

Według Wikipedii testowanie automatyczne lub automatyzacja testów polega na użyciu specjalnego oprogramowania (oddzielnego od testowanego oprogramowania) do kontroli wykonywania testów i porównywania rzeczywistych wyników z wynikami przewidywanymi. Automatyzacja testów może zautomatyzować niektóre powtarzalne, ale niezbędne zadania w sformalizowanym procesie testowania, który już istnieje, lub wykonać dodatkowe testy, które byłyby trudne do wykonania ręcznie.

Więcej po skoku! Kontynuuj czytanie poniżej ↓

Istnieje kilka rodzajów testów. Ze wszystkich testów jednostkowych jest najbardziej popularne. Testy jednostkowe sprawdzają, czy blok kodu, funkcja lub metoda klasy robi to, do czego jest przeznaczony. W tym samouczku będziemy przeprowadzać testy jednostkowe.

Zautomatyzowane testowanie pomaga wykrywać błędy, dzięki czemu nie trafiają one do produkcji. Bez wątpienia zakodowana i przetestowana wtyczka zajęłaby więcej czasu niż ta, która nie jest testowana. Jednak wynikowa wtyczka zawierałaby mniej błędów lub nie zawierałaby ich wcale.

Zobaczmy prosty przykład ze świata rzeczywistego, w jaki sposób testy jednostkowe są nieocenione i do czego możemy je wykorzystać.

Moja wtyczka WordPress do generowania leadów ma klasę OptinThemesRepository , z metodą add() do dodawania nowych szablonów formularzy zgody oraz metodę get() do pobierania szablonu formularza zgody.

Aby upewnić się, że zarówno add() , jak i get() działają zgodnie z przeznaczeniem teraz iw przyszłości, napisałem poniższy test.

 public function testAddGetMethods() { $kick_optin_form = array( 'name' => 'Kick', 'optin_class' => 'kick', 'optin_type' => 'kick', 'screenshot' => MAILOPTIN_ASSETS_URL . 'img/kick.png' ); // add kick optin theme OptinThemesRepository::add($kick_optin_form); $result = OptinThemesRepository::get('kick'); $this->assertEquals($kick_optin_form, $result); }

Gdyby w przyszłości ten test zaczął zawodzić, wiedziałbym, że jest problem i znałbym dokładną funkcję, metodę klasy lub miejsce we wtyczce, w którym występuje.

Korzyści z automatycznego testowania

Teraz, gdy wiemy, czym jest testowanie automatyczne, zobaczmy więcej korzyści.

Wczesne wykrywanie błędów

Podczas tworzenia oprogramowania możesz łatwo znaleźć błędy za pomocą zautomatyzowanych narzędzi testowych. Może to zaoszczędzić dużo czasu i wysiłku w śledzeniu błędów.

Wyższa jakość oprogramowania

Tester z wieloletnim doświadczeniem może popełniać błędy, gdy musi w kółko przygotowywać te same nudne ręczne skrypty testowe. Zautomatyzowane testowanie nie tylko zapewnia dokładne wyniki, ale także oszczędza czas.

Łatwe i solidne raportowanie

Zautomatyzowane narzędzia testowe mogą śledzić każdy skrypt testowy. Wykonanie każdego skryptu testowego można zobaczyć w dziennikach wizualnych. Dziennik wizualny lub raport zazwyczaj wyświetla liczbę wykonanych skryptów testowych i ich status (na przykład pomyślnie zakończone, niepowodzenie lub pominięcie), zgłoszone błędy oraz wskazówki dotyczące ich naprawienia.

Zanim przejdziemy do konfiguracji i pisania testów, stwórzmy prostą wtyczkę do wykorzystania jako studium przypadku.

Tworzenie wtyczki WordPress

Zamierzamy zbudować prostą wtyczkę wyświetlającą metatagi weryfikacji webmasterów Google i Bing w nagłówku interfejsu WordPressa. Wtyczka jest hostowana na moim koncie GitHub.

Poniższy kod wtyczki zostanie umieszczony w pliku wp-meta-verify.php .

 <?php class WP_Meta_Verify { public function __construct() { add_action('wp_head', \[$this, 'header_code']); } public function header_code() { $google_code = get_option('wpmv_google_code'); $bing_code = get_option('wpmv_google_code'); echo $this->google_site_verification($google_code); echo $this->bing_site_verification($bing_code); } public function google_site_verification($code) { return "<meta name=\"google-site-verification\" content=\"$code\">"; } public function bing_site_verification($code) { return "<meta name=\"msvalidate.01\" content=\"$code\">"; } } new WP_Meta_Verify();

Możesz zauważyć, że we wtyczce nie umieściliśmy strony ustawień, na której zazwyczaj zapisujesz kod weryfikacyjny Google i Bing. Zrobiłem to celowo, aby zachować prostotę i skupić naszą uwagę na tym, co najważniejsze. Jednak get_option('wpmv_google_code') i get_option('wpmv_bing_code') zakładają, że istnieje strona ustawień i pobierają z niej kody weryfikacyjne.

Testowanie jednostkowe wtyczki WordPress

PHPUnit to de facto narzędzie do testowania PHP, podczas gdy WP-CLI to oficjalny interfejs wiersza poleceń dla WordPressa.

Przed WP-CLI konfigurowanie testów PHPUnit dla wtyczek WordPress było uciążliwe. WP-CLI ma świetny przewodnik po jego konfiguracji; jednak nadal będziemy omawiać kroki tutaj.

Zainstaluj PHPUnit

Aby zainstalować PHPUnit, uruchom następujące polecenia.

 composer global require phpunit/phpunit:5.*

Uwaga: jawnie instalujemy 5.x , ponieważ to właśnie obsługuje WordPress, gdy używasz PHP 7 lub nowszego, który mam na swoim komputerze. Zainstaluj PHPUnit 4.8, jeśli używasz PHP w wersji 5.

Uruchom phpunit --version , aby potwierdzić, że został zainstalowany.

Zainstaluj WP-CLI

Aby zainstalować WP-CLI, uruchom następujące polecenia.

 curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar chmod +x wp-cli.phar sudo mv wp-cli.phar /usr/local/bin/wp

Uruchom wp --info , aby potwierdzić jego instalację.

Po zainstalowaniu PHPUnit i WP-CLI użyjemy tego ostatniego do skonfigurowania testu jednostkowego wtyczki.

Skonfiguruj test jednostki wtyczki

Zmień katalog terminala na katalog główny instalacji WordPress i uruchom poniższe polecenie, aby wygenerować pliki testowe wtyczki.

 wp scaffold plugin-tests wp-meta-verify

Poniżej znajduje się struktura wtyczki po wygenerowaniu plików testowych przez powyższe polecenie.

 |-bin/ |----install-wp-tests.sh |-tests/ |----bootstrap.php |----test-sample.php |-.travis.yml |-phpcs.xml.dist |-phpunit.xml.dist |-wp-meta-verify.php

Uwaga: Domyślnie polecenie wp scaffold plugin-tests generuje plik konfiguracyjny Travis CI. Możesz określić flagę --ci , aby wygenerować plik konfiguracyjny dla używanej usługi CI, na przykład: wp scaffold plugin-tests --c gitlab . W chwili pisania tego tekstu obsługiwane są tylko Travis CI, CircleCI i GitLab CI.

Zmień katalog terminala na katalog wtyczki i uruchom skrypt instalacyjny:

 cd path-to-wordpress-plugin
 bin/install-wp-tests.sh wordpress_test root '' localhost latest

Jeśli jesteś podobny do mnie, twoja nazwa użytkownika MySQL nie jest root , a hasło nie jest puste. Załóżmy na przykład, że nazwa użytkownika to homestead , a hasło jest secret . Skrypt instalacyjny uruchomiłbyś w ten sposób:

 bin/install-wp-tests.sh wordpress_test homestead 'secret' localhost latest

Uruchom polecenie phpunit , aby uruchomić domyślny test w tests/test-sample.php .

Wynik testu PHPUnit
Wynik testu PHPUnit (duży podgląd)

Napisz nasze testy wtyczek

Utwórz plik test-wp-meta-verify.php w folderze tests . Będzie zawierał nasze testy wtyczek z następującą setUp .

 <?php class WP_Meta_VerifyTest extends WP_UnitTestCase { public function setUp() { parent::setUp(); $this->class_instance = new WP_Meta_Verify(); } public function test_google_site_verification() { } public function test_bing_site_verification() { } }

Warto zauważyć, że aby metoda została uznana za test jednostkowy, musi być poprzedzona przedrostkiem test . Najlepszą praktyką jest dodanie sufiksu Test do każdej klasy testowej, chociaż nie jest to wymagane. Zobacz WP_Meta_VerifyTest .

Nie wiesz, co setUp() ? Po prostu wiedz, że PHPUnit uruchamia go raz przed każdą metodą testową (i na nowych instancjach) klasy przypadków testowych. Istnieje również tearDown() , ale jest uruchamiana po każdej metodzie testowej. Istnieją również setUpBeforeClass() i tearDownAfterClass() , które są uruchamiane odpowiednio przed i po każdym przypadku testowym. Przypadek testowy to w zasadzie klasa, która zawiera szereg metod testowych. Więcej informacji znajdziesz w podręczniku WordPress i dokumentacji PHPUnit.

Z powyższej klasy jest całkiem oczywiste, że będziemy pisać testy dla metod google_site_verification i bing_site_verification naszej klasy wtyczek.

 public function test_google_site_verification() { $meta_tag = $this->class_instance->google_site_verification('B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g'); $expected = '<meta name="google-site-verification" content="B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g">'; $this->assertEquals($expected, $meta_tag); }
 public function test_bing_site_verification() { $meta_tag = $this->class_instance->bing_site_verification('B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g'); $expected = '<meta name="msvalidate.01" content="B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g">'; $this->assertEquals($expected, $meta_tag); }

Zasadniczo testy zapewnią, że obie metody zwrócą poprawny metatag, gdy kody weryfikacyjne Google i Bing dla webmasterów zostaną im przekazane jako argumenty.

Uruchom phpunit , a powinieneś zobaczyć dane wyjściowe podobne do zrzutu ekranu poniżej.

Wyjście PHPUnit
Wyjście PHPUnit (duży podgląd)

Ciągłe zautomatyzowane testowanie z Travis CI

Travis CI to hostowana, rozproszona usługa ciągłej integracji używana do tworzenia i testowania projektów oprogramowania hostowanych na GitHub.

Aby korzystać z Travis CI, musimy opublikować naszą wtyczkę na GitHub. Śmiało i zrób to teraz. Zapraszam do zapoznania się z moim.

Dzięki WP-CLI mamy to już skonfigurowane w naszej wtyczce, dzięki uprzejmości pliku .travis.yml .

Chciałbym wspomnieć, że nie stosuję się do standardów kodowania WordPress, ale raczej do zaleceń standardów PHP, a moje wtyczki wymagają co najmniej PHP 5.4. Aby moje kompilacje nie zawiodły, musiałem zastąpić ich macierz następującą w pliku .travis.yml .

 matrix: include: - php: 7.1 env: WP_VERSION=latest - php: 7.0 env: WP_VERSION=latest - php: 5.6 env: WP_VERSION=latest - php: 5.6 env: WP_VERSION=trunk - php: 5.5 env: WP_VERSION=latest - php: 5.4 env: WP_VERSION=latest

Udaj się do Travis CI i zaloguj się na swoje konto GitHub. Postępuj zgodnie z instrukcjami wyświetlanymi na ekranie, aby dodać repozytorium GitHub.

Po synchronizacji konta z GitHub przewiń do repozytorium wtyczki i aktywuj.

Konfigurowanie repozytorium Travis CI
Konfigurowanie repozytorium Travis CI (duży podgląd)

Następnym razem, gdy dokonasz zmiany kodu i wypchniesz ją do GitHub, kompilacja zostanie uruchomiona w Travis CI.

Wynik kompilacji Travis CI (duży podgląd)

Udostępniłem pomyślny wynik kompilacji dla przyjemności oglądania.

Zawijanie

Nie jest tajemnicą, że wielu programistów, nie tylko WordPressowych, nie pisze testów dla swoich projektów, ponieważ o nich nie wie. Nawet niektórzy doświadczeni i zaawansowani spośród nas najwyraźniej tego nie robią, ponieważ uważają to za stratę czasu.

To prawda, że ​​konfigurowanie testów automatycznych może być nudne i czasochłonne. Niemniej jednak jest to inwestycja, która zapewni, że do Twojego oprogramowania wkradnie się niewiele błędów lub nie będzie ich wcale, dzięki czemu zaoszczędzisz czas i zasoby (w tym finansowe), które błędy w Twoim oprogramowaniu mogłyby Cię kosztować.

Zawsze pisz test przed zaimplementowaniem funkcji, abyś nie zapomniał lub nie czuł się leniwy, aby zrobić to po zaimplementowaniu funkcji.

Mam nadzieję, że teraz zdajesz sobie sprawę, jak ważne jest pisanie testów i jak zacząć pisać je dla własnej wtyczki WordPress.

Jeśli masz jakieś pytania lub uwagi, daj mi znać w sekcji komentarzy.