SlideShare a Scribd company logo
1 of 34
Download to read offline
PHPUnit - jak zacząć pisać
testy automatyczne
Paweł Górski
kariera.droptica.pl
Poznaj nas:
● O firmie
● Ścieżka kariery
● Szkolenia i rozwój
● Benefity
● Praca zdalna
● Biura
● Projekty i klienci
● Po pracy
● Hardware i software
● Typowy dzień pracy
https://kariera.droptica.pl Social Media: #devtalks
Oferty pracy:
● Junior PHP Developer
○ 5 000 - 8 500 zł netto (B2B)
● PHP Fullstack Dev (Mid/Senior/TechLead)
○ MID: 9 500 - 12 800 zł netto (B2B)
○ SENIOR: 12 300 - 18 500 netto (B2B)
● Drupal Developer (Mid/Senior/TechLead)
○ MID: 10 500 - 13 500 zł netto (B2B)
○ SENIOR: 13 000 - 19 500 netto (B2B)
●Project Manager
○11 000 - 14 000 netto (B2B)
●Senior Product Designer
○11 500 - 18 000 netto (B2B)
Agenda
1. Co to jest PHPUnit
2. Instalacja, konfiguracja
3. Pisanie pierwszych testów
4. Odpalanie testów
5. Pytania
PHPUnit
PHPUnit – framework do testów jednostkowych dla języka programowania PHP. Jest członkiem rodziny frameworków xUnit
wywodzącej się z pakietu SUnit stworzonego przez Kenta Becka[2]. PHPUnit jest rozwijany przez Sebastiana Bergmanna.
PHPUnit oferuje programiście następujące możliwości:
1. Narzędzia do tworzenia testów jednostkowych i organizowania ich w hierarchiczne zestawy.
2. Interfejs linii komend do wykonywania testów
3. Dostawcy danych (ang. data providers) – generatory zestawów danych dla testów pozwalające sprawdzić, jak pojedynczy test
zachowuje się dla różnych danych wejściowych.
4. Wsparcie dla testowania kodu korzystającego z baz danych.
5. Możliwość testowania wyjątków.
6. Wsparcie dla makiet obiektów (ang. mock objects)
7. Generator raportów
8. Generator raportów pokrycia kodu (wymaga XDebug)
9. Współpraca z narzędziem Selenium do testowania interfejsów użytkownika
https://www.phpunit.de/
http://sebastian-bergmann.de/
PHPUnit
https://www.guru99.com/unit-testing-guide.html
https://softwareskill.pl/piramida-testow
https://blog.termian.dev/pl/posty/kategoryzacja-test%C3%B3w-zestawy-zr%C3%B3wnoleglanie/
Co dają nam testy jednostkowe?
1. Redukcja małych i powtarzanych błędów.
2. Potwierdzają że kod działa tak jak myślisz, że działa.
3. Są szybkie i działają w sposób automatyczny.
4. Sprawdzają mały fragmentu kodu (jednostkę), czyli klasę, metodę lub nawet zestaw klas z pakietu,
tworzących jedną, ale wciąż niewielką funkcjonalność.
5. Weryfikują działanie kodu pod względem logicznym, sprawdzają wiele warunków brzegowych.
6. Można testować bez uruchamiania całego systemu.
7. Mogą zredukować prawdopodobieństwo błędów regresji.
https://softwareskill.pl/piramida-testow
Czy Unit test chronią w 100%
przed bugami?
Czego nam nie dają nam testy
jednostkowe?
1. Nie dają pewności, że po implementacji klas ze sobą, cała funkcjonalność działa poprawnie.
2. Nie gwarantują wyeliminowania bugów.
https://devstyle.pl/2020/06/25/mega-pigula-wiedzy-o-testach-jednostkowych/
Instalacja
Composer
composer require --dev phpunit/phpunit ^9
Środowisko
{
"name": "root/www",
"require": {
"phpunit/phpunit": "^9.5"
},
"autoload": {
"psr-4": {
"App":"src"
}
},
"authors": [
{
"name": "Pawel Gorski",
"email": "gp@gorskipawel.pl"
}
]
}
phpunit.xml
Testowanie
➜ ./vendor/bin/phpunit tests
Lub konfigurujemy Php Storma.
Komenda wyszukuje wszystkie testy z *Test.php w katalogu
Storm
Co potrzebujemy?
PHPSTORM
PHP 7+
XDEBUG
Projekt z composer + phpUnit
Storm
Storm
Storm
Pierwszy test
Pierwszy test
Klasa testowana:
ShowMessage
<?php
declare(strict_types=1);
namespace App;
class ShowMessage
{
private string $message;
public function printMessage() {
echo $this->getMessage();
}
public function getMessage(): string
{
return $this->message;
}
/**
* @param string $message
*/
public function setMessage(string $message): void
{
$this->message = $message;
}
}
Test
<?php
declare(strict_types=1);
namespace AppShowMessage;
use PHPUnitFrameworkTestCase;
class ShowMessageTest extends TestCase
{
public function testPrintMessage()
{
}
}
Testujemy
lub ./vendor/bin/phpunit tests
Testujemy
Testujemy
OK zepsujemy coś
OK zepsujemy coś
● assertAttributeSame
● assertAttributeType
● assertClassHasAttribute
● assertClassHasStaticAttribute
● assertClassNotHasAttribute
● assertClassNotHasStaticAttribute
● assertContains
● assertContainsOnly
● assertEmpty
● assertEquals
● assertEqualXMLStructure
● assertFalse
● assertFileEquals
● assertFileExists
● assertFileNotEquals
● assertFileNotExists
● assertGreaterThan
● assertGreaterThanOrEqual
● assertInstanceOf
● assertInternalType
● assertLessThan
● assertLessThanOrEqual
● assertNotContains
● assertNotContainsOnly
● arrayHasKey
● assertArrayHasKey
● assertArrayNotHasKey
● assertAttributeContains
● assertAttributeContainsOnly
● assertAttributeEmpty
● assertAttributeEquals
● assertAttributeGreaterThan
● assertAttributeGreaterThanOrEqua
l
● assertAttributeInstanceOf
● assertAttributeInternalType
● assertAttributeLessThan
● assertAttributeLessThanOrEqual
● assertAttributeNotContains
● assertAttributeNotContainsOnly
● assertAttributeNotEmpty
● assertAttributeNotEquals
● assertAttributeNotInstanceOf
● assertAttributeNotInternalType
● assertAttributeNotSame
● assertAttributeNotType
● assertNotEmpty
● assertNotEquals
● assertNotInstanceOf
● assertNotInternalType
● assertNotNull
● assertNotRegExp
● assertNotSame
● assertNotTag
● assertNotType
● assertNull
● assertObjectHasAttribute
● assertObjectNotHasAttribute
● assertRegExp
● assertSame
● assertSelectCount
● assertSelectEquals
● assertSelectRegExp
● assertStringEndsNotWith
● assertStringEndsWith
● assertStringEqualsFile
● assertStringMatchesFormat
● assertStringMatchesFormatFile
● assertStringNotEqualsFile
Co można sprawdzać
Data providers
Data providers to przydatna funkcja PHPUnit, która pozwala uruchomić ten sam test z różnymi
danymi wejściowymi i oczekiwanymi wynikami.
Mogą być użyty jedną lub więcej. Dodajemy przez adnotacje @dataProvider .
Metody dostawcy danych muszą być publiczne i muszą albo zwracać tablicę tablic, albo obiekt,
który powinien implementować interfejs Iterator.
Data providers
OK zepsujemy coś
extends TestCase
Pokrycie %
Drupal - Kernel tests
Większość testów w Drupalu bazuje na PHPUnit . W Drupalu mamy 4 rodzaje testów PHPUnit:
● Unit: testy oparte na PHPUnit z minimalnymi zależnościami. Klasa bazowa: Klasa
DrupalTestsUnitTestCase.
● Kernel: testy oparte na PHPUnit z kernelem i z włączoną minimalną liczbą rozszerzeń. Klasa bazowa:
Klasa DrupalKernelTestsKernelTestBase.
● Functional: testy oparte na PHPUnit z w pełni uruchomioną instancją Drupala. Klasa bazowa:
DrupalTestsBrowserTestBase.
● FunctionalJavascript: Testy oparte na PHPUnit, które wykorzystują Webdriver do przeprowadzania
testów funkcjonalności JavaScript i Ajax w przeglądarce. Klasa bazowa:
DrupalFunctionalJavascriptTestsWebDriverTestBase.
Visual Ception
To by było na tyle
Pytania?
Dziękuję za
wasz cenny czas!
Imię i Nazwisko autora
Paweł Górski
pawel.gorski@droptica.com
gp@gorskipawel.pl
Dane Kontaktowe
WWW.DROPTICA.COM

