際際滷

際際滷Share a Scribd company logo
PHPUnit
ve

Laravel
Neler G旦receiz?
Neler G旦receiz?
Neden?
Neler G旦receiz?
Neden?

TDD Nedir?
Neler G旦receiz?
Neden?
TDD Ne Deildir?

TDD Nedir?
Neler G旦receiz?
Neden?
TDD Ne Deildir?
PHPUnit

TDD Nedir?
Neler G旦receiz?
Neden?
TDD Ne Deildir?
assertions

PHPUnit

TDD Nedir?
Neler G旦receiz?
Neden?
TDD Ne Deildir?
assertions

PHPUnit

annotations

TDD Nedir?
Neler G旦receiz?
Neden?
TDD Ne Deildir?
assertions

PHPUnit

mock'lama

annotations

TDD Nedir?
Neler G旦receiz?
TDD Nedir?

Neden?
TDD Ne Deildir?
assertions

PHPUnit

mock'lama

annotations

phpunit.xml
Neler G旦receiz?
TDD Nedir?

Neden?
TDD Ne Deildir?
assertions

code coverage

PHPUnit

mock'lama

annotations

phpunit.xml
Neler G旦receiz?
TDD Nedir?

Neden?
TDD Ne Deildir?
assertions

code coverage

PHPUnit

mock'lama

annotations

phpunit.xml

IOC / DI
Neler G旦receiz?
TDD Nedir?

Neden?

Laravel ile TDD
TDD Ne Deildir?
assertions

code coverage

PHPUnit

mock'lama

annotations

phpunit.xml

IOC / DI
Neler G旦receiz?
TDD Nedir?

Neden?

Laravel ile TDD

route'lara istek yapmak

TDD Ne Deildir?
assertions

code coverage

PHPUnit

mock'lama

annotations

phpunit.xml

IOC / DI
Neler G旦receiz?
TDD Nedir?

Neden?
dom crawler

Laravel ile TDD

route'lara istek yapmak

TDD Ne Deildir?
assertions

code coverage

PHPUnit

mock'lama

annotations

phpunit.xml

IOC / DI
Neler G旦receiz?
TDD Nedir?

Neden?
IOC

dom crawler

Laravel ile TDD

route'lara istek yapmak

TDD Ne Deildir?
assertions

code coverage

PHPUnit

mock'lama

annotations

phpunit.xml

IOC / DI
Neler G旦receiz?
TDD Nedir?

Neden?
IOC

dom crawler

Laravel ile TDD

route'lara istek yapmak

mockery

TDD Ne Deildir?
assertions

code coverage

PHPUnit

mock'lama

annotations

phpunit.xml

IOC / DI
NEDEN?
Yap脹lacak en ufak hata, sitenin tamamiyle 巽al脹mamas脹na sebep olabilir.
Herhangi bir yerde var_dump kullanmak yerine, bunun testini yaz脹n
"Debugging Sucks, Testing Rocks"
Daha "korkusuz" gelitirme yapabilmek i巽in
"Kontrat" salamak i巽in
Test Driven Development Nedir?
Test Driven Development Nedir?

Yeilden 旦nce k脹rm脹z脹y脹 g旦rmek
 Herhangi bir kod yazmadan, 旦nce testini
yaz脹p, bu testin baar脹s脹z olduunu
(k脹rm脹z脹) g旦rmek
Test Driven Development Nedir?

Yeilden 旦nce k脹rm脹z脹y脹 g旦rmek
 Herhangi bir kod yazmadan, 旦nce testini
yaz脹p, bu testin baar脹s脹z olduunu
(k脹rm脹z脹) g旦rmek

K脹rm脹z脹y脹 yeile 巽evirmeye 巽al脹mak
 Baar脹s脹z olan testi, baar脹l脹 yapacak
minimum kodu yazarak, testi baar脹l脹(yeil) hale getirmek
Test Driven Development Nedir?

Yeilden 旦nce k脹rm脹z脹y脹 g旦rmek
 Herhangi bir kod yazmadan, 旦nce testini
yaz脹p, bu testin baar脹s脹z olduunu
(k脹rm脹z脹) g旦rmek

K脹rm脹z脹y脹 yeile 巽evirmeye 巽al脹mak
 Baar脹s脹z olan testi, baar脹l脹 yapacak
minimum kodu yazarak, testi baar脹l脹(yeil) hale getirmek

Ama her zaman yeili de k脹rm脹z脹 yapabilecek durumlar yaratmaya 巽al脹mak
 Daha sonra, baar脹l脹 testi baar脹s脹z yapacak yeni testler ekleyerek
kodu deitirmek
Test Driven Development Nedir?

Yeilden 旦nce k脹rm脹z脹y脹 g旦rmek
 Herhangi bir kod yazmadan, 旦nce testini
yaz脹p, bu testin baar脹s脹z olduunu
(k脹rm脹z脹) g旦rmek

K脹rm脹z脹y脹 yeile 巽evirmeye 巽al脹mak
 Baar脹s脹z olan testi, baar脹l脹 yapacak
minimum kodu yazarak, testi baar脹l脹(yeil) hale getirmek

Ama her zaman yeili de k脹rm脹z脹 yapabilecek durumlar yaratmaya 巽al脹mak
 Daha sonra, baar脹l脹 testi baar脹s脹z yapacak yeni testler ekleyerek
kodu deitirmek

