A lot of people using PHPunit for testing their source code. While I was observing my team I recognized most of them are only using the standard assertions like 'assertEquals()' and are complaining about how hard it is to test the code even when the tests are written first. This talk is about all the stuff not used on a daily basis and it digs deep into uncommon features of PHPUnit.
phpunit is testing framework for php testing.
A browser is able to give the syntax error but what if in case of some logical error.
Phpunit testing enables you to check your logic.
It is fully object oriented framework.
It also can be enabled in Netbeans.
you can find the option of phpunit testing in Netbeans
A lot of people using PHPunit for testing their source code. While I was observing my team I recognized most of them are only using the standard assertions like 'assertEquals()' and are complaining about how hard it is to test the code even when the tests are written first. This talk is about all the stuff not used on a daily basis and it digs deep into uncommon features of PHPUnit.
phpunit is testing framework for php testing.
A browser is able to give the syntax error but what if in case of some logical error.
Phpunit testing enables you to check your logic.
It is fully object oriented framework.
It also can be enabled in Netbeans.
you can find the option of phpunit testing in Netbeans
Unit testing, everyone talks about it and wants to do it but never gets around to actually start testing. Complex spaghetti code and time / budget pressures are often the reasons why nobody dives in and gets started with testing. But when the application breaks, and people loose money or worse it's often too late.
In this talk I will take you on a journey with real examples that will show you how you can set up your tests, how to test complex situations with legacy spaghetti code, test web services, database interactions and how to gradually build a solid foundation to safeguard the core code base and everything around it.
Don't you want to be confident when you walk out the office?
Everyone talks about raising the bar on quality of code, but it's always hard to start implementing it when you have no clue where to start. With this talk I'm shooing that there are many levels developers can improve themselves by using the right tools. In this talk I'll go over each tool with examples how to use them against your codebase. A must attend talk for every developer that wants to scale up their quality. Most PHP developers deploy code that does what the customer requested but they don't have a clue about the quality of the product they deliver. Without this knowledge, maintenance can be a hell and very expensive. In this workshop I cover unit testing, code measuring, performance testing, debugging and profiling and give tips and tricks how to continue after this workshop.
Nothing is as frustrated as deploying a new release of your web application to find out functionality you had doesn't work anymore. Of course you have all your unit tests in place and you run them through your CI environment, but nothing prepared you to a failing javascript error or a link that doesn't work anymore. Welcome to User Acceptance testing or UAT. Before you start putting real people in front of your application, create macros and export them as PHPUnit test classes. Then run them in an automated way just like your unit tests and hook them into your CI. In this talk I will show you how easy it is to create Selenium macros that can be converted into PHPUnit scripts and run automatically on different virtual machines (VM's) so you can test all different browsers on a diversity of operating systems.
This workshop is a hands-on training where a real Zend Framework application is used as an example to start improving QA using tools to test, document and perform software metric calculations to indicate where the software can be improved. I also explain the reports produced by a CI system.
Test your code like a pro - PHPUnit in practiceSebastian Marek
The day you realised that you can’t really tell what your code does is the day you stop being an amateur programmer and you turn into a professional developer. During this workshop you will learn about the most famous unit testing framework – PHPUnit, how it can help you gain confidence in your code and what to do (and what to avoid) to make your code testable. We will discuss unit testing best practices and talk about tools that can help you automate the whole process, so it becomes more of a habit then a necessity.
Unit testing with PHPUnit - there's life outside of TDDPaweł Michalik
Basics of PHPUnit and why is it even more relevant in legacy code. Key points of the framework are explained, along with mocking objects, test organisation, creating documentations with tests and accessing non-public objects (where applicable).
Live version with additional notes available at: http://pawelmichalik.net/presentations/unit-testing-with-phpunit?showNotes=true
Prezentacja dostępna także w języku polskim: http://pawelmichalik.net/prezentacje/testy-jednostkowe-w-phpunit?showNotes=true
This presentation would help learn how to install, integrate, write automated test script with PHPUnit.Would also involve looking into different example and execute them.
Diving into HHVM Extensions (PHPNW Conference 2015)James Titcumb
HHVM is currently gaining popularity at quite a pace, and it's a pretty exciting time for PHP runtimes. Have you ever wondered what is going on beneath this slick and super-speedy engine? I wondered that myself, so I dived into the internals of HHVM, discovering a treasure trove of awesome stuff. In this talk, I'll show you how HHVM itself works with a guided tour of the codebase, demonstrating how it all pieces together. I'll also show you a couple of ways to write your own incredible HHVM extension. You don't need to know C++ to understand this talk - just PHP language knowledge is enough.
Everyone talks about raising the bar on the quality of code, but it’s hard to implement when you have no clue where to start. This talk is geared toward all levels of developers, and will teach you how to improve by using the right tools effectively – a must-attend for any PHP developer who wants to scale up their quality.
Michelangelo will tell us about Quality Assurance for PHP in general and show how different QA-related actions can be performed using PhpStorm IDE. The webinar will cover topics including:
Revision control
Syntax checking
Code documentation
Unit Testing with PHPUnit
Measuring code health with a variety of tools
Profiling and debugging with Xdebug
Automation with Phing
Team work and more.
Unit testing, everyone talks about it and wants to do it but never gets around to actually start testing. Complex spaghetti code and time / budget pressures are often the reasons why nobody dives in and gets started with testing. But when the application breaks, and people loose money or worse it's often too late.
In this talk I will take you on a journey with real examples that will show you how you can set up your tests, how to test complex situations with legacy spaghetti code, test web services, database interactions and how to gradually build a solid foundation to safeguard the core code base and everything around it.
Don't you want to be confident when you walk out the office?
Everyone talks about raising the bar on quality of code, but it's always hard to start implementing it when you have no clue where to start. With this talk I'm shooing that there are many levels developers can improve themselves by using the right tools. In this talk I'll go over each tool with examples how to use them against your codebase. A must attend talk for every developer that wants to scale up their quality. Most PHP developers deploy code that does what the customer requested but they don't have a clue about the quality of the product they deliver. Without this knowledge, maintenance can be a hell and very expensive. In this workshop I cover unit testing, code measuring, performance testing, debugging and profiling and give tips and tricks how to continue after this workshop.
Nothing is as frustrated as deploying a new release of your web application to find out functionality you had doesn't work anymore. Of course you have all your unit tests in place and you run them through your CI environment, but nothing prepared you to a failing javascript error or a link that doesn't work anymore. Welcome to User Acceptance testing or UAT. Before you start putting real people in front of your application, create macros and export them as PHPUnit test classes. Then run them in an automated way just like your unit tests and hook them into your CI. In this talk I will show you how easy it is to create Selenium macros that can be converted into PHPUnit scripts and run automatically on different virtual machines (VM's) so you can test all different browsers on a diversity of operating systems.
This workshop is a hands-on training where a real Zend Framework application is used as an example to start improving QA using tools to test, document and perform software metric calculations to indicate where the software can be improved. I also explain the reports produced by a CI system.
Test your code like a pro - PHPUnit in practiceSebastian Marek
The day you realised that you can’t really tell what your code does is the day you stop being an amateur programmer and you turn into a professional developer. During this workshop you will learn about the most famous unit testing framework – PHPUnit, how it can help you gain confidence in your code and what to do (and what to avoid) to make your code testable. We will discuss unit testing best practices and talk about tools that can help you automate the whole process, so it becomes more of a habit then a necessity.
Unit testing with PHPUnit - there's life outside of TDDPaweł Michalik
Basics of PHPUnit and why is it even more relevant in legacy code. Key points of the framework are explained, along with mocking objects, test organisation, creating documentations with tests and accessing non-public objects (where applicable).
Live version with additional notes available at: http://pawelmichalik.net/presentations/unit-testing-with-phpunit?showNotes=true
Prezentacja dostępna także w języku polskim: http://pawelmichalik.net/prezentacje/testy-jednostkowe-w-phpunit?showNotes=true
This presentation would help learn how to install, integrate, write automated test script with PHPUnit.Would also involve looking into different example and execute them.
Diving into HHVM Extensions (PHPNW Conference 2015)James Titcumb
HHVM is currently gaining popularity at quite a pace, and it's a pretty exciting time for PHP runtimes. Have you ever wondered what is going on beneath this slick and super-speedy engine? I wondered that myself, so I dived into the internals of HHVM, discovering a treasure trove of awesome stuff. In this talk, I'll show you how HHVM itself works with a guided tour of the codebase, demonstrating how it all pieces together. I'll also show you a couple of ways to write your own incredible HHVM extension. You don't need to know C++ to understand this talk - just PHP language knowledge is enough.
Everyone talks about raising the bar on the quality of code, but it’s hard to implement when you have no clue where to start. This talk is geared toward all levels of developers, and will teach you how to improve by using the right tools effectively – a must-attend for any PHP developer who wants to scale up their quality.
Michelangelo will tell us about Quality Assurance for PHP in general and show how different QA-related actions can be performed using PhpStorm IDE. The webinar will cover topics including:
Revision control
Syntax checking
Code documentation
Unit Testing with PHPUnit
Measuring code health with a variety of tools
Profiling and debugging with Xdebug
Automation with Phing
Team work and more.
Can't Miss Features of PHP 5.3 and 5.4Jeff Carouth
If you're like me you remember the days of PHP3 and PHP4; you remember when PHP5 was released, and how it was touted to change to your life. It's still changing and there are some features of PHP 5.3 and new ones coming with PHP 5.4 that will improve your code readability and reusability. Let's look at some touted features such as closures, namespaces, and traits, as well as some features being discussed for future releases.
Practical tips for dealing with projects involving legacy code. Covers investigating past projects, static analysis of existing code, and methods for changing legacy code.
Presented at PHP Benelux '10
Review unknown code with static analysis - bredaphpDamien Seguy
Code quality is not just for christmas, it is a daily part of the job. So, what do you do when you're handed with a five feet long pole a million lines of code that must be vetted ? You call static analysis to the rescue. During one hour, we'll be reviewing totally unknown code code : no name, no usage, not a clue. We'll apply a wide range of tools, reaching for anything that helps us understand the code and form an opinion on it. Can we break this mystery and learn how everyone else is looking at our code ?
Even nowadays, PHP code is mostly manually audited. Expert pore over actual code, in search for bugs or code smells. Actually, it is possible to have PHP do this work itself ! Strengthened with the internal Tokenizer, bolstered by the manual, it is able to scan thousands of lines of code, without getting bored, and bringing pragmatic pieces of wisdom: official manual recommendations, version migration, code pruning and security. In the end, it deliver a global overview of the code, without reading it.
Learn how to write scripted load tests in PHP to run against your system without breaking the bank. Jason will cover not only the importance of load testing, but share stories of how load tests uncovered problems that would otherwise not have been discovered until production. Also, learn how to use load testing to learn how to deal with large traffic sites without needing to be employed by a large scale site first. We’ll be using RedLine13, an almost free load testing tool that is at the same time inexpensive, easy, and effective.
Best Practices in Plugin Development (WordCamp Seattle)andrewnacin
My talk -- officially named "Y U NO CODE WELL" -- at WordCamp Seattle 2011 on best practices during plugin development. Find the video, as it provides some good context and conversation.
15. public function testSaveUpdatesDatabase()
{
$mapper = new IBLFranchiseMapper($this->_conn);
$franchise = new IBLFranchise();
$franchise->setId(25);
$franchise->setNickname('TST');
$franchise->setName('Test Team');
$franchise->setConference('Conference');
$franchise->setDivision('Division');
$franchise->setIp(0);
$mapper->save($franchise);
// Update existing model
$franchise->setIp(35);
$mapper->save($franchise);
// Reload Franchise record and compare them
$franchise2 = $mapper->findById($franchise->getId());
$this->assertEquals(35, $franchise2->getIp());
// Clean up the franchise
$mapper->delete($franchise);
}
16. My preferred
Behaviour-Driven
Development framework
17. Feature: ls
In order to see the directory structure
As a UNIX user
I need to be able to list the current
directory's contents
Scenario: List 2 files in a directory
Given I am in a directory "test"
And I have a file named "foo"
And I have a file named "bar"
When I run "ls"
Then I should get:
"""
bar
foo
"""
18. Excuses are like
nipples, everyone has
at least one
“Writing tests will slow me down.”
“Why can’t we just manually test in the browser?”
“I’d be done with this already if I didn’t have to
write the tests!”
19. “A project using TDD would take 20 to 40%
longer to complete but resulted in 40 to 90%
fewer bugs discovered in production.”
http://www.infoq.com/news/2009/03/TDD-Improves-Quality
26. PHP Code Sniffer
Enforcement of code to expected standard
Create your own “code sniffs” if required
Great if team having problems with consistency
27. chartjes@yggdrasil [09:39:37] [~/Sites/local.ibl/lib/ibl] [master *]
-> % phpcs FranchiseMapper.php
FILE: /Users/chartjes/Sites/local.ibl/lib/ibl/FranchiseMapper.php
FOUND 13 ERROR(S) AND 5 WARNING(S) AFFECTING 18 LINE(S)
2 | ERROR | Missing file doc comment
5 | ERROR | Missing class doc comment
6 | ERROR | Expected 0 spaces before opening brace; 1 found
10 | ERROR | You must use "/**" style comments for a function comment
| Missing function doc comment
15 | WARNING | Line exceeds 85 characters; contains 86 characters
20 | ERROR | Missing function doc comment
36 | ERROR | Missing function doc comment
53 | ERROR | Missing function doc comment
74 | ERROR | Missing function doc comment
95 | ERROR | Missing function doc comment
139 | WARNING | Line exceeds 85 characters; contains 90 characters
142 | WARNING | Line exceeds 85 characters; contains 181 characters
149 | ERROR | Missing function doc comment
152 | WARNING | Line exceeds 85 characters; contains 117 characters
154 | WARNING | Line exceeds 85 characters; contains 86 characters
28. PHP Mess Detector
Identifies code that is complex
Make suggestions on changes
29. > % phpmd lib/vendor/Moontoast/RpcApi.php text
codesize,design,naming,unusedcode
RpcApi.php:12 The class RpcApi has an overall complexity of 77 which
is very high. The configured complexity threshold is 50
high. The configured complexity threshold is 50.
RpcApi.php:12 The class RpcApi has a coupling between objects value
of 14. Consider to reduce to number of dependencies under 13
RpcApi.php:27 Avoid unused parameters such as '$params'.
RpcApi.php:114 The method getProduct() has a Cyclomatic Complexity of 14.
RpcApi.php:114 The method getProduct() has an NPath complexity of 655.
RpcApi.php:114 Avoid really long methods.
RpcApi.php:114 Avoid variables with short names like $id
RpcApi.php:234 Avoid unused parameters such as '$params'.
RpcApi.php:282 The method getStore() has a Cyclomatic Complexity of 12.
RpcApi.php:282 Avoid really long methods.
RpcApi.php:302 Avoid unused local variables such as '$price'.
RpcApi.php:303 Avoid unused local variables such as '$previousPrice'.
RpcApi.php:398 Avoid unused parameters such as '$csc'
RpcApi.php:477 The method saveCart() has a Cyclomatic Complexity of 26
RpcApi.php:477 Avoid really long methods
RpcApi.php:477 Avoid variables with short names like $id
RpcApi.php:477 Avoid excessively long variable names like
$useBillingForShipping
RpcApi.php:588 The method saveCart() has an NPath complexity of 5644802.
RpcApi.php:608 Avoid excessively long variable names like
$shippingAddressObject
RpcApi.php:671 Avoid unused local variables such as '$gateway'.
RpcApi.php:702 Avoid variables with short names like $q
RpcApi.php:707 Avoid variables with short names like $mm
30. PHP Copy Paster Detector
Just how lazy are you and your team?
31. -> % phpcpd lib/services/AMF_Checkout.php
phpcpd 1.3.3 by Sebastian Bergmann.
Found 2 exact clones with 52 duplicated lines
in 1 files:
- AMF_Checkout.php:60-68
AMF_Checkout.php:576-584
- AMF_Checkout.php:88-132
AMF_Checkout.php:602-646
7.21% duplicated lines out of 721 total lines
of code.
Time: 0 seconds, Memory: 6.50Mb
32. The Law of Demeter
The Law of Demeter for functions
states that any method of an object
should call only methods belonging to
itself, any parameters that were passed
in to the method, any objects it
created, and any directly held
component objects.
(from the best book EVER for programmers
“The Pragmatic Programmer”)
35. <?php
include 'test_bootstrap.php';
class FranchiseModelTest extends PHPUnit_Framework_TestCase
{
protected $_conn;
public function setUp()
{
$this->_conn = new PDO('pgsql:host=localhost;dbname=ibl_stats', 'stats', 'st@ts=Fun');
}
public function tearDown()
{
unset($this->_conn);
}
public function testSaveUpdatesDatabase()
{
$mapper = new IBLFranchiseMapper($this->_conn);
$franchise = new IBLFranchise();
$franchise->setId(25);
$franchise->setNickname('TST');
$franchise->setName('Test Team');
$franchise->setConference('Conference');
$franchise->setDivision('Division');
$franchise->setIp(0);
$mapper->save($franchise);
// Update existing model
$franchise->setIp(35);
$mapper->save($franchise);
// Reload Franchise record and compare them
$franchise2 = $mapper->findById($franchise->getId());
$this->assertEquals(35, $franchise2->getIp());
// Clean up the franchise
$mapper->delete($franchise);
}
}
36. public function save(IBLFranchise $franchise)
{
if ($this->findById($franchise->getId())) {
$this->_update($franchise);
} else {
$this->_insert($franchise);
}
}
protected function _insert(IBLFranchise $franchise)
{
try {
$sql = "
INSERT INTO franchises
(nickname, name, conference, division, ip, id)
VALUES(?, ?, ?, ?, ?, ?)";
$sth = $this->_conn->prepare($sql);
$binds = array(
$franchise->getNickname(),
$franchise->getName(),
$franchise->getConference(),
$franchise->getDivision(),
$franchise->getIp(),
$franchise->getId()
);
$sth->execute($binds);
} catch(PDOException $e) {
echo "A database problem occurred: " . $e-
>getMessage();
}
}
37. <?php
namespace Grumpy;
class Acl {
protected $_acls;
...
public function accessAlllowed()
{
$request = GrumpyContext::getRequest();
return ($this->_acls[$request->getUri()]
>= $_SESSION['user_level']);
}
}
// Meanwhile inside your controller
$acl = new GrumpyAcl();
if (!$acl->accessAllowed()) {
GrumpyView::render('access_denied.tmpl');
} else {
GrumpyView::render('show_stolen_cc.tmpl');
}
38. <?php
namespace Grumpy;
class Acl {
protected $_acls;
protected $_request;
protected $_userLevel;
...
public function __construct($request, $userLevel)
{
...
$this->_request = $request;
$this->_request = $userLevel;
}
public function accessAlllowed()
{
return ($this->_acls[$this->_request->getUri()]
>= $this->_userLevel);
}
}
// Meanwhile inside your controller
$acl = new GrumpyAcl();
if (!$acl->accessAllowed()) {
GrumpyView::render('access_denied.tmpl');
} else {
GrumpyView::render('show_stolen_cc.tmpl');
}
41. <?php
// Inside our bootstrap
...
// Create our container
$container = new Pimple();
// Inject our DB connection object for later reuse
$container['db_connection'] = function ($c) {
return new PDO(
'pgsql:host=localhost;dbname=ibl_stats',
'stats',
'st@ts=Fun'
);
};
// Then in a controller somewhere...
$mapper = new IBLFranchiseMapper($container['db_connection']);
42. <?php
// In the bootstrap, after having already added
// in the database connection
$container['franchise_mapper'] = function ($c) {
return new IBLFranchiseMapper($c['db_container']);
};
$container['game_mapper'] = function ($c) {
return new IBLGameMapper($c['db_container']);
};
43.
44. <?php
class Omega
{
protected $foo;
protected $bar;
protected $bizz;
public function __construct($foo, $bar, $bizz)
{
$this->foo = $foo;
$this->bar = $bar;
$this->bizz = $bizz;
}
}
$dep1 = new Foo();
$dep2 = new Bar();
$dep3 = new Bizz();
$newOmega = new Omega($dep1, $dep2, $dep3);
45. <?php
class Omega
{
protected $foo;
protected $bar;
protected $bizz;
public function __construct($container)
{
$this->foo = $container['foo'];
$this->bar = $container['bar'];
$this->bizz = $container['biz'];
}
}
$container['foo'] = new Foo();
$container['bar'] = new Bar();
$container['bizz'] = new Bizz();
$newOmega = new Omega($container);
49. Mock Objects for
testing purposes
3rd-party web services
Accessing data sources
Environment independent
50. <?php
// Now here is our test case
include 'test_bootstrap.php';
class AclTest extends PHPUnit_Framework_TestCase
{
...
public function testDashboardAcl()
{
// Create a mock object
$testRequest = $this->getMock(
'GrumpyRequest',
array('getUri')
);
// Create our test response
$testRespect
->expects()
->method('getUri')
->with('/dashboard');
$testUserLevel = 3;
$testAcl = new GrumpyAcl($testRequest, $testUserLevel);
$response = $testAcl->accessAllowed();
$this->assertTrue($response);
}
}
51. Mock objects force you to
test code, not it’s ability
to talk to outside sources
56. <?php
include 'test_bootstrap.php';
$conn = new PDO(
'pgsql:host=localhost;dbname=ibl_stats',
'stats',
'st@ts=Fun'
);
echo "Collecting all fixtures for our league...n";
$mapper = new IBLFranchiseMapper($conn);
$allFranchises = $mapper->findAll();
echo "Writing franchise objects into fixture file...n";
file_put_contents('./fixtures/franchises.txt', serialize($allFranchises));
echo "Donen";
57. <?php
include './test_bootstrap.php';
class StandingsTest extends PHPUnit_Framework_TestCase
{
public function testGenerateRegular()
{
$data = file_get_contents('./fixtures/games.txt');
$testGames = unserialize($data);
$data = file_get_contents('./fixtures/franchises.txt');
$testFranchises = unserialize($data);
$testStandings = new IBLStandings($testGames, $testFranchises);
// Rest of the test is the same
}
}
58. Work as hard as you can
to remove the database
as a dependency for tests
60. <?php
// Assume $facebookUser is the object representing info
// about our user
$_SESSION['email'] = $facebookUser->getEmail();
$_SESSION['name'] =
$facebookUser->getFirstName() .
''.
$facebookUser->getLastName();
// In other parts of the app when I need to check if the user is
// authenticated properly
if (isset($_SESSION['email'])) {
// Execute the desired functionality
} else {
// Redirect user to log in with Facebook Connect
}
61. <?php
// New object that holds info about your Authenticated user
class AuthUser
{
...
public function check()
{
return (isset($_SESSION['email']));
}
}
// Then in the controller where you check authorization...
$authUser = new AuthUser();
if ($authUser->check() === true) {
// Execute the desired functionality
} else {
// Redirect user to log in with Facebook Connect
}
62. <?php
class AuthUser
{
protected $_sessionObject;
public function __construct($sessionContents)
{
$this->_sessionContents = $sessionContents;
}
public function check()
{
return (isset($this->_sessionContents['email']));
}
}
63. BONUS ROUND!
<?php
// Inside your unit test
$facebookMock = Mockery::mock(
'FacebookAPIFacebook',
array(
'getEmail' => 'test@littlehart.net',
'getName' => 'Testy McTesterson'
)
);
$sessionContents['email'] = $facebookMock->getEmail();
$auth = new AuthUser($sessionContents);
$this->assertTrue($auth->check());
Mockery - https://github.com/padraic/mockery
72. public function setUp()
{
// also include our libraries installed using Composer
include APP_ROOT . 'vendor/.composer/autoload.php';
// We are using Twig for templating
$loader = new Twig_Loader_Filesystem(APP_ROOT . 'templates');
$this->_twig = new Twig_Environment($loader);
$this->_twig = new Twig_Environment($loader, array('debug' => true));
$this->_twig->addExtension(new Twig_Extensions_Extension_Debug());
}
73. $gameMapper = new IBLGameMapper();
$franchiseMapper = new IBLFranchiseMapper();
$rotationMapper = new IBLRotationMapper();
$scheduleMapper = new IBLScheduleMapper();
82. Feature: Do a Google search
In order to find pages about Behat
As a user
I want to be able to use google.com to locate
search results
@javascript
Scenario: I search for Behat
Given I fill in "Behat github" for "q"
When I press "Google Search"
Then I should see "Trying to use Mink"