More Related Content

What's hot

What's hot (20)

New Ways to Find Latency in Linux Using Tracing
New Ways to Find Latency in Linux Using TracingNew Ways to Find Latency in Linux Using Tracing
New Ways to Find Latency in Linux Using Tracing
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Signature verification of kernel module and kexec
Signature verification of kernel module and kexecSignature verification of kernel module and kexec
Signature verification of kernel module and kexec
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix it
 
Directory Management in Unix
 Directory Management in Unix Directory Management in Unix
Directory Management in Unix
 
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
 
LLVM
LLVMLLVM
LLVM
 
odoo json rpc.docx
odoo json rpc.docxodoo json rpc.docx
odoo json rpc.docx
 
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS FilterX-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter
 
Connection Pooling in PostgreSQL using pgbouncer
Connection Pooling in PostgreSQL using pgbouncer Connection Pooling in PostgreSQL using pgbouncer
Connection Pooling in PostgreSQL using pgbouncer
 
Memory Mapping Implementation (mmap) in Linux Kernel
Memory Mapping Implementation (mmap) in Linux KernelMemory Mapping Implementation (mmap) in Linux Kernel
Memory Mapping Implementation (mmap) in Linux Kernel
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption Toolkit
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption ToolkitBlack Hat Europe 2017. DPAPI and DPAPI-NG: Decryption Toolkit
Black Hat Europe 2017. DPAPI and DPAPI-NG: Decryption Toolkit
 