En sonda mavide huzur bulmakt脹r (Refactoring).
 Bu s脹rada kodun kalitesini 巽al脹an yap脹y脹 bozmad脹脹ndan emin olarak artt脹rmak
Test Driven Development Nedir?
Sizi daha iyi bir tasar脹ma zorlar
 Daha mod端ler
 Daha tekrar-kullan脹labilir (reusable)
 Daha test edilebilir
Test Driven Development Nedir?
Sizi daha iyi bir tasar脹ma zorlar
 Daha mod端ler
 Daha tekrar-kullan脹labilir (reusable)
 Daha test edilebilir

Haz脹r d旦k端mantasyon!
 Testler, en g端zel d旦k端mantasyonlard脹r
Test Driven Development Nedir?
Sizi daha iyi bir tasar脹ma zorlar
 Daha mod端ler
 Daha tekrar-kullan脹labilir (reusable)
 Daha test edilebilir

Haz脹r d旦k端mantasyon!
 Testler, en g端zel d旦k端mantasyonlard脹r

Abi ben d端zg端n yazd脹m, Mehmet'in yazd脹脹 kod patlatm脹
 Regression test hayat kurtar脹r
Test Driven Development Ne Deildir?
Boa harcanan zaman
 Eer 端r端n端 gelitirmeye devam edecekseniz, o zaman脹n 巽ok daha
fazlas脹n脹 kodun bak脹m脹 i巽in harcamak zorunda kalabilirsiniz
 > Bir arat脹rmaya g旦re, gelitirme s端resini %15 - %35 arrt脹r脹rken,
> hata say脹s脹n脹 %40 - %90 oran脹nda azalt脹yor.
Test Driven Development Ne Deildir?
Boa harcanan zaman
 Eer 端r端n端 gelitirmeye devam edecekseniz, o zaman脹n 巽ok daha
fazlas脹n脹 kodun bak脹m脹 i巽in harcamak zorunda kalabilirsiniz
 > Bir arat脹rmaya g旦re, gelitirme s端resini %15 - %35 arrt脹r脹rken,
> hata say脹s脹n脹 %40 - %90 oran脹nda azalt脹yor.

Daha 旦nce yaz脹lm脹 kodu, test eder
 Hen端z yaz脹lmam脹 kodun testini i巽erir.
Kodun testi deil, testin kodu vard脹r
Test Driven Development Ne Deildir?
Boa harcanan zaman
 Eer 端r端n端 gelitirmeye devam edecekseniz, o zaman脹n 巽ok daha
fazlas脹n脹 kodun bak脹m脹 i巽in harcamak zorunda kalabilirsiniz
 > Bir arat脹rmaya g旦re, gelitirme s端resini %15 - %35 arrt脹r脹rken,
> hata say脹s脹n脹 %40 - %90 oran脹nda azalt脹yor.

Daha 旦nce yaz脹lm脹 kodu, test eder
 Hen端z yaz脹lmam脹 kodun testini i巽erir.
Kodun testi deil, testin kodu vard脹r

Her soruna 巽旦z端md端r
 Testler de yanl脹/eksik olabilir.
 Kodda 巽脹kan bir bug asl脹nda yanl脹/eksik bir testtir
PHPUnit
PHPUnit
Sebastian Bergmann taraf脹ndan gelitirilmitir
XUnit ailesinin bir 端yesidir

<?php
class FooTest extends PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function firstTest()
{
$this->assertTrue(true);
}
}
PHPUnit - Assertions
Bir test direktifinin "yeil" olmas脹 i巽in kullan脹lacak kontrolleri i巽erir
assertArrayHasKey()

assertInstanceOf()

assertGreaterThanOrEqual()

assertClassHasAttribute()

assertInternalType()

assertSelectEquals()

assertClassHasStaticAttribute()

assertJsonFileEqualsJsonFile()

assertSelectRegExp()

assertContains()

assertJsonStringEqualsJsonFile()

assertStringEndsWith()

assertContainsOnly()

assertJsonStringEqualsJsonString()

assertStringEqualsFile()

assertContainsOnlyInstancesOf()

assertLessThan()

assertStringStartsWith()

assertCount()

assertLessThanOrEqual()

assertTag()

assertEmpty()

assertNull()

assertThat()

assertEqualXMLStructure()

assertObjectHasAttribute()

assertTrue()

assertEquals()

assertRegExp()

assertXmlFileEqualsXmlFile()

assertFalse()

assertStringMatchesFormat()

assertXmlStringEqualsXmlFile()

assertFileEquals()

assertStringMatchesFormatFile()

assertXmlStringEqualsXmlString()

assertFileExists()

assertSame()

assertGreaterThan()

assertSelectCount()
PHPUnit - Annotations
PHPUnit, Annotation'lar kullanarak 巽eitli Aspect'leri 巽al脹t脹rabilir
@author

@group

@backupGlobals

@large

@backupStaticAttributes

@medium

@codeCoverageIgnore*

@preserveGlobalState

@covers

@requires

@coversDefaultClass

@runTestsInSeparateProcesses

@coversNothing

@runInSeparateProcess

@dataProvider

@small

@depends

@test

@expectedException

@testdox

@expectedExceptionCode

@ticket

