appetite comes with testing
DESCRIPTION
An overview of the benefits of testing and a secure adventure: Test Driven Development of NmnMultiUserBundleTRANSCRIPT
![Page 1: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/1.jpg)
Change begins with awareness
Appetite comes with testing
“It's a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there's no knowing where you might be swept off to.”
J.R.R. Tolkien, The Lord of the Rings
![Page 2: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/2.jpg)
Change begins with awareness
Defect Cost Increase
![Page 3: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/3.jpg)
Change begins with awareness
Defect Cost Increase
![Page 4: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/4.jpg)
Change begins with awareness
Stress cycle
![Page 5: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/5.jpg)
Change begins with awareness
Testing as...
documentation
![Page 6: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/6.jpg)
Change begins with awareness
Testing as...
instrument forcooperation
![Page 7: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/7.jpg)
Change begins with awareness
Testing as...
instrument foropen source cooperation
![Page 8: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/8.jpg)
Change begins with awareness
Pair programming
![Page 9: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/9.jpg)
Change begins with awareness
All begins with...
...a need
![Page 10: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/10.jpg)
Change begins with awareness
And...
“Supporting multiple user classes is not easy at all. It would make the bundle code far more complex as we would basically need to change all places interacting with the user to be able to handle all user classes. I don't really want to go this way (it will also make it more likely to introduce bugs).”
...a delusion
![Page 11: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/11.jpg)
Change begins with awareness
But...
In Symfony2, all core classes use the service container, so it is easy to extend, configure and use any object
...a hope
![Page 12: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/12.jpg)
Change begins with awareness
Service ContainerDependency Injection Container
use Acme\HelloBundle\Mailer;
$mailer = new Mailer('sendmail');$mailer->send('[email protected]', ... );
![Page 13: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/13.jpg)
Change begins with awareness
Service ContainerDependency Injection Container
class Mailer{ private $mailerType; public function __construct($mailerType) {
$this->mailerType = $mailerType } public function send($to, ...) { ... }}
services: my_mailer: class: Acme\HelloBundle\Mailer arguments: [sendmail]
![Page 14: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/14.jpg)
Change begins with awareness
Service ContainerDependency Injection Container
class HelloController extends Controller{ public function sendEmailAction() { $mailer = $this->get('my_mailer'); $mailer->send('[email protected]', ... ); }}
![Page 15: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/15.jpg)
Change begins with awareness
FOSUserBundle
fos_user: db_driver: orm firewall_name: main user_class: Acme\UserBundle\Entity\User
![Page 16: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/16.jpg)
Change begins with awareness
FOSUserBundle
fos_user: db_driver: orm firewall_name: main user_class: Acme\UserBundle\Entity\User
service: user_manager: custom_user_manager
![Page 17: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/17.jpg)
Change begins with awareness
So ...
...a solution
We have to create our custom UserManager that accepts in the constructor an object that have the responsibility to discriminate user types
![Page 18: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/18.jpg)
Change begins with awareness
First of all: test
We start writing some functional tests to check correct integration of FOSUserBundle
![Page 19: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/19.jpg)
Change begins with awareness
Now we feel good
We can extends FOSUser without pain improving changes step by step
![Page 20: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/20.jpg)
Change begins with awareness
Custom UserManager
Class UserManager extends FOS\UserBundle\Entity\UserManager{
protected $userDiscriminator;
public function __construct(..., UserDiscriminator $userDiscriminator)
public function getClass(){
return $this->userDiscriminator->getClass();}
}
![Page 21: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/21.jpg)
Change begins with awareness
UserDiscriminator
public function getClass(){ return 'Acme/UserBundle/Entity/UserOne';}
![Page 22: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/22.jpg)
Change begins with awareness
From here it's all smooth
With little iterations, we improve UserManager and UserDiscriminator with unit and functional tests, passing from a dirty code to a more elegant one
![Page 23: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/23.jpg)
Change begins with awareness
NmnMultiUserBundle
fos_user: db_driver: orm firewall_name: main user_class: Acme\UserBundle\Entity\User service: user_manager: nmn_user_manager registration: form: handler: nmn_user_registration_form_handler profile: form: handler: nmn_user_profile_form_handler
![Page 24: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/24.jpg)
Change begins with awareness
NmnMultiUserBundle
parameters: nmn_user_discriminator_parameters: classes: user_one: entity: Acme\UserBundle\Entity\UserOne registration: Acme\UserBundle\Form\Type\RegistrationUserOneFormType profile: Acme\UserBundle\Form\Type\ProfileUserOneFormType factory: user_two: entity: Acme\UserBundle\Entity\UserTwo registration: Acme\UserBundle\Form\Type\RegistrationUserTwoFormType profile: Acme\UserBundle\Form\Type\ProfileUserTwoFormType factory:
![Page 25: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/25.jpg)
Change begins with awareness
NmnMultiUserBundle
Ok, it is an hack :)
A lazy way to use for free most of the functionality of FOSUserBundle ...
... but it is ready to be improved by anyone.
![Page 26: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/26.jpg)
Change begins with awareness
NmnMultiUserBundle
github.com/netmeansnet/NmnMultiUserBundle
github.com/netmeansnet/NmnMultiUserBundleSandbox
travis-ci.org/#!/netmeansnet/NmnMultiUserBundle
@leonardo_nmn
@euxpom
![Page 27: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/27.jpg)
Change begins with awareness
Some Books
I know this sounds strident and unilateral, but given the record I don't think the surgeons should have to defend hand-washing, and I don't think programmers should have to defend TDD
The Clean Coder
A code of Conduct for Professional Programmers
Martin, Robert C.
![Page 28: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/28.jpg)
Some Books
In software development, “perfect” is a verb, not an adjective
Extreme Programming Explained
Embrace Change
Beck, Kent
Change begins with awareness
In XP, testing is as important as programming
![Page 29: Appetite comes with testing](https://reader033.vdocuments.net/reader033/viewer/2022042815/5562eb01d8b42a38778b510c/html5/thumbnails/29.jpg)
Change begins with awareness
Some Books
Building testable applications is Hard
The Grumpy Programmer's Guide To BuildingTestable Applications in PHP
Hartjes, Chris
The reason for investing in automated testing is obvious: any bugs you catch before your application makes it into production cost less in terms of resources (money, developer time) to fix than fixing it into production