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

bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話洋史 東平
 
Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
 Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編) Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)Hiroshi Tokumaru
 
[MTC 2021] Criando testes automatizados rápidos e robustos com cypress - Walm...
[MTC 2021] Criando testes automatizados rápidos e robustos com cypress - Walm...[MTC 2021] Criando testes automatizados rápidos e robustos com cypress - Walm...
[MTC 2021] Criando testes automatizados rápidos e robustos com cypress - Walm...minastestingconference
 
クラスローダーについて
クラスローダーについてクラスローダーについて
クラスローダーについてSuguru ARAKAWA
 
A journey beyond the page object pattern
A journey beyond the page object patternA journey beyond the page object pattern
A journey beyond the page object patternRiverGlide
 
Writing Clean Code in Swift
Writing Clean Code in SwiftWriting Clean Code in Swift
Writing Clean Code in SwiftDerek Lee Boire
 
[2019] 200만 동접 게임을 위한 MySQL 샤딩
[2019] 200만 동접 게임을 위한 MySQL 샤딩[2019] 200만 동접 게임을 위한 MySQL 샤딩
[2019] 200만 동접 게임을 위한 MySQL 샤딩NHN FORWARD
 
I'm in ur browser, pwning your stuff - Attacking (with) Google Chrome Extensions
I'm in ur browser, pwning your stuff - Attacking (with) Google Chrome ExtensionsI'm in ur browser, pwning your stuff - Attacking (with) Google Chrome Extensions
I'm in ur browser, pwning your stuff - Attacking (with) Google Chrome ExtensionsKrzysztof Kotowicz
 
Django의 배신(주니어 개발자의 Django 삽질기)
Django의 배신(주니어 개발자의 Django 삽질기)Django의 배신(주니어 개발자의 Django 삽질기)
Django의 배신(주니어 개발자의 Django 삽질기)Eunhyang Kim
 
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.병대 손
 
인수테스트 주도 개발
인수테스트 주도 개발인수테스트 주도 개발
인수테스트 주도 개발Jaehoon Oh
 
Data processing with celery and rabbit mq
Data processing with celery and rabbit mqData processing with celery and rabbit mq
Data processing with celery and rabbit mqJeff Peck
 
Security Testing with Zap
Security Testing with ZapSecurity Testing with Zap
Security Testing with ZapSoluto
 
Mapa de aprendizado Front End
Mapa de aprendizado Front EndMapa de aprendizado Front End
Mapa de aprendizado Front EndCaio Vaccaro
 

What's hot (20)

TDD and BDD and ATDD
TDD and BDD and ATDDTDD and BDD and ATDD
TDD and BDD and ATDD
 
bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話
 
Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
 Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編) Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
 
[MTC 2021] Criando testes automatizados rápidos e robustos com cypress - Walm...
[MTC 2021] Criando testes automatizados rápidos e robustos com cypress - Walm...[MTC 2021] Criando testes automatizados rápidos e robustos com cypress - Walm...
[MTC 2021] Criando testes automatizados rápidos e robustos com cypress - Walm...
 
クラスローダーについて
クラスローダーについてクラスローダーについて
クラスローダーについて
 
JMockit
JMockitJMockit
JMockit
 
A journey beyond the page object pattern
A journey beyond the page object patternA journey beyond the page object pattern
A journey beyond the page object pattern
 
Writing Clean Code in Swift
Writing Clean Code in SwiftWriting Clean Code in Swift
Writing Clean Code in Swift
 
Jest
JestJest
Jest
 
[2019] 200만 동접 게임을 위한 MySQL 샤딩
[2019] 200만 동접 게임을 위한 MySQL 샤딩[2019] 200만 동접 게임을 위한 MySQL 샤딩
[2019] 200만 동접 게임을 위한 MySQL 샤딩
 
I'm in ur browser, pwning your stuff - Attacking (with) Google Chrome Extensions
I'm in ur browser, pwning your stuff - Attacking (with) Google Chrome ExtensionsI'm in ur browser, pwning your stuff - Attacking (with) Google Chrome Extensions
I'm in ur browser, pwning your stuff - Attacking (with) Google Chrome Extensions
 
Django의 배신(주니어 개발자의 Django 삽질기)
Django의 배신(주니어 개발자의 Django 삽질기)Django의 배신(주니어 개발자의 Django 삽질기)
Django의 배신(주니어 개발자의 Django 삽질기)
 
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
 
Catching fileless attacks
Catching fileless attacksCatching fileless attacks
Catching fileless attacks
 
인수테스트 주도 개발
인수테스트 주도 개발인수테스트 주도 개발
인수테스트 주도 개발
 
Data processing with celery and rabbit mq
Data processing with celery and rabbit mqData processing with celery and rabbit mq
Data processing with celery and rabbit mq
 
Security Testing with Zap
Security Testing with ZapSecurity Testing with Zap
Security Testing with Zap
 
Mapa de aprendizado Front End
Mapa de aprendizado Front EndMapa de aprendizado Front End
Mapa de aprendizado Front End
 
Performance testing locust
Performance testing   locustPerformance testing   locust
Performance testing locust
 
Auto testing!
Auto testing!Auto testing!
Auto testing!
 

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
 
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
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
 
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
 
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