@expectedExceptionMessage
PHPUnit - Code Coverage
PHPUnit, XDebug kullanarak "code coverage" raporlar脹 端retebilir
PHPUnit - Code Coverage
PHPUnit - Mock'lama
Unit test yazarken sadece ilgili birimi test etmeliyiz
G端n端n sonunda, t端m birimler d端zg端n 巽al脹脹yorsa, integration test'e ge巽ebiliriz
Bu birim d脹ar脹 ba脹ml脹 baka bir s脹n脹f kullan脹yorsa, onlar脹 Mock'lamal脹y脹z
PHPUnit - Mock'lama
class StubTest extends PHPUnit_Framework_TestCase
{
public function testStub()
{
// Create a stub for the SomeClass class.
$stub = $this->getMock('SomeClass');
// Configure the stub.
$stub->expects($this->any())
->method('doSomething')
->will($this->returnValue('foo'));
// Calling $stub->doSomething() will now return
// 'foo'.
$this->assertEquals('foo', $stub->doSomething());
}
}
Inversion Of Control - Dependency Injection
Uygulama i巽indeki, nesne yaratma (instance oluturma) s端recinin sadece bu iten sorumlu
bir birim taraf脹ndan kontrol edilmesi.
Loosly Coupled ve daha test edilebilir kodlar 端retmek i巽in
Inversion Of Control - Dependency Injection
Uygulama i巽indeki, nesne yaratma (instance oluturma) s端recinin sadece bu iten sorumlu
bir birim taraf脹ndan kontrol edilmesi.
Loosly Coupled ve daha test edilebilir kodlar 端retmek i巽in

class User
{
public function create() {
$logger = new DatabaseLogger();
$logger->log("user created");
}
}
Inversion Of Control - Dependency Injection
Uygulama i巽indeki, nesne yaratma (instance oluturma) s端recinin sadece bu iten sorumlu
bir birim taraf脹ndan kontrol edilmesi.
Loosly Coupled ve daha test edilebilir kodlar 端retmek i巽in

class User
{
public function create() {
//User s脹n脹f脹 DatabaseLogger'a 巽ok ba脹ml脹
$logger = new DatabaseLogger();
$logger->log("user created");
}
}
Inversion Of Control - Dependency Injection
DatabaseLogger olmadan User s脹n脹f脹 巽al脹am脹yor
 Bir ad脹m ileri ta脹yarak, DatabaseLogger'a olan bal脹l脹脹 kald脹ral脹m
Inversion Of Control - Dependency Injection
DatabaseLogger olmadan User s脹n脹f脹 巽al脹am脹yor
 Bir ad脹m ileri ta脹yarak, DatabaseLogger'a olan bal脹l脹脹 kald脹ral脹m

function kullanilacakLoggerSinifindanObjeUret () {
return new DatabaseLogger();
}
class User
{
public function create() {
$logger = kullanilacakLoggerSinifindanObjeUret();
$logger->log("user created");
}
}
Inversion Of Control - Dependency Injection
DatabaseLogger olmadan User s脹n脹f脹 巽al脹am脹yor
 Bir ad脹m ileri ta脹yarak, DatabaseLogger'a olan bal脹l脹脹 kald脹ral脹m

function kullanilacakLoggerSinifindanObjeUret () {
//D端nyan脹n en basit Dependency Injection Container'脹
return new DatabaseLogger();
}
class User
{
public function create() {
$logger = kullanilacakLoggerSinifindanObjeUret();
$logger->log("user created");
}
}
Inversion Of Control - Dependency Injection
Ama hala bir sorun var
 ya bu fonksiyondan d旦nen objenin "log" diye methodu yoksa?
Inversion Of Control - Dependency Injection
Ama hala bir sorun var
 ya bu fonksiyondan d旦nen objenin "log" diye methodu yoksa?

function kullanilacakLoggerSinifindanObjeUret () {
//D端nyan脹n en basit Dependency Injection Container'脹
return new HodoLogger();
}
class User
{
public function create() {
$logger = kullanilacakLoggerSinifindanObjeUret();
$logger->log("user created");
}
}
Inversion Of Control - Dependency Injection
Her Logger t端revinin "log" diye methodu olmal脹
 Interface!!1

interface MyLoggerInterface {
public function log($msg);
}
class HodoLogger implements MyLoggerInterface

function kullanilacakLoggerSinifindanObjeUret () {
$logger = new HodoLogger();
if (!$logger instanceOf MyLoggerInterface) {
throw new Exception("HATA!!");
}
return $logger;
}
Inversion Of Control - Dependency Injection
Art脹k gelen logger objesinin log methodu olduundan emin olduk.
Ama her s脹n脹f i巽in b旦yle sa巽ma methodlar m脹 yazaca脹z?
Inversion Of Control - Dependency Injection
Art脹k gelen logger objesinin log methodu olduundan emin olduk.
Ama her s脹n脹f i巽in b旦yle sa巽ma methodlar m脹 yazaca脹z?
 Laravel IOC Container

App::bind("myapplication.logger", function () {
return new DatabaseLogger();
});

class User
{
public function create() {
$logger = App::make("myapplication.logger");
$logger->log("user created");
}
}
Laravel'de Unit Testing
Laravel'de Unit Testing
testler app/tests alt脹nda bulunur
test s脹n脹flar脹 *Test.php ile biten dosyalarda bulunur
 IlluminateFoundationTestingTestCase
test'ler 巽al脹脹rken environment "testing" olarak set edilir
 burada ger巽ek ortamdan ayr脹lan ayarlar脹 girebilirsiniz
Laravel'de Unit Testing - Route'lar脹 kontrol etme
$response = $this->call('GET', 'user/profile');

$response = $this->action('GET', 'UserController@profile', array('user' => 1));

