steam learn: how to write good tests
TRANSCRIPT
11th of December 2014
How to write good tests?by Alexis von Glasow
11th of December 2014
Table of contents
● Why write tests?● What should we test?● With what and how?
11th of December 2014
Why write tests
11th of December 2014
● Why write tests?● What should we test?● With what and how?
11th of December 2014
11th of December 2014
LOOSE TIME
11th of December 2014
NO BUGS
TESTS
11th of December 2014
11th of December 2014
What should we test
11th of December 2014
ISOLATED!!!
11th of December 2014
Black boxOn 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.
11th of December 2014
White box
11th of December 2014
Unit Tests keep code consistency!
11th of December 2014
With what and how
11th of December 2014
Php Tools
11th of December 2014
Assert
public function testFailure()
{
$this->assertEquals($expected, $value, ‘message’);
$this->assertFalse(FALSE);
$this->assertTrue(TRUE);
$this->assertNull(NULL);
//…
}
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
);
}
11th of December 2014
Generators
● https://github.com/fzaninotto/Faker● https://github.com/nelmio/alice● http://hoa-project.net/En/Literature/Hack/Compiler.html● …
11th of December 2014
Faker// use the factory to create a Faker\Generator instance
$faker = Faker\Factory::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.
11th of December 2014
AliceNelmio\Entity\User:
user0:
username: bob
fullname: Bob
birthDate: 1980-10-10
email: [email protected]
favoriteNumber: 42
user1:
username: alice
fullname: Alice
birthDate: 1978-07-12
email: [email protected]
favoriteNumber: 27
Nelmio\Entity\Group:
group1:
name: Admins
11th of December 2014
Grammar PP%skip space \s// Scalars.%token true true%token false false%token null null// Strings.%token quote_ " -> string%token string:string [^"]+%token string:_quote " -> default// Objects.%token brace_ {%token _brace }// Arrays.%token bracket_ \[%token _bracket \]// Rest.%token colon :%token comma ,%token number \d+
11th of December 2014
Grammar PPvalue: <true> | <false> | <null> | string() | object() | array() | number()
string: ::quote_:: <string> ::_quote::
number: <number>
#object: ::brace_:: pair() ( ::comma:: pair() )* ::_brace::
#pair: string() ::colon:: value()
#array: ::bracket_:: value() ( ::comma:: value() )* ::_bracket::
11th of December 2014
CLASS A
CLASS C
CLASS B
Mock Me If you can
11th of December 2014
CLASS A
CLASS C
MOCK B
CLASS A
MOCK C
CLASS B
Mock Me If you can
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;}
}
11th of December 2014
Mock Me If you canpublic 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);}
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
11th of December 2014
Bug! What to do?
11th of December 2014
Test Driven Development
TDD
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!
11th of December 2014
To go further
11th of December 2014
Questions ?For online questions, please leave a comment on the article.
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/
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