Vulkan 1.1 Reference Guide
Vulkan 1.1 Reference GuideVulkan 1.1 Reference Guide
Vulkan 1.1 Reference Guide
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023
 
GCC LTO
GCC LTOGCC LTO
GCC LTO
 

Similar to PHPUnit - jak zacząć pisać testy automatyczne [PL]

[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować
Jakub Marchwicki
 
Maciej Ostrowski: Podstawy implementacji multi-inwentarza w Magento
Maciej Ostrowski: Podstawy implementacji multi-inwentarza w MagentoMaciej Ostrowski: Podstawy implementacji multi-inwentarza w Magento
Maciej Ostrowski: Podstawy implementacji multi-inwentarza w Magento
Meet Magento Poland
 

Similar to PHPUnit - jak zacząć pisać testy automatyczne [PL] (20)

Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzdura
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
 
Testy jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitTesty jednostkowe - PHPUnit
Testy jednostkowe - PHPUnit
 
Strategie automatyzacji testow
Strategie automatyzacji testowStrategie automatyzacji testow
Strategie automatyzacji testow
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Girls in IT - QA
Girls in IT - QA Girls in IT - QA
Girls in IT - QA
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
 
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
 
university day 1
university day 1university day 1
university day 1
 
SkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel DecSkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel Dec
 
Domain Driven Development
Domain Driven DevelopmentDomain Driven Development
Domain Driven Development
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
 
[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować
 
Zwinność w praktyce, Jarek Potiuk
Zwinność w praktyce, Jarek PotiukZwinność w praktyce, Jarek Potiuk
Zwinność w praktyce, Jarek Potiuk
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)
 
CI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieCI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecie
 
Wzorce projektowe w praktyce
Wzorce projektowe w praktyceWzorce projektowe w praktyce
Wzorce projektowe w praktyce
 
Maciej Ostrowski: Podstawy implementacji multi-inwentarza w Magento
Maciej Ostrowski: Podstawy implementacji multi-inwentarza w MagentoMaciej Ostrowski: Podstawy implementacji multi-inwentarza w Magento
Maciej Ostrowski: Podstawy implementacji multi-inwentarza w Magento
 

More from Droptica

More from Droptica (20)

Business development w praktyce - jak skutecznie sprzedawać software [PL]
Business development w praktyce - jak skutecznie sprzedawać software [PL]Business development w praktyce - jak skutecznie sprzedawać software [PL]
Business development w praktyce - jak skutecznie sprzedawać software [PL]
 
Komunikacja w zespole projektowym [PL]
Komunikacja w zespole projektowym [PL]Komunikacja w zespole projektowym [PL]
Komunikacja w zespole projektowym [PL]
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]
 
