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

Design functional solutions in Java, a practical example
Design functional solutions in Java, a practical exampleDesign functional solutions in Java, a practical example
Design functional solutions in Java, a practical exampleMarian Wamsiedel
 
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
Map(), flatmap() and reduce() are your new best friends: simpler collections,...Map(), flatmap() and reduce() are your new best friends: simpler collections,...
Map(), flatmap() and reduce() are your new best friends: simpler collections,...Chris Richardson
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?FITC
 
Pipeline oriented programming
Pipeline oriented programmingPipeline oriented programming
Pipeline oriented programmingScott Wlaschin
 
HTML5--The 30,000' View (A fast-paced overview of HTML5)
HTML5--The 30,000' View (A fast-paced overview of HTML5)HTML5--The 30,000' View (A fast-paced overview of HTML5)
HTML5--The 30,000' View (A fast-paced overview of HTML5)Peter Lubbers
 
JVM Mechanics: Understanding the JIT's Tricks
JVM Mechanics: Understanding the JIT's TricksJVM Mechanics: Understanding the JIT's Tricks
JVM Mechanics: Understanding the JIT's TricksDoug Hawkins
 
Advanced topics in TypeScript
Advanced topics in TypeScriptAdvanced topics in TypeScript
Advanced topics in TypeScriptHaim Michael
 
JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?Doug Hawkins
 
API Asynchrones en Java 8
API Asynchrones en Java 8API Asynchrones en Java 8
API Asynchrones en Java 8José Paumard
 
Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & StreamsEyal Vardi
 
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 itRafael Dohms
 
Clean architecture with ddd layering in php
Clean architecture with ddd layering in phpClean architecture with ddd layering in php
Clean architecture with ddd layering in phpLeonardo Proietti
 
Introducing Drools
Introducing DroolsIntroducing Drools
Introducing DroolsMario Fusco
 
Domain Modeling in a Functional World
Domain Modeling in a Functional WorldDomain Modeling in a Functional World
Domain Modeling in a Functional WorldDebasish Ghosh
 

What's hot (20)

Design functional solutions in Java, a practical example
Design functional solutions in Java, a practical exampleDesign functional solutions in Java, a practical example
Design functional solutions in Java, a practical example
 
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
Map(), flatmap() and reduce() are your new best friends: simpler collections,...Map(), flatmap() and reduce() are your new best friends: simpler collections,...
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?
 
Pipeline oriented programming
Pipeline oriented programmingPipeline oriented programming
Pipeline oriented programming
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 
HTML5--The 30,000' View (A fast-paced overview of HTML5)
HTML5--The 30,000' View (A fast-paced overview of HTML5)HTML5--The 30,000' View (A fast-paced overview of HTML5)
HTML5--The 30,000' View (A fast-paced overview of HTML5)
 
behatで始めるBDD
behatで始めるBDDbehatで始めるBDD
behatで始めるBDD
 
JVM Mechanics: Understanding the JIT's Tricks
JVM Mechanics: Understanding the JIT's TricksJVM Mechanics: Understanding the JIT's Tricks
JVM Mechanics: Understanding the JIT's Tricks
 
Advanced topics in TypeScript
Advanced topics in TypeScriptAdvanced topics in TypeScript
Advanced topics in TypeScript
 
JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?
 
Estrategias Ágeis para testes sob pressão
Estrategias Ágeis para testes sob pressãoEstrategias Ágeis para testes sob pressão
Estrategias Ágeis para testes sob pressão
 
Flask Basics
Flask BasicsFlask Basics
Flask Basics
 
Writing clean code
Writing clean codeWriting clean code
Writing clean code
 
API Asynchrones en Java 8
API Asynchrones en Java 8API Asynchrones en Java 8
API Asynchrones en Java 8
 
Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & Streams
 
Query planner
Query plannerQuery planner
Query planner
 
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
 
Clean architecture with ddd layering in php
Clean architecture with ddd layering in phpClean architecture with ddd layering in php
Clean architecture with ddd layering in php
 
Introducing Drools
Introducing DroolsIntroducing Drools
Introducing Drools
 
Domain Modeling in a Functional World
Domain Modeling in a Functional WorldDomain Modeling in a Functional World
Domain Modeling in a Functional World
 

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

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 PHPPiotr Horzycki
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzduraPawel Szulc
 
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]Droptica
 
Testy jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitTesty jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitPHPstokPHPstok
 
Strategie automatyzacji testow
Strategie automatyzacji testowStrategie automatyzacji testow
Strategie automatyzacji testowWiktor Żołnowski
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztatyintive
 
Girls in IT - QA
Girls in IT - QA Girls in IT - QA
Girls in IT - QA monterail
 
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 2014Tomasz Dziuda
 
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)PROIDEA
 
SkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel DecSkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel Deckraqa
 
Domain Driven Development
Domain Driven DevelopmentDomain Driven Development
Domain Driven DevelopmentKonrad Russa
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP3camp
 
[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
 
Zwinność w praktyce, Jarek Potiuk
Zwinność w praktyce, Jarek PotiukZwinność w praktyce, Jarek Potiuk
Zwinność w praktyce, Jarek PotiukMamStartup
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Marcin Grzybowski
 
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żecieGrzegorz Godlewski
 
Wzorce projektowe w praktyce
Wzorce projektowe w praktyceWzorce projektowe w praktyce
Wzorce projektowe w praktycePHPstokPHPstok
 
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 MagentoMeet 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

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]Droptica
 
Komunikacja w zespole projektowym [PL]
Komunikacja w zespole projektowym [PL]Komunikacja w zespole projektowym [PL]
Komunikacja w zespole projektowym [PL]Droptica
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Droptica
 
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]Droptica
 
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]Droptica
 
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]Droptica
 
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]Droptica
 
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]Droptica
 
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]Droptica
 
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]Droptica
 
Od środowiska developerskiego do produkcji [PL]
Od środowiska developerskiego do produkcji [PL]Od środowiska developerskiego do produkcji [PL]
Od środowiska developerskiego do produkcji [PL]Droptica
 
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]Droptica
 
Skuteczna komunikacja w projekcie informatycznym [PL]
Skuteczna komunikacja w projekcie informatycznym [PL]Skuteczna komunikacja w projekcie informatycznym [PL]
Skuteczna komunikacja w projekcie informatycznym [PL]Droptica
 
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...Droptica
 
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]Droptica
 
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]Droptica
 
Mapy i geolokalizacja w Drupalu [PL]
Mapy i geolokalizacja w Drupalu [PL]Mapy i geolokalizacja w Drupalu [PL]
Mapy i geolokalizacja w Drupalu [PL]Droptica
 
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 ...Droptica
 
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]Droptica
 
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]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