$crawler = $this->client->request('GET', '/');
Laravel'de Unit Testing - Route'lar脹 kontrol etme
$this->assertEquals('Hello World', $response->getContent());

$this->assertEquals('John', $view['name']);

$this->assertTrue($this->client->getResponse()->isOk());
$this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));
Laravel'de Unit Testing - Mocking
Facades
Laravel'de t端m Facade'lar Mockery ile Mock'lanabilir
public function getIndex()
{
Event::fire('user.logged');
return 'Welcome!';
}

public function testGetIndex()
{
Event::shouldReceive('fire')->once()->with('user.logged');
$this->call('GET', '/');
}
Laravel'de Unit Testing - Mocking
Mockery
聴stersek, Mockery kullanarak, kendi dependency'lerimizle test edebiliriz

$mock = Mockery::mock('BizimLogger');
$mock->shouldReceive('log');
App::instance("myapplication.logger", $mock);
Talk is cheap, show me the code!
Giris isimli bir sayfamiz olsun
Buraya yapilan GET isteklerinde, bir form g旦r端ns端n
 formun i巽inde
 kullan脹c脹n脹n ad脹n脹 girebilecei bir alan
 ve submit butonu olsun
Kullan脹c脹 formu post ettiinde
 Eer isim "phptr" ise ekrana "Hibrit!!1" yazs脹n
 Deilse, "Giri yapan kullan脹c脹: KULLANICI_ADI" eklinde post edilen kullan脹c脹 ad脹n脹 yazs脹n
 "phptr" kullan脹c脹s脹n脹n her girii de log'lans脹n
Sorular?

@yuxel

More Related Content

Similar to PHPUnit ve Laravel (20)