Drupal jako modularny i rozszerzalny CMS [PL]
Drupal jako modularny i rozszerzalny CMS [PL]Drupal jako modularny i rozszerzalny CMS [PL]
Drupal jako modularny i rozszerzalny CMS [PL]
 
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
 
Strona w rękach klienta: o czym pamiętać, aby ułatwić pracę edytorom treści [PL]
Strona w rękach klienta: o czym pamiętać, aby ułatwić pracę edytorom treści [PL]Strona w rękach klienta: o czym pamiętać, aby ułatwić pracę edytorom treści [PL]
Strona w rękach klienta: o czym pamiętać, aby ułatwić pracę edytorom treści [PL]
 
Headless CMS w PZPN na bazie Drupala [PL]
Headless CMS w PZPN na bazie Drupala [PL]Headless CMS w PZPN na bazie Drupala [PL]
Headless CMS w PZPN na bazie Drupala [PL]
 
Drupal Commerce - konfiguracja prostego sklepu internetowego [PL]
Drupal Commerce - konfiguracja prostego sklepu internetowego [PL]Drupal Commerce - konfiguracja prostego sklepu internetowego [PL]
Drupal Commerce - konfiguracja prostego sklepu internetowego [PL]
 
Devel - przegląd możliwości modułu [PL]
Devel - przegląd możliwości modułu [PL]Devel - przegląd możliwości modułu [PL]
Devel - przegląd możliwości modułu [PL]
 
Docker na MacOS przy wsparciu maszyny wirtualnej z Linuksem [PL]
Docker na MacOS przy wsparciu maszyny wirtualnej z Linuksem [PL]Docker na MacOS przy wsparciu maszyny wirtualnej z Linuksem [PL]
Docker na MacOS przy wsparciu maszyny wirtualnej z Linuksem [PL]
 
Od środowiska developerskiego do produkcji [PL]
Od środowiska developerskiego do produkcji [PL]Od środowiska developerskiego do produkcji [PL]
Od środowiska developerskiego do produkcji [PL]
 
Nowości w drupal 9 i 10 [PL]
Nowości w drupal 9 i 10 [PL]Nowości w drupal 9 i 10 [PL]
Nowości w drupal 9 i 10 [PL]
 
Skuteczna komunikacja w projekcie informatycznym [PL]
Skuteczna komunikacja w projekcie informatycznym [PL]Skuteczna komunikacja w projekcie informatycznym [PL]
Skuteczna komunikacja w projekcie informatycznym [PL]
 
Droopler: instalacja z użyciem composer i przykład budowy prostej strony firm...
Droopler: instalacja z użyciem composer i przykład budowy prostej strony firm...Droopler: instalacja z użyciem composer i przykład budowy prostej strony firm...
Droopler: instalacja z użyciem composer i przykład budowy prostej strony firm...
 
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
 
Open social - przegląd możliwości dystrybucji [PL]
Open social - przegląd możliwości dystrybucji [PL]Open social - przegląd możliwości dystrybucji [PL]
Open social - przegląd możliwości dystrybucji [PL]
 
Mapy i geolokalizacja w Drupalu [PL]
Mapy i geolokalizacja w Drupalu [PL]Mapy i geolokalizacja w Drupalu [PL]
Mapy i geolokalizacja w Drupalu [PL]
 
Drush - najbardziej przydatne komendy oraz tworzenie własnej prostej komendy ...
Drush - najbardziej przydatne komendy oraz tworzenie własnej prostej komendy ...Drush - najbardziej przydatne komendy oraz tworzenie własnej prostej komendy ...
Drush - najbardziej przydatne komendy oraz tworzenie własnej prostej komendy ...
 
Search API i Faceted Search - podstawowa konfiguracja i przykłady użycia [PL]
Search API i Faceted Search - podstawowa konfiguracja i przykłady użycia [PL]Search API i Faceted Search - podstawowa konfiguracja i przykłady użycia [PL]
Search API i Faceted Search - podstawowa konfiguracja i przykłady użycia [PL]
 
