SlideShare una empresa de Scribd logo
1 de 71
Descargar para leer sin conexión
PHPUnit Best Practices
Sebastian Bergmann                                                         July 22nd
 2010
Hello! My name is Sebastian.
Sebastian
 sebastian@thePHP.cc
Co-Founder of The PHP Consulting Company
 sebastian@phpunit.de
Creator and Main Developer of PHPUnit
 sebastian@php.net
Contributor to PHP
 sebastian@apache.org
Contributor to Zeta Components
 sbergmann@{acm.org | ieee.org}
Practitioner of academic computing
Hello! My name is Sebastian …
and this is what I do:
Get the help you need from the experts you trust.
Consulting | Code Review | Training
Some of these practices may be obvious to you.
Especially the first one :­)
Do not write tests that do not test anything
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testSomething()
{
$foo = new Foo;
$foo->doSomething(new Bar);
}
}
Best Practices for Writing Tests
Do not write tests that do not test anything
Best Practices for Writing Tests
sb@ubuntu ~ % phpunit FooTest
PHPUnit 3.5.0 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.75Mb
OK (1 test, 0 assertions)
Do not write tests that do not test anything
Best Practices for Writing Tests
sb@ubuntu ~ % phpunit FooTest
PHPUnit 3.5.0 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.75Mb
OK (1 test, 0 assertions)
Do not write tests that do not test anything
Best Practices for Writing Tests
sb@ubuntu ~ % phpunit --strict FooTest
PHPUnit 3.5.0 by Sebastian Bergmann.
I
Time: 0 seconds, Memory: 3.75Mb
OK, but incomplete or skipped tests!
Tests: 1, Assertions: 0, Incomplete: 1.
Do not write tests that do not test anything
Best Practices for Writing Tests
sb@ubuntu ~ % phpunit --strict --verbose FooTest
PHPUnit 3.5.0 by Sebastian Bergmann.
FooTest
I
Time: 0 seconds, Memory: 3.75Mb
There was 1 incomplete test:
1) FooTest::testSomething
This test did not perform any assertions
OK, but incomplete or skipped tests!
Tests: 1, Assertions: 0, Incomplete: 1.
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testSomething()
{
$foo = new Foo;
$this->assertEquals(
'something', $foo->doSomething(new Bar)
);
}
}
Best Practices for Writing Tests
Do not write tests that do not test anything
Best Practices for Writing Tests
sb@ubuntu ~ % phpunit FooTest
PHPUnit 3.5.0 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.75Mb
OK (1 test, 1 assertion)
Do not write tests that do not test anything
Best Practices for Writing Tests
Do not write tests that test too much
<?php
class StackTest extends PHPUnit_Framework_TestCase
{
public function testPushAndPopWorks()
{
$stack = array();
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
Best Practices for Writing Tests
Do not write tests that test too much
<?php
class StackTest extends PHPUnit_Framework_TestCase
{
public function testPushAndPopWorks()
{
$stack = array();
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
Best Practices for Writing Tests
Do not write tests that test too much
sb@ubuntu ~ % phpunit --testdox StackTest
PHPUnit 3.5.0 by Sebastian Bergmann.
Stack
[x] Push and pop works
Best Practices for Writing Tests
Do not write tests that test too much
sb@ubuntu ~ % phpunit --testdox StackTest
PHPUnit 3.5.0 by Sebastian Bergmann.
Stack
[x] Push and pop works
Best Practices for Writing Tests
Exploit dependencies between tests
<?php
class StackTest extends PHPUnit_Framework_TestCase
{
public function testStackIsInitiallyEmpty()
{
$stack = array();
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testStackIsInitiallyEmpty
*/
public function testPushingAnElementOntoTheStackWorks(array $stack)
{
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
return $stack;
}
/**
* @depends testPushingAnElementOntoTheStackWorks
*/
public function testPoppingAnElementOffTheStackWorks(array $stack)
{
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
Best Practices for Writing Tests
Exploit dependencies between tests
sb@ubuntu ~ % phpunit --testdox StackTest
PHPUnit 3.5.0 by Sebastian Bergmann.
Stack
[x] Stack is initially empty
[x] Pushing an element onto the stack works
[x] Popping an element off the stack works
Best Practices for Writing Tests
Exploit dependencies between tests
<?php
class StackTest extends PHPUnit_Framework_TestCase
{
public function testStackIsInitiallyEmpty()
{
$stack = array('foo');
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testStackIsInitiallyEmpty
*/
public function testPushingAnElementOntoTheStackWorks(array $stack)
{
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
return $stack;
}
/**
* @depends testPushingAnElementOntoTheStackWorks
*/
public function testPoppingAnElementOffTheStackWorks(array $stack)
{
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
Best Practices for Writing Tests
Exploit dependencies between tests
sb@ubuntu ~ % phpunit StackTest
PHPUnit 3.5.0 by Sebastian Bergmann.
FSS
Time: 0 seconds, Memory: 4.00Mb
There was 1 failure:
1) StackTest::testEmpty
Failed asserting that an array is empty.
/home/sb/StackTest.php:7
FAILURES!
Tests: 1, Assertions: 1, Failures: 1, Skipped: 2.
Best Practices for Writing Tests
Exploit dependencies between tests
sb@ubuntu ~ % phpunit --verbose StackTest
PHPUnit 3.5.0 by Sebastian Bergmann.
StackTest
FSS
Time: 0 seconds, Memory: 3.75Mb
There was 1 failure:
1) StackTest::testEmpty
Failed asserting that an array is empty.
/home/sb/StackTest.php:7
There were 2 skipped tests:
1) StackTest::testPush
This test depends on "StackTest::testEmpty" to pass.
2) StackTest::testPop
This test depends on "StackTest::testPush" to pass.
FAILURES!
Tests: 1, Assertions: 1, Failures: 1, Skipped: 2.
Use the most specific assertion available to express what you want to test
$this->assertEmpty($stack);
vs.
$this->assertTrue(empty($stack));
Best Practices for Writing Tests
Use the most specific assertion available to express what you want to test
$this->assertEmpty($stack);
vs.
$this->assertTrue(empty($stack));
$this->assertInstanceOf('Foo', $foo);
vs.
$this->assertTrue($foo instanceof Foo);
Best Practices for Writing Tests
Use the most specific assertion available to express what you want to test
$this->assertEmpty($stack);
vs.
$this->assertTrue(empty($stack));
$this->assertInstanceOf('Foo', $foo);
vs.
$this->assertTrue($foo instanceof Foo);
$this->assertInternalType('string', 'foo');
vs.
$this->assertTrue(is_string('foo'));
Best Practices for Writing Tests
Decouple test code from test data
<?php
class DataTest extends PHPUnit_Framework_TestCase
{
/**
* @dataProvider providerMethod
*/
public function testAdd($a, $b, $c)
{
$this->assertEquals($c, $a + $b);
}
public function providerMethod()
{
return array(
array(0, 0, 0),
array(0, 1, 1),
array(1, 1, 3),
array(1, 0, 1)
);
}
}
Best Practices for Writing Tests
Decouple test code from test data
Best Practices for Writing Tests
sb@ubuntu ~ % phpunit DataTest
PHPUnit 3.5.0 by Sebastian Bergmann.
..F.
Time: 0 seconds, Memory: 4.00Mb
There was 1 failure:
1) DataTest::testAdd with data set #2 (1, 1, 3)
Failed asserting that <integer:2> matches expected <integer:3>.
/home/sb/DataTest.php:9
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.
Best Practices for Organizing Tests
Object Tests
|-- Freezer |-- Freezer
| |-- HashGenerator | |-- HashGenerator
| | `-- NonRecursiveSHA1.php | | `-- NonRecursiveSHA1Test.php
| |-- HashGenerator.php | |
| |-- IdGenerator | |-- IdGenerator
| | `-- UUID.php | | `-- UUIDTest.php
| |-- IdGenerator.php | |
| |-- LazyProxy.php | |
| |-- Storage | |-- Storage
| | `-- CouchDB.php | | `-- CouchDB
| | | | |-- WithLazyLoadTest.php
| | | | `-- WithoutLazyLoadTest.php
| |-- Storage.php | |-- StorageTest.php
| `-- Util.php | `-- UtilTest.php
`-- Freezer.php `-- FreezerTest.php
Composing a Test Suite Using the Filesystem
Best Practices for Organizing Tests
sb@ubuntu ~ % phpunit Tests
PHPUnit 3.5.0 by Sebastian Bergmann.
............................................................ 60 / 75
...............
Time: 0 seconds, Memory: 11.00Mb
OK (75 tests, 164 assertions)
Running all tests in a directory
Best Practices for Organizing Tests
sb@ubuntu ~ % phpunit Tests/FreezerTest
PHPUnit 3.5.0 by Sebastian Bergmann.
............................
Time: 0 seconds, Memory: 8.25Mb
OK (28 tests, 60 assertions)
Running all tests of a test case class
Best Practices for Organizing Tests
sb@ubuntu ~ % phpunit --filter testFreezingAnObjectWorks Tests
PHPUnit 3.5.0 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 10.25Mb
OK (1 test, 2 assertions)
Filter tests based on name
Best Practices for Running Tests
Use an XML Configuration File
<?xml version="1.0" encoding="UTF-8"?>
<phpunit>
<testsuites>
<testsuite name="My Test Suite">
<directory>path/to/dir</directory>
</testsuite>
</testsuites>
</phpunit>
Best Practices for Running Tests
Use a bootstrap script
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="/path/to/bootstrap.php">
<testsuites>
<testsuite name="My Test Suite">
<directory>path/to/dir</directory>
</testsuite>
</testsuites>
</phpunit>
Best Practices for Running Tests
<?php
function __autoload($class)
{
require $class . '.php';
}
bootstrap.php
Best Practices for Running Tests
Configure the test suite using the XML configuration file
<?xml version="1.0" encoding="UTF-8"?>
<phpunit>
<php>
<const name="foo" value="bar"/>
<var name="foo" value="bar"/>
<ini name="foo" value="bar"/>
</php>
</phpunit>
Best Practices for Running Tests
Disable PHPUnit features (that you should not need anyway)
 Syntax Check
 Enabled by default in PHPUnit 3.4
 Disabled by default in PHPUnit 3.5
 Removed in PHPUnit 3.6
 Backup/Restore of global variables
 Enabled by default in PHPUnit 3.5
 Disabled by default in PHPUnit 3.6
 Backup/Restore of static attributes
 Disabled by default
Best Practices for Running Tests
Disable PHPUnit features (that you should not need anyway)
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
syntaxCheck="false">
<testsuites>
<testsuite name="My Test Suite">
<directory>path/to/dir</directory>
</testsuite>
</testsuites>
</phpunit>
Best Practices for Code Coverage
Use Code Coverage Whitelisting
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
syntaxCheck="false">
<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php">path/to/dir</directory>
</whitelist>
</filter>
</phpunit>
Best Practices for Code Coverage
Make the Code Coverage information more meaningful
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
/**
* @covers Foo::doSomething
*/
public function testSomething()
{
$foo = new Foo;
$this->assertEquals(
'something', $foo->doSomething(new Bar)
);
}
}
Best Practices for Code Coverage
Make the Code Coverage information more meaningful
<?php
/**
* @covers Foo
*/
class FooTest extends PHPUnit_Framework_TestCase
{
public function testSomething()
{
$foo = new Foo;
$this->assertEquals(
'something', $foo->doSomething(new Bar)
);
}
}
Best Practices for Code Coverage
Make the Code Coverage information more meaningful
<?xml version="1.0" encoding="UTF-8"?>
<phpunit mapTestClassNameToCoveredClassName="true">
</phpunit>
Best Practices for Code Coverage
Make the Code Coverage information more meaningful
<?xml version="1.0" encoding="UTF-8"?>
<phpunit forceCoversAnnotation="true">
</phpunit>
The following practices are not really Best Practices.
Not because they are bad, but because you should not need them.
Singletons
Singletons
<?php
class Singleton
{
private static $uniqueInstance = NULL;
protected function __construct() {}
private final function __clone() {}
public static function getInstance()
{
if (self::$uniqueInstance === NULL) {
self::$uniqueInstance = new Singleton;
}
return self::$uniqueInstance;
}
}
Default implementation of the Singleton pattern in PHP
Singletons
<?php
class Client
{
public function doSomething()
{
$singleton = Singleton::getInstance();
// ...
}
}
Client with hard-coded dependency on the singleton
Singletons
<?php
class Client
{
public function doSomething(Singleton $singleton = NULL)
{
if ($singleton === NULL) {
$singleton = Singleton::getInstance();
}
// ...
}
}
Client with optional dependency injection of the singleton
Singletons
<?php
class ClientTest extends PHPUnit_Framework_TestCase
{
public function testSingleton()
{
$singleton = $this->getMock(
'Singleton', /* name of class to mock */
array(), /* list of methods to mock */
array(), /* constructor arguments */
'', /* name for mocked class */
FALSE /* do not invoke constructor */
);
// ... configure $singleton ...
$client = new Client;
$client->doSomething($singleton);
// ...
}
}
Replacing the singleton with a test-specific equivalent
Singletons
<?php
class Singleton
{
private static $uniqueInstance = NULL;
protected function __construct() {}
private final function __clone() {}
public static function getInstance()
{
if (self::$uniqueInstance === NULL) {
self::$uniqueInstance = new Singleton;
}
return self::$uniqueInstance;
}
public static function reset() {
self::$uniqueInstance = NULL;
}
}
Alternative implementation of the Singleton pattern
Singletons
<?php
class Singleton
{
private static $uniqueInstance = NULL;
public static $testing = FALSE;
protected function __construct() {}
private final function __clone() {}
public static function getInstance()
{
if (self::$uniqueInstance === NULL ||
self::$testing) {
self::$uniqueInstance = new Singleton;
}
return self::$uniqueInstance;
}
}
Alternative implementation of the Singleton pattern
Registry
<?php
class Registry
{
private static $uniqueInstance = NULL;
protected $objects = array();
protected function __construct() {}
private final function __clone() {}
public static function getInstance() { /* … */ }
public function register($name, $object)
{
$this->objects[$name] = $object;
}
public function getObject($name)
{
if (isset($this->objects[$name])) {
return $this->objects[$name];
}
}
}
Registry
<?php
class ClientTest extends PHPUnit_Framework_TestCase
{
public function testSingleton()
{
$singleton = $this->getMock(
'Singleton', /* name of class to mock */
array(), /* list of methods to mock */
array(), /* constructor arguments */
'', /* name for mocked class */
FALSE /* do not invoke constructor */
);
// ... configure $singleton ...
Registry::getInstance()->register('Singleton', $singleton);
// ...
}
}
”Static methods are death to testability.”
– Miško Hevery
Static Methods
<?php
class Foo
{
public static function doSomething()
{
return self::helper();
}
public static function helper()
{
return 'foo';
}
}
?>
Static Methods
<?php
class Foo
{
public static function doSomething()
{
return self::helper();
}
public static function helper()
{
return 'foo';
}
}
class FooMock extends Foo
{
public static function helper()
{
return 'bar';
}
}
var_dump(FooMock::doSomething());
?>
string(3) "foo"
Early Static Binding
Static Methods
<?php
class Foo
{
public static function doSomething()
{
return static::helper();
}
public static function helper()
{
return 'foo';
}
}
class FooMock extends Foo
{
public static function helper()
{
return 'bar';
}
}
var_dump(FooMock::doSomething());
?>
string(3) "bar"
Late Static Binding (PHP 5.3)
Static Methods
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
}
}
Stubbing and Mocking (PHP 5.3 + PHPUnit 3.5)
Static Methods
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$class = $this->getMockClass(
'Foo', /* name of class to mock */
array('helper') /* list of methods to mock */
);
}
}
Stubbing and Mocking (PHP 5.3 + PHPUnit 3.5)
Static Methods
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$class = $this->getMockClass(
'Foo', /* name of class to mock */
array('helper') /* list of methods to mock */
);
$class::staticExpects($this->any())
->method('helper')
->will($this->returnValue('bar'));
}
}
Stubbing and Mocking (PHP 5.3 + PHPUnit 3.5)
Static Methods
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$class = $this->getMockClass(
'Foo', /* name of class to mock */
array('helper') /* list of methods to mock */
);
$class::staticExpects($this->any())
->method('helper')
->will($this->returnValue('bar'));
$this->assertEquals(
'bar', $class::doSomething()
);
}
}
Stubbing and Mocking (PHP 5.3 + PHPUnit 3.5)
Static Methods
… are death to testability.
<?php
class Foo
{
public static function doSomething()
{
return Bar::helper();
}
}
class Bar
public static function helper()
{
/* ... */
}
}
class BarMock extends Bar
{
public static function helper()
{
return 'baz';
}
}
We cannot stub/mock
this static method call!
Testing What Should Not Be Tested
Non-Public Attributes and Methods
Testing What Should Not Be Tested
<?php
class Foo
{
private $bar = 'baz';
public function doSomething()
{
return $this->bar = $this->doSomethingPrivate();
}
private function doSomethingPrivate()
{
return 'blah';
}
}
A class with private attributes and methods
Testing What Should Not Be Tested
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testPrivateAttribute()
{
$this->assertEquals(
'baz',
$this->readAttribute(new Foo, 'bar')
);
}
}
Assertions on non-public attributes
Testing What Should Not Be Tested
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testPrivateAttribute()
{
$this->assertAttributeEquals(
'baz', /* expected value */
'bar', /* attribute name */
new Foo /* object */
);
}
}
Assertions on non-public attributes
Testing What Should Not Be Tested
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
public function testPrivateMethod()
{
$method = new ReflectionMethod(
'Foo', 'doSomethingPrivate'
);
$method->setAccessible(TRUE);
$this->assertEquals(
'blah', $method->invoke(new Foo)
);
}
}
Testing a non-public method (requires PHP 5.3.2)
Testable Code
”The secret in testing is
in writing testable code”
              ­ Miško Hevery
Avoid the hell that is global state.
This includes singletons and static methods.
Use loosely coupled objects …
Use loosely coupled objects …
… and dependency injection to wire them together.
Write short methods.
The End
 Web: http://thePHP.cc/
http://sebastian-bergmann.de/
 Mail: sebastian@thePHP.cc
 Twitter: @s_bergmann
 Slides: http://talks.thePHP.cc/
 Buy the book: http://phpqabook.com/

Más contenido relacionado

La actualidad más candente

Unit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDUnit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDPaweł Michalik
 
Unit Testing Presentation
Unit Testing PresentationUnit Testing Presentation
Unit Testing Presentationnicobn
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitMichelangelo van Dam
 
Mocking Dependencies in PHPUnit
Mocking Dependencies in PHPUnitMocking Dependencies in PHPUnit
Mocking Dependencies in PHPUnitmfrost503
 
Beginning PHPUnit
Beginning PHPUnitBeginning PHPUnit
Beginning PHPUnitJace Ju
 
Unit Testng with PHP Unit - A Step by Step Training
Unit Testng with PHP Unit - A Step by Step TrainingUnit Testng with PHP Unit - A Step by Step Training
Unit Testng with PHP Unit - A Step by Step TrainingRam Awadh Prasad, PMP
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applicationschartjes
 
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)ENDelt260
 
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEnterprise PHP Center
 
Testing Code and Assuring Quality
Testing Code and Assuring QualityTesting Code and Assuring Quality
Testing Code and Assuring QualityKent Cowgill
 
Test Driven Development With Python
Test Driven Development With PythonTest Driven Development With Python
Test Driven Development With PythonSiddhi
 
Effective testing with pytest
Effective testing with pytestEffective testing with pytest
Effective testing with pytestHector Canto
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Michelangelo van Dam
 
UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013Michelangelo van Dam
 
Test in action week 2
Test in action   week 2Test in action   week 2
Test in action week 2Yi-Huan Chan
 
Python Unit Test
Python Unit TestPython Unit Test
Python Unit TestDavid Xie
 

La actualidad más candente (20)

Unit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDUnit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDD
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
 
Unit Testing Presentation
Unit Testing PresentationUnit Testing Presentation
Unit Testing Presentation
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnit
 
Phpunit testing
Phpunit testingPhpunit testing
Phpunit testing
 
Mocking Dependencies in PHPUnit
Mocking Dependencies in PHPUnitMocking Dependencies in PHPUnit
Mocking Dependencies in PHPUnit
 
Beginning PHPUnit
Beginning PHPUnitBeginning PHPUnit
Beginning PHPUnit
 
Unit Testng with PHP Unit - A Step by Step Training
Unit Testng with PHP Unit - A Step by Step TrainingUnit Testng with PHP Unit - A Step by Step Training
Unit Testng with PHP Unit - A Step by Step Training
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
 
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
 
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
 
PHPUnit testing to Zend_Test
PHPUnit testing to Zend_TestPHPUnit testing to Zend_Test
PHPUnit testing to Zend_Test
 
Unit testing
Unit testingUnit testing
Unit testing
 
Testing Code and Assuring Quality
Testing Code and Assuring QualityTesting Code and Assuring Quality
Testing Code and Assuring Quality
 
Test Driven Development With Python
Test Driven Development With PythonTest Driven Development With Python
Test Driven Development With Python
 
Effective testing with pytest
Effective testing with pytestEffective testing with pytest
Effective testing with pytest
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013
 
UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013
 
Test in action week 2
Test in action   week 2Test in action   week 2
Test in action week 2
 
Python Unit Test
Python Unit TestPython Unit Test
Python Unit Test
 

Destacado

Unit Testing Concepts and Best Practices
Unit Testing Concepts and Best PracticesUnit Testing Concepts and Best Practices
Unit Testing Concepts and Best PracticesDerek Smith
 
Testing with laravel
Testing with laravelTesting with laravel
Testing with laravelDerek Binkley
 
Ioc & in direction
Ioc & in directionIoc & in direction
Ioc & in direction育汶 郭
 
2007 5 30 肖镜辉 统计语言模型简介
2007 5 30 肖镜辉 统计语言模型简介2007 5 30 肖镜辉 统计语言模型简介
2007 5 30 肖镜辉 统计语言模型简介xceman
 
PHP Unit-Testing With Doubles
PHP Unit-Testing With DoublesPHP Unit-Testing With Doubles
PHP Unit-Testing With DoublesMihail Irintchev
 
Google blogger 教學
Google blogger 教學Google blogger 教學
Google blogger 教學鈺棠 徐
 
CSS入門教學
CSS入門教學CSS入門教學
CSS入門教學鈺棠 徐
 
A month by month guide to On Hold Marketing for Restaurants and Hospitality.
A month by month guide to On Hold Marketing for Restaurants and Hospitality.A month by month guide to On Hold Marketing for Restaurants and Hospitality.
A month by month guide to On Hold Marketing for Restaurants and Hospitality.Advitel_crow_greencm15
 
Linux 教育訓練
Linux 教育訓練Linux 教育訓練
Linux 教育訓練Bo-Yi Wu
 
PHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにPHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにYuya Takeyama
 
Testing and TDD - Laravel and Express Examples
Testing and TDD - Laravel and Express ExamplesTesting and TDD - Laravel and Express Examples
Testing and TDD - Laravel and Express ExamplesDragos Strugar
 
Passing The Joel Test In The PHP World
Passing The Joel Test In The PHP WorldPassing The Joel Test In The PHP World
Passing The Joel Test In The PHP WorldLorna Mitchell
 
Cake php + php unitによる実践的ユニットテスト
Cake php + php unitによる実践的ユニットテストCake php + php unitによる実践的ユニットテスト
Cake php + php unitによる実践的ユニットテスト慶信 若松
 

Destacado (20)

Unit Testing Concepts and Best Practices
Unit Testing Concepts and Best PracticesUnit Testing Concepts and Best Practices
Unit Testing Concepts and Best Practices
 
Testing with laravel
Testing with laravelTesting with laravel
Testing with laravel
 
Codeception
CodeceptionCodeception
Codeception
 
Laravel Unit Testing
Laravel Unit TestingLaravel Unit Testing
Laravel Unit Testing
 
Ioc & in direction
Ioc & in directionIoc & in direction
Ioc & in direction
 
IoC with PHP
IoC with PHPIoC with PHP
IoC with PHP
 
2007 5 30 肖镜辉 统计语言模型简介
2007 5 30 肖镜辉 统计语言模型简介2007 5 30 肖镜辉 统计语言模型简介
2007 5 30 肖镜辉 统计语言模型简介
 
Stub you!
Stub you!Stub you!
Stub you!
 
PHP Unit-Testing With Doubles
PHP Unit-Testing With DoublesPHP Unit-Testing With Doubles
PHP Unit-Testing With Doubles
 
Why react matters
Why react mattersWhy react matters
Why react matters
 
Google blogger 教學
Google blogger 教學Google blogger 教學
Google blogger 教學
 
CSS入門教學
CSS入門教學CSS入門教學
CSS入門教學
 
A month by month guide to On Hold Marketing for Restaurants and Hospitality.
A month by month guide to On Hold Marketing for Restaurants and Hospitality.A month by month guide to On Hold Marketing for Restaurants and Hospitality.
A month by month guide to On Hold Marketing for Restaurants and Hospitality.
 
Linux 教育訓練
Linux 教育訓練Linux 教育訓練
Linux 教育訓練
 
Introducing PostCSS
Introducing PostCSSIntroducing PostCSS
Introducing PostCSS
 
jQuery入門
jQuery入門jQuery入門
jQuery入門
 
PHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにPHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くために
 
Testing and TDD - Laravel and Express Examples
Testing and TDD - Laravel and Express ExamplesTesting and TDD - Laravel and Express Examples
Testing and TDD - Laravel and Express Examples
 
Passing The Joel Test In The PHP World
Passing The Joel Test In The PHP WorldPassing The Joel Test In The PHP World
Passing The Joel Test In The PHP World
 
Cake php + php unitによる実践的ユニットテスト
Cake php + php unitによる実践的ユニットテストCake php + php unitによる実践的ユニットテスト
Cake php + php unitによる実践的ユニットテスト
 

Similar a PHPUnit Best Practices for Writing Tests

Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit TestingMike Lively
 
Php Unit With Zend Framework Zendcon09
Php Unit With Zend Framework   Zendcon09Php Unit With Zend Framework   Zendcon09
Php Unit With Zend Framework Zendcon09Michelangelo van Dam
 
Fighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitFighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitJames Fuller
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Michelangelo van Dam
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Michelangelo van Dam
 
2010 07-28-testing-zf-apps
2010 07-28-testing-zf-apps2010 07-28-testing-zf-apps
2010 07-28-testing-zf-appsVenkata Ramana
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownpartsBastian Feder
 
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitinternational PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitsmueller_sandsmedia
 
PHPunit and you
PHPunit and youPHPunit and you
PHPunit and youmarkstory
 
Test in action week 4
Test in action   week 4Test in action   week 4
Test in action week 4Yi-Huan Chan
 
Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Mark Niebergall
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastWorkshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastMichelangelo van Dam
 
Unit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentUnit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentMark Niebergall
 
Developer testing 101: Become a Testing Fanatic
Developer testing 101: Become a Testing FanaticDeveloper testing 101: Become a Testing Fanatic
Developer testing 101: Become a Testing FanaticLB Denker
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everythingnoelrap
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxMichelangelo van Dam
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11Michelangelo van Dam
 

Similar a PHPUnit Best Practices for Writing Tests (20)

Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit Testing
 
Php Unit With Zend Framework Zendcon09
Php Unit With Zend Framework   Zendcon09Php Unit With Zend Framework   Zendcon09
Php Unit With Zend Framework Zendcon09
 
Fighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnitFighting Fear-Driven-Development With PHPUnit
Fighting Fear-Driven-Development With PHPUnit
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
2010 07-28-testing-zf-apps
2010 07-28-testing-zf-apps2010 07-28-testing-zf-apps
2010 07-28-testing-zf-apps
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnitinternational PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
 
PHPunit and you
PHPunit and youPHPunit and you
PHPunit and you
 
Test in action week 4
Test in action   week 4Test in action   week 4
Test in action week 4
 
Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastWorkshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
 
Unit Testing from Setup to Deployment
Unit Testing from Setup to DeploymentUnit Testing from Setup to Deployment
Unit Testing from Setup to Deployment
 
Developer testing 101: Become a Testing Fanatic
Developer testing 101: Become a Testing FanaticDeveloper testing 101: Become a Testing Fanatic
Developer testing 101: Become a Testing Fanatic
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
 
Phpunit
PhpunitPhpunit
Phpunit
 
Unit testing
Unit testingUnit testing
Unit testing
 
Unit testing zend framework apps
Unit testing zend framework appsUnit testing zend framework apps
Unit testing zend framework apps
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 

Último

Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Christo Ananth
 
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxBSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxfenichawla
 
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Christo Ananth
 
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...roncy bisnoi
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduitsrknatarajan
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Call Girls in Nagpur High Profile
 
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTINGMANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTINGSIVASHANKAR N
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdfKamal Acharya
 
result management system report for college project
result management system report for college projectresult management system report for college project
result management system report for college projectTonystark477637
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfKamal Acharya
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...ranjana rawat
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdfankushspencer015
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...Call Girls in Nagpur High Profile
 
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINEMANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINESIVASHANKAR N
 

Último (20)

Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
 
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxBSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
 
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
 
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduits
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTINGMANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
 
Roadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and RoutesRoadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and Routes
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
result management system report for college project
result management system report for college projectresult management system report for college project
result management system report for college project
 
Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdf
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
 
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
 
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINEMANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
 

PHPUnit Best Practices for Writing Tests