Test Driven Development
Test Driven Development Test Driven Development
Test Driven Development
Nezir Y端rekli
GDO'suz Yaz脹l脹m Gelitirme Teknikleri
GDO'suz Yaz脹l脹m Gelitirme TeknikleriGDO'suz Yaz脹l脹m Gelitirme Teknikleri
GDO'suz Yaz脹l脹m Gelitirme Teknikleri
Lemi Orhan Ergin
Selenium
SeleniumSelenium
Selenium
Osman Yuksel
A巽脹k Kaynak Kodlu Yaz脹l脹m Gelitirme
A巽脹k Kaynak Kodlu Yaz脹l脹m GelitirmeA巽脹k Kaynak Kodlu Yaz脹l脹m Gelitirme
A巽脹k Kaynak Kodlu Yaz脹l脹m Gelitirme
Serkan Kaba
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
聴lkin Balkanay
Visual Studio Developer Tools
Visual Studio Developer ToolsVisual Studio Developer Tools
Visual Studio Developer Tools
Uur T脹l脹kolu
Jasminebdd
JasminebddJasminebdd
Jasminebdd
Osman Yuksel
Davranis Odakli Gelistirmeye Giris, Behat ve Mink
Davranis Odakli Gelistirmeye Giris, Behat ve MinkDavranis Odakli Gelistirmeye Giris, Behat ve Mink
Davranis Odakli Gelistirmeye Giris, Behat ve Mink
Mustafa Ileri
ASP.Net MVC ile Web Uygulamalar脹 -12(Test Drive Developmet)
ASP.Net MVC ile Web Uygulamalar脹 -12(Test Drive Developmet)ASP.Net MVC ile Web Uygulamalar脹 -12(Test Drive Developmet)
ASP.Net MVC ile Web Uygulamalar脹 -12(Test Drive Developmet)
聴brahim ATAY
Jenkins
JenkinsJenkins
Jenkins
Osman Yuksel
In Turkish: Yaz脹l脹m Test-Kod M端hendislii (YTKM): Kaliteli Test-Kodu Gelitir...
In Turkish: Yaz脹l脹m Test-Kod M端hendislii (YTKM): Kaliteli Test-Kodu Gelitir...In Turkish: Yaz脹l脹m Test-Kod M端hendislii (YTKM): Kaliteli Test-Kodu Gelitir...
In Turkish: Yaz脹l脹m Test-Kod M端hendislii (YTKM): Kaliteli Test-Kodu Gelitir...
Vhid (Vahid) Gruslu (Garousi)
PhpSpec ve TDD
PhpSpec ve TDDPhpSpec ve TDD
PhpSpec ve TDD
YolcuIskender
DevOps Pratikleri ile Yaz脹l脹m D端nyas脹nda Neler Deiiyor?
DevOps Pratikleri ile Yaz脹l脹m D端nyas脹nda Neler Deiiyor?DevOps Pratikleri ile Yaz脹l脹m D端nyas脹nda Neler Deiiyor?
DevOps Pratikleri ile Yaz脹l脹m D端nyas脹nda Neler Deiiyor?
Derya SEZEN
C箕evik testler
C箕evik testlerC箕evik testler
C箕evik testler
Bugra Gokalp Okcu
Yaz脹l脹m Test Yaam D旦ng端s端 ve Proje Baar脹s脹na Etkisi
Yaz脹l脹m Test Yaam D旦ng端s端 ve Proje Baar脹s脹na EtkisiYaz脹l脹m Test Yaam D旦ng端s端 ve Proje Baar脹s脹na Etkisi
Yaz脹l脹m Test Yaam D旦ng端s端 ve Proje Baar脹s脹na Etkisi
Aynur zkan
45965 php-source-code-analysis
45965 php-source-code-analysis45965 php-source-code-analysis
45965 php-source-code-analysis
Attaporn Ninsuwan
Software/Yaz脹l脹m Test
Software/Yaz脹l脹m TestSoftware/Yaz脹l脹m Test
Software/Yaz脹l脹m Test
Dilaver Demirel
Django Introduction
Django IntroductionDjango Introduction
Django Introduction
Fatih Erikli
Test M端hendisliine Giri Eitimi - B旦l端m 1
Test M端hendisliine Giri Eitimi - B旦l端m 1Test M端hendisliine Giri Eitimi - B旦l端m 1
Test M端hendisliine Giri Eitimi - B旦l端m 1
Mesut G端nes
Test Driven Development
Test Driven Development Test Driven Development
Test Driven Development
Nezir Y端rekli
GDO'suz Yaz脹l脹m Gelitirme Teknikleri
GDO'suz Yaz脹l脹m Gelitirme TeknikleriGDO'suz Yaz脹l脹m Gelitirme Teknikleri
GDO'suz Yaz脹l脹m Gelitirme Teknikleri
Lemi Orhan Ergin
A巽脹k Kaynak Kodlu Yaz脹l脹m Gelitirme
A巽脹k Kaynak Kodlu Yaz脹l脹m GelitirmeA巽脹k Kaynak Kodlu Yaz脹l脹m Gelitirme
A巽脹k Kaynak Kodlu Yaz脹l脹m Gelitirme
Serkan Kaba
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
聴lkin Balkanay
Visual Studio Developer Tools
Visual Studio Developer ToolsVisual Studio Developer Tools
Visual Studio Developer Tools
Uur T脹l脹kolu
Davranis Odakli Gelistirmeye Giris, Behat ve Mink
Davranis Odakli Gelistirmeye Giris, Behat ve MinkDavranis Odakli Gelistirmeye Giris, Behat ve Mink
Davranis Odakli Gelistirmeye Giris, Behat ve Mink
Mustafa Ileri
ASP.Net MVC ile Web Uygulamalar脹 -12(Test Drive Developmet)
ASP.Net MVC ile Web Uygulamalar脹 -12(Test Drive Developmet)ASP.Net MVC ile Web Uygulamalar脹 -12(Test Drive Developmet)
ASP.Net MVC ile Web Uygulamalar脹 -12(Test Drive Developmet)
聴brahim ATAY
In Turkish: Yaz脹l脹m Test-Kod M端hendislii (YTKM): Kaliteli Test-Kodu Gelitir...
In Turkish: Yaz脹l脹m Test-Kod M端hendislii (YTKM): Kaliteli Test-Kodu Gelitir...In Turkish: Yaz脹l脹m Test-Kod M端hendislii (YTKM): Kaliteli Test-Kodu Gelitir...
In Turkish: Yaz脹l脹m Test-Kod M端hendislii (YTKM): Kaliteli Test-Kodu Gelitir...
Vhid (Vahid) Gruslu (Garousi)
DevOps Pratikleri ile Yaz脹l脹m D端nyas脹nda Neler Deiiyor?
DevOps Pratikleri ile Yaz脹l脹m D端nyas脹nda Neler Deiiyor?DevOps Pratikleri ile Yaz脹l脹m D端nyas脹nda Neler Deiiyor?
DevOps Pratikleri ile Yaz脹l脹m D端nyas脹nda Neler Deiiyor?
Derya SEZEN
Yaz脹l脹m Test Yaam D旦ng端s端 ve Proje Baar脹s脹na Etkisi
Yaz脹l脹m Test Yaam D旦ng端s端 ve Proje Baar脹s脹na EtkisiYaz脹l脹m Test Yaam D旦ng端s端 ve Proje Baar脹s脹na Etkisi
Yaz脹l脹m Test Yaam D旦ng端s端 ve Proje Baar脹s脹na Etkisi
Aynur zkan
45965 php-source-code-analysis
45965 php-source-code-analysis45965 php-source-code-analysis
45965 php-source-code-analysis
Attaporn Ninsuwan
Software/Yaz脹l脹m Test
Software/Yaz脹l脹m TestSoftware/Yaz脹l脹m Test
Software/Yaz脹l脹m Test
Dilaver Demirel
Django Introduction
Django IntroductionDjango Introduction
Django Introduction
Fatih Erikli
Test M端hendisliine Giri Eitimi - B旦l端m 1
Test M端hendisliine Giri Eitimi - B旦l端m 1Test M端hendisliine Giri Eitimi - B旦l端m 1
Test M端hendisliine Giri Eitimi - B旦l端m 1
Mesut G端nes

