The document discusses how to write good tests. It recommends writing tests to avoid bugs, loose time, and keep code consistent. Key points covered include testing isolated units, using different types of tests like black box and white box, and tools for testing like assertions, data providers, mock objects, and test generators. The document emphasizes writing tests early and using all available assertion methods.
11. 11th of December 2014
Black box
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
On ne se préoccupe que des entrée sorties.
16. 11th of December 2014
Assert
public function testFailure()
{
$this->assertEquals($expected, $value, ‘message’);
$this->assertFalse(FALSE);
$this->assertTrue(TRUE);
$this->assertNull(NULL);
//…
}
17. 11th of December 2014
Data Provider
/**
* @dataProvider additionProvider
*/
public function testAdd($a, $b, $expected)
{
$this->assertEquals($expected, $a + $b);
}
public function additionProvider()
{
return array(
array(0, 0, 0), //success
array(0, 1, 1), //success
array(1, 0, 1), //success
array(1, 1, 3) //fail
);
}
18. 11th of December 2014
Generators
● https://github.com/fzaninotto/Faker
● https://github.com/nelmio/alice
● http://hoa-project.net/En/Literature/Hack/Compiler.html
● …
19. 11th of December 2014
Faker
// use the factory to create a FakerGenerator instance
$faker = FakerFactory::create();
// generate data by accessing properties
echo $faker->name;
// 'Lucy Cechtelar';
echo $faker->address;
// "426 Jordy Lodge
// Cartwrightshire, SC 88120-6700"
echo $faker->text;
// Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. Numquam excepturi
// beatae sint laudantium consequatur. Magni occaecati itaque sint et sit tempore. Nesciunt
// amet quidem. Iusto deleniti cum autem ad quia aperiam.
// A consectetur quos aliquam. In iste aliquid et aut similique suscipit. Consequatur qui
// quaerat iste minus hic expedita. Consequuntur error magni et laboriosam. Aut aspernatur
// voluptatem sit aliquam. Dolores voluptatum est.
// Aut molestias et maxime. Fugit autem facilis quos vero. Eius quibusdam possimus est.
// Ea quaerat et quisquam. Deleniti sunt quam. Adipisci consequatur id in occaecati.
// Et sint et. Ut ducimus quod nemo ab voluptatum.
20. 11th of December 2014
Alice
NelmioEntityUser:
user0:
username: bob
fullname: Bob
birthDate: 1980-10-10
email: bob@example.org
favoriteNumber: 42
user1:
username: alice
fullname: Alice
birthDate: 1978-07-12
email: alice@example.org
favoriteNumber: 27
NelmioEntityGroup:
group1:
name: Admins
23. 11th of December 2014
CLASS A
CLASS C
CLASS B
Mock Me If you can
24. 11th of December 2014
CLASS A
CLASS C
MOCK B
CLASS A
MOCK C
CLASS B
Mock Me If you can
25. 11th of December 2014
Mock Me If you can
class A {
public function doSomething(B $b, C $c)
{
try {
$d = $b->doOther($c);
$d->doSomething();
} catch (Exception $e) {
return false;
}
return $d;
}
}
class B {
public function doOther(C $c)
{
if ($c->isTrue()) {
throw new Exception(‘Oups!’);
}
return new D;
}
}
26. 11th of December 2014
Mock Me If you can
public function test()
{
$a = new A();
$b = new B();
$mockC = $this->getMock(‘C’, array(‘isTrue’));
$mockC->expects($this->any())->method(‘isTrue’)->will($this->returnValue(false));
$a->doSomething($b, $mockC);
}
public function testRaiseException()
{
$a = new A();
$b = new B();
$mockC = $this->getMock(‘C’, array(‘isTrue’));
$mockC->expects($this->any())->method(‘isTrue’)->will($this->returnValue(true));
$a->doSomething($b, $mockC);
}
27. 11th of December 2014
Whenever you are tempted to
type something into a print
statement or a debugger
expression, write it as a test
instead.
-- Martin Fowler
30. 11th of December 2014
Summary
● A good test is an existing test
● Test with provider, mock, generators!
● Use all asserters available
● Test sooner is better, easier!
32. 11th of December 2014
Questions ?
For online questions, please leave a comment on the article.
33. 11th of December 2014
Join the community !
(in Paris)
Social networks :
● Follow us on Twitter : https://twitter.com/steamlearn
● Like us on Facebook : https://www.facebook.com/steamlearn
SteamLearn is an Inovia initiative : inovia.fr
You wish to be in the audience ? Join the meetup group!
http://www.meetup.com/Steam-Learn/
34. 11th of December 2014
Sources
● https://github.com/atoum/atoum
● https://phpunit.de/
● http://www.simpletest.org/
● http://martinfowler.com/
● http://thenounproject.com/
Credits photos:
● useiconic.com from the Noun Project
● iconsmind.com from the Noun Project
● Luis Prado from the Noun Project
● Darren Barone from the Noun Project
● SuperAtic LABS from the Noun Project
● Julia Stoffer from the Noun Project
● CommitStrip.com
● Alexander Pretschner