Drupal multisite i domain access - kiedy, jak i dlaczego [PL]
Drupal multisite i domain access - kiedy, jak i dlaczego [PL]Drupal multisite i domain access - kiedy, jak i dlaczego [PL]
Drupal multisite i domain access - kiedy, jak i dlaczego [PL]
 

PHPUnit - jak zacząć pisać testy automatyczne [PL]

  • 1. PHPUnit - jak zacząć pisać testy automatyczne Paweł Górski
  • 2. kariera.droptica.pl Poznaj nas: ● O firmie ● Ścieżka kariery ● Szkolenia i rozwój ● Benefity ● Praca zdalna ● Biura ● Projekty i klienci ● Po pracy ● Hardware i software ● Typowy dzień pracy https://kariera.droptica.pl Social Media: #devtalks Oferty pracy: ● Junior PHP Developer ○ 5 000 - 8 500 zł netto (B2B) ● PHP Fullstack Dev (Mid/Senior/TechLead) ○ MID: 9 500 - 12 800 zł netto (B2B) ○ SENIOR: 12 300 - 18 500 netto (B2B) ● Drupal Developer (Mid/Senior/TechLead) ○ MID: 10 500 - 13 500 zł netto (B2B) ○ SENIOR: 13 000 - 19 500 netto (B2B) ●Project Manager ○11 000 - 14 000 netto (B2B) ●Senior Product Designer ○11 500 - 18 000 netto (B2B)
  • 3. Agenda 1. Co to jest PHPUnit 2. Instalacja, konfiguracja 3. Pisanie pierwszych testów 4. Odpalanie testów 5. Pytania
  • 4. PHPUnit PHPUnit – framework do testów jednostkowych dla języka programowania PHP. Jest członkiem rodziny frameworków xUnit wywodzącej się z pakietu SUnit stworzonego przez Kenta Becka[2]. PHPUnit jest rozwijany przez Sebastiana Bergmanna. PHPUnit oferuje programiście następujące możliwości: 1. Narzędzia do tworzenia testów jednostkowych i organizowania ich w hierarchiczne zestawy. 2. Interfejs linii komend do wykonywania testów 3. Dostawcy danych (ang. data providers) – generatory zestawów danych dla testów pozwalające sprawdzić, jak pojedynczy test zachowuje się dla różnych danych wejściowych. 4. Wsparcie dla testowania kodu korzystającego z baz danych. 5. Możliwość testowania wyjątków. 6. Wsparcie dla makiet obiektów (ang. mock objects) 7. Generator raportów 8. Generator raportów pokrycia kodu (wymaga XDebug) 9. Współpraca z narzędziem Selenium do testowania interfejsów użytkownika https://www.phpunit.de/ http://sebastian-bergmann.de/
  • 6. Co dają nam testy jednostkowe? 1. Redukcja małych i powtarzanych błędów. 2. Potwierdzają że kod działa tak jak myślisz, że działa. 3. Są szybkie i działają w sposób automatyczny. 4. Sprawdzają mały fragmentu kodu (jednostkę), czyli klasę, metodę lub nawet zestaw klas z pakietu, tworzących jedną, ale wciąż niewielką funkcjonalność. 5. Weryfikują działanie kodu pod względem logicznym, sprawdzają wiele warunków brzegowych. 6. Można testować bez uruchamiania całego systemu. 7. Mogą zredukować prawdopodobieństwo błędów regresji. https://softwareskill.pl/piramida-testow
  • 7. Czy Unit test chronią w 100% przed bugami?
  • 8. Czego nam nie dają nam testy jednostkowe? 1. Nie dają pewności, że po implementacji klas ze sobą, cała funkcjonalność działa poprawnie. 2. Nie gwarantują wyeliminowania bugów. https://devstyle.pl/2020/06/25/mega-pigula-wiedzy-o-testach-jednostkowych/
  • 10. Composer composer require --dev phpunit/phpunit ^9
  • 11. Środowisko { "name": "root/www", "require": { "phpunit/phpunit": "^9.5" }, "autoload": { "psr-4": { "App":"src" } }, "authors": [ { "name": "Pawel Gorski", "email": "gp@gorskipawel.pl" } ] }
  • 13. Testowanie ➜ ./vendor/bin/phpunit tests Lub konfigurujemy Php Storma. Komenda wyszukuje wszystkie testy z *Test.php w katalogu
  • 15. Storm
  • 16. Storm
  • 17. Storm
  • 19. Pierwszy test Klasa testowana: ShowMessage <?php declare(strict_types=1); namespace App; class ShowMessage { private string $message; public function printMessage() { echo $this->getMessage(); } public function getMessage(): string { return $this->message; } /** * @param string $message */ public function setMessage(string $message): void { $this->message = $message; } } Test <?php declare(strict_types=1); namespace AppShowMessage; use PHPUnitFrameworkTestCase; class ShowMessageTest extends TestCase { public function testPrintMessage() { } }
  • 25. ● assertAttributeSame ● assertAttributeType ● assertClassHasAttribute ● assertClassHasStaticAttribute ● assertClassNotHasAttribute ● assertClassNotHasStaticAttribute ● assertContains ● assertContainsOnly ● assertEmpty ● assertEquals ● assertEqualXMLStructure ● assertFalse ● assertFileEquals ● assertFileExists ● assertFileNotEquals ● assertFileNotExists ● assertGreaterThan ● assertGreaterThanOrEqual ● assertInstanceOf ● assertInternalType ● assertLessThan ● assertLessThanOrEqual ● assertNotContains ● assertNotContainsOnly ● arrayHasKey ● assertArrayHasKey ● assertArrayNotHasKey ● assertAttributeContains ● assertAttributeContainsOnly ● assertAttributeEmpty ● assertAttributeEquals ● assertAttributeGreaterThan ● assertAttributeGreaterThanOrEqua l ● assertAttributeInstanceOf ● assertAttributeInternalType ● assertAttributeLessThan ● assertAttributeLessThanOrEqual ● assertAttributeNotContains ● assertAttributeNotContainsOnly ● assertAttributeNotEmpty ● assertAttributeNotEquals ● assertAttributeNotInstanceOf ● assertAttributeNotInternalType ● assertAttributeNotSame ● assertAttributeNotType ● assertNotEmpty ● assertNotEquals ● assertNotInstanceOf ● assertNotInternalType ● assertNotNull ● assertNotRegExp ● assertNotSame ● assertNotTag ● assertNotType ● assertNull ● assertObjectHasAttribute ● assertObjectNotHasAttribute ● assertRegExp ● assertSame ● assertSelectCount ● assertSelectEquals ● assertSelectRegExp ● assertStringEndsNotWith ● assertStringEndsWith ● assertStringEqualsFile ● assertStringMatchesFormat ● assertStringMatchesFormatFile ● assertStringNotEqualsFile Co można sprawdzać
  • 26. Data providers Data providers to przydatna funkcja PHPUnit, która pozwala uruchomić ten sam test z różnymi danymi wejściowymi i oczekiwanymi wynikami. Mogą być użyty jedną lub więcej. Dodajemy przez adnotacje @dataProvider . Metody dostawcy danych muszą być publiczne i muszą albo zwracać tablicę tablic, albo obiekt, który powinien implementować interfejs Iterator.
  • 31. Drupal - Kernel tests Większość testów w Drupalu bazuje na PHPUnit . W Drupalu mamy 4 rodzaje testów PHPUnit: ● Unit: testy oparte na PHPUnit z minimalnymi zależnościami. Klasa bazowa: Klasa DrupalTestsUnitTestCase. ● Kernel: testy oparte na PHPUnit z kernelem i z włączoną minimalną liczbą rozszerzeń. Klasa bazowa: Klasa DrupalKernelTestsKernelTestBase. ● Functional: testy oparte na PHPUnit z w pełni uruchomioną instancją Drupala. Klasa bazowa: DrupalTestsBrowserTestBase. ● FunctionalJavascript: Testy oparte na PHPUnit, które wykorzystują Webdriver do przeprowadzania testów funkcjonalności JavaScript i Ajax w przeglądarce. Klasa bazowa: DrupalFunctionalJavascriptTestsWebDriverTestBase.
  • 33. To by było na tyle Pytania?
  • 34. Dziękuję za wasz cenny czas! Imię i Nazwisko autora Paweł Górski pawel.gorski@droptica.com gp@gorskipawel.pl Dane Kontaktowe WWW.DROPTICA.COM