PHPUnit ve Laravel

  • 5. Neler G旦receiz? Neden? TDD Ne Deildir? TDD Nedir?
  • 6. Neler G旦receiz? Neden? TDD Ne Deildir? PHPUnit TDD Nedir?
  • 7. Neler G旦receiz? Neden? TDD Ne Deildir? assertions PHPUnit TDD Nedir?
  • 8. Neler G旦receiz? Neden? TDD Ne Deildir? assertions PHPUnit annotations TDD Nedir?
  • 9. Neler G旦receiz? Neden? TDD Ne Deildir? assertions PHPUnit mock'lama annotations TDD Nedir?
  • 10. Neler G旦receiz? TDD Nedir? Neden? TDD Ne Deildir? assertions PHPUnit mock'lama annotations phpunit.xml
  • 11. Neler G旦receiz? TDD Nedir? Neden? TDD Ne Deildir? assertions code coverage PHPUnit mock'lama annotations phpunit.xml
  • 12. Neler G旦receiz? TDD Nedir? Neden? TDD Ne Deildir? assertions code coverage PHPUnit mock'lama annotations phpunit.xml IOC / DI
  • 13. Neler G旦receiz? TDD Nedir? Neden? Laravel ile TDD TDD Ne Deildir? assertions code coverage PHPUnit mock'lama annotations phpunit.xml IOC / DI
  • 14. Neler G旦receiz? TDD Nedir? Neden? Laravel ile TDD route'lara istek yapmak TDD Ne Deildir? assertions code coverage PHPUnit mock'lama annotations phpunit.xml IOC / DI
  • 15. Neler G旦receiz? TDD Nedir? Neden? dom crawler Laravel ile TDD route'lara istek yapmak TDD Ne Deildir? assertions code coverage PHPUnit mock'lama annotations phpunit.xml IOC / DI
  • 16. Neler G旦receiz? TDD Nedir? Neden? IOC dom crawler Laravel ile TDD route'lara istek yapmak TDD Ne Deildir? assertions code coverage PHPUnit mock'lama annotations phpunit.xml IOC / DI
  • 17. Neler G旦receiz? TDD Nedir? Neden? IOC dom crawler Laravel ile TDD route'lara istek yapmak mockery TDD Ne Deildir? assertions code coverage PHPUnit mock'lama annotations phpunit.xml IOC / DI
  • 18. NEDEN? Yap脹lacak en ufak hata, sitenin tamamiyle 巽al脹mamas脹na sebep olabilir. Herhangi bir yerde var_dump kullanmak yerine, bunun testini yaz脹n "Debugging Sucks, Testing Rocks" Daha "korkusuz" gelitirme yapabilmek i巽in "Kontrat" salamak i巽in
  • 20. Test Driven Development Nedir? Yeilden 旦nce k脹rm脹z脹y脹 g旦rmek Herhangi bir kod yazmadan, 旦nce testini yaz脹p, bu testin baar脹s脹z olduunu (k脹rm脹z脹) g旦rmek
  • 21. Test Driven Development Nedir? Yeilden 旦nce k脹rm脹z脹y脹 g旦rmek Herhangi bir kod yazmadan, 旦nce testini yaz脹p, bu testin baar脹s脹z olduunu (k脹rm脹z脹) g旦rmek K脹rm脹z脹y脹 yeile 巽evirmeye 巽al脹mak Baar脹s脹z olan testi, baar脹l脹 yapacak minimum kodu yazarak, testi baar脹l脹(yeil) hale getirmek
  • 22. Test Driven Development Nedir? Yeilden 旦nce k脹rm脹z脹y脹 g旦rmek Herhangi bir kod yazmadan, 旦nce testini yaz脹p, bu testin baar脹s脹z olduunu (k脹rm脹z脹) g旦rmek K脹rm脹z脹y脹 yeile 巽evirmeye 巽al脹mak Baar脹s脹z olan testi, baar脹l脹 yapacak minimum kodu yazarak, testi baar脹l脹(yeil) hale getirmek Ama her zaman yeili de k脹rm脹z脹 yapabilecek durumlar yaratmaya 巽al脹mak Daha sonra, baar脹l脹 testi baar脹s脹z yapacak yeni testler ekleyerek kodu deitirmek
  • 23. Test Driven Development Nedir? Yeilden 旦nce k脹rm脹z脹y脹 g旦rmek Herhangi bir kod yazmadan, 旦nce testini yaz脹p, bu testin baar脹s脹z olduunu (k脹rm脹z脹) g旦rmek K脹rm脹z脹y脹 yeile 巽evirmeye 巽al脹mak Baar脹s脹z olan testi, baar脹l脹 yapacak minimum kodu yazarak, testi baar脹l脹(yeil) hale getirmek Ama her zaman yeili de k脹rm脹z脹 yapabilecek durumlar yaratmaya 巽al脹mak Daha sonra, baar脹l脹 testi baar脹s脹z yapacak yeni testler ekleyerek kodu deitirmek En sonda mavide huzur bulmakt脹r (Refactoring). Bu s脹rada kodun kalitesini 巽al脹an yap脹y脹 bozmad脹脹ndan emin olarak artt脹rmak
  • 24. Test Driven Development Nedir? Sizi daha iyi bir tasar脹ma zorlar Daha mod端ler Daha tekrar-kullan脹labilir (reusable) Daha test edilebilir
  • 25. Test Driven Development Nedir? Sizi daha iyi bir tasar脹ma zorlar Daha mod端ler Daha tekrar-kullan脹labilir (reusable) Daha test edilebilir Haz脹r d旦k端mantasyon! Testler, en g端zel d旦k端mantasyonlard脹r
  • 26. Test Driven Development Nedir? Sizi daha iyi bir tasar脹ma zorlar Daha mod端ler Daha tekrar-kullan脹labilir (reusable) Daha test edilebilir Haz脹r d旦k端mantasyon! Testler, en g端zel d旦k端mantasyonlard脹r Abi ben d端zg端n yazd脹m, Mehmet'in yazd脹脹 kod patlatm脹 Regression test hayat kurtar脹r
  • 27. Test Driven Development Ne Deildir? Boa harcanan zaman Eer 端r端n端 gelitirmeye devam edecekseniz, o zaman脹n 巽ok daha fazlas脹n脹 kodun bak脹m脹 i巽in harcamak zorunda kalabilirsiniz > Bir arat脹rmaya g旦re, gelitirme s端resini %15 - %35 arrt脹r脹rken, > hata say脹s脹n脹 %40 - %90 oran脹nda azalt脹yor.
  • 28. Test Driven Development Ne Deildir? Boa harcanan zaman Eer 端r端n端 gelitirmeye devam edecekseniz, o zaman脹n 巽ok daha fazlas脹n脹 kodun bak脹m脹 i巽in harcamak zorunda kalabilirsiniz > Bir arat脹rmaya g旦re, gelitirme s端resini %15 - %35 arrt脹r脹rken, > hata say脹s脹n脹 %40 - %90 oran脹nda azalt脹yor. Daha 旦nce yaz脹lm脹 kodu, test eder Hen端z yaz脹lmam脹 kodun testini i巽erir. Kodun testi deil, testin kodu vard脹r
  • 29. Test Driven Development Ne Deildir? Boa harcanan zaman Eer 端r端n端 gelitirmeye devam edecekseniz, o zaman脹n 巽ok daha fazlas脹n脹 kodun bak脹m脹 i巽in harcamak zorunda kalabilirsiniz > Bir arat脹rmaya g旦re, gelitirme s端resini %15 - %35 arrt脹r脹rken, > hata say脹s脹n脹 %40 - %90 oran脹nda azalt脹yor. Daha 旦nce yaz脹lm脹 kodu, test eder Hen端z yaz脹lmam脹 kodun testini i巽erir. Kodun testi deil, testin kodu vard脹r Her soruna 巽旦z端md端r Testler de yanl脹/eksik olabilir. Kodda 巽脹kan bir bug asl脹nda yanl脹/eksik bir testtir
  • 31. PHPUnit Sebastian Bergmann taraf脹ndan gelitirilmitir XUnit ailesinin bir 端yesidir <?php class FooTest extends PHPUnit_Framework_TestCase { /** * @test */ public function firstTest() { $this->assertTrue(true); } }
  • 32. PHPUnit - Assertions Bir test direktifinin "yeil" olmas脹 i巽in kullan脹lacak kontrolleri i巽erir assertArrayHasKey() assertInstanceOf() assertGreaterThanOrEqual() assertClassHasAttribute() assertInternalType() assertSelectEquals() assertClassHasStaticAttribute() assertJsonFileEqualsJsonFile() assertSelectRegExp() assertContains() assertJsonStringEqualsJsonFile() assertStringEndsWith() assertContainsOnly() assertJsonStringEqualsJsonString() assertStringEqualsFile() assertContainsOnlyInstancesOf() assertLessThan() assertStringStartsWith() assertCount() assertLessThanOrEqual() assertTag() assertEmpty() assertNull() assertThat() assertEqualXMLStructure() assertObjectHasAttribute() assertTrue() assertEquals() assertRegExp() assertXmlFileEqualsXmlFile() assertFalse() assertStringMatchesFormat() assertXmlStringEqualsXmlFile() assertFileEquals() assertStringMatchesFormatFile() assertXmlStringEqualsXmlString() assertFileExists() assertSame() assertGreaterThan() assertSelectCount()
  • 33. PHPUnit - Annotations PHPUnit, Annotation'lar kullanarak 巽eitli Aspect'leri 巽al脹t脹rabilir @author @group @backupGlobals @large @backupStaticAttributes @medium @codeCoverageIgnore* @preserveGlobalState @covers @requires @coversDefaultClass @runTestsInSeparateProcesses @coversNothing @runInSeparateProcess @dataProvider @small @depends @test @expectedException @testdox @expectedExceptionCode @ticket @expectedExceptionMessage
  • 34. PHPUnit - Code Coverage PHPUnit, XDebug kullanarak "code coverage" raporlar脹 端retebilir
  • 35. PHPUnit - Code Coverage
  • 36. PHPUnit - Mock'lama Unit test yazarken sadece ilgili birimi test etmeliyiz G端n端n sonunda, t端m birimler d端zg端n 巽al脹脹yorsa, integration test'e ge巽ebiliriz Bu birim d脹ar脹 ba脹ml脹 baka bir s脹n脹f kullan脹yorsa, onlar脹 Mock'lamal脹y脹z
  • 37. PHPUnit - Mock'lama class StubTest extends PHPUnit_Framework_TestCase { public function testStub() { // Create a stub for the SomeClass class. $stub = $this->getMock('SomeClass'); // Configure the stub. $stub->expects($this->any()) ->method('doSomething') ->will($this->returnValue('foo')); // Calling $stub->doSomething() will now return // 'foo'. $this->assertEquals('foo', $stub->doSomething()); } }
  • 38. Inversion Of Control - Dependency Injection Uygulama i巽indeki, nesne yaratma (instance oluturma) s端recinin sadece bu iten sorumlu bir birim taraf脹ndan kontrol edilmesi. Loosly Coupled ve daha test edilebilir kodlar 端retmek i巽in
  • 39. Inversion Of Control - Dependency Injection Uygulama i巽indeki, nesne yaratma (instance oluturma) s端recinin sadece bu iten sorumlu bir birim taraf脹ndan kontrol edilmesi. Loosly Coupled ve daha test edilebilir kodlar 端retmek i巽in class User { public function create() { $logger = new DatabaseLogger(); $logger->log("user created"); } }
  • 40. Inversion Of Control - Dependency Injection Uygulama i巽indeki, nesne yaratma (instance oluturma) s端recinin sadece bu iten sorumlu bir birim taraf脹ndan kontrol edilmesi. Loosly Coupled ve daha test edilebilir kodlar 端retmek i巽in class User { public function create() { //User s脹n脹f脹 DatabaseLogger'a 巽ok ba脹ml脹 $logger = new DatabaseLogger(); $logger->log("user created"); } }
  • 41. Inversion Of Control - Dependency Injection DatabaseLogger olmadan User s脹n脹f脹 巽al脹am脹yor Bir ad脹m ileri ta脹yarak, DatabaseLogger'a olan bal脹l脹脹 kald脹ral脹m
  • 42. Inversion Of Control - Dependency Injection DatabaseLogger olmadan User s脹n脹f脹 巽al脹am脹yor Bir ad脹m ileri ta脹yarak, DatabaseLogger'a olan bal脹l脹脹 kald脹ral脹m function kullanilacakLoggerSinifindanObjeUret () { return new DatabaseLogger(); } class User { public function create() { $logger = kullanilacakLoggerSinifindanObjeUret(); $logger->log("user created"); } }
  • 43. Inversion Of Control - Dependency Injection DatabaseLogger olmadan User s脹n脹f脹 巽al脹am脹yor Bir ad脹m ileri ta脹yarak, DatabaseLogger'a olan bal脹l脹脹 kald脹ral脹m function kullanilacakLoggerSinifindanObjeUret () { //D端nyan脹n en basit Dependency Injection Container'脹 return new DatabaseLogger(); } class User { public function create() { $logger = kullanilacakLoggerSinifindanObjeUret(); $logger->log("user created"); } }
  • 44. Inversion Of Control - Dependency Injection Ama hala bir sorun var ya bu fonksiyondan d旦nen objenin "log" diye methodu yoksa?
  • 45. Inversion Of Control - Dependency Injection Ama hala bir sorun var ya bu fonksiyondan d旦nen objenin "log" diye methodu yoksa? function kullanilacakLoggerSinifindanObjeUret () { //D端nyan脹n en basit Dependency Injection Container'脹 return new HodoLogger(); } class User { public function create() { $logger = kullanilacakLoggerSinifindanObjeUret(); $logger->log("user created"); } }
  • 46. Inversion Of Control - Dependency Injection Her Logger t端revinin "log" diye methodu olmal脹 Interface!!1 interface MyLoggerInterface { public function log($msg); } class HodoLogger implements MyLoggerInterface function kullanilacakLoggerSinifindanObjeUret () { $logger = new HodoLogger(); if (!$logger instanceOf MyLoggerInterface) { throw new Exception("HATA!!"); } return $logger; }
  • 47. Inversion Of Control - Dependency Injection Art脹k gelen logger objesinin log methodu olduundan emin olduk. Ama her s脹n脹f i巽in b旦yle sa巽ma methodlar m脹 yazaca脹z?
  • 48. Inversion Of Control - Dependency Injection Art脹k gelen logger objesinin log methodu olduundan emin olduk. Ama her s脹n脹f i巽in b旦yle sa巽ma methodlar m脹 yazaca脹z? Laravel IOC Container App::bind("myapplication.logger", function () { return new DatabaseLogger(); }); class User { public function create() { $logger = App::make("myapplication.logger"); $logger->log("user created"); } }
  • 50. Laravel'de Unit Testing testler app/tests alt脹nda bulunur test s脹n脹flar脹 *Test.php ile biten dosyalarda bulunur IlluminateFoundationTestingTestCase test'ler 巽al脹脹rken environment "testing" olarak set edilir burada ger巽ek ortamdan ayr脹lan ayarlar脹 girebilirsiniz
  • 51. Laravel'de Unit Testing - Route'lar脹 kontrol etme $response = $this->call('GET', 'user/profile'); $response = $this->action('GET', 'UserController@profile', array('user' => 1)); $crawler = $this->client->request('GET', '/');
  • 52. Laravel'de Unit Testing - Route'lar脹 kontrol etme $this->assertEquals('Hello World', $response->getContent()); $this->assertEquals('John', $view['name']); $this->assertTrue($this->client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));
  • 53. Laravel'de Unit Testing - Mocking Facades Laravel'de t端m Facade'lar Mockery ile Mock'lanabilir public function getIndex() { Event::fire('user.logged'); return 'Welcome!'; } public function testGetIndex() { Event::shouldReceive('fire')->once()->with('user.logged'); $this->call('GET', '/'); }
  • 54. Laravel'de Unit Testing - Mocking Mockery 聴stersek, Mockery kullanarak, kendi dependency'lerimizle test edebiliriz $mock = Mockery::mock('BizimLogger'); $mock->shouldReceive('log'); App::instance("myapplication.logger", $mock);
  • 55. Talk is cheap, show me the code! Giris isimli bir sayfamiz olsun Buraya yapilan GET isteklerinde, bir form g旦r端ns端n formun i巽inde kullan脹c脹n脹n ad脹n脹 girebilecei bir alan ve submit butonu olsun Kullan脹c脹 formu post ettiinde Eer isim "phptr" ise ekrana "Hibrit!!1" yazs脹n Deilse, "Giri yapan kullan脹c脹: KULLANICI_ADI" eklinde post edilen kullan脹c脹 ad脹n脹 yazs脹n "phptr" kullan脹c脹s脹n脹n her girii de log'lans脹n