Phpunit output buffering, debuggen & TDD ergernissen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik erger me aan PHPUnit en moet het even kwijt. Met dit topic ben ik benieuwd of ik gelijkdenkenden hier vind of dat iemand mij kan laten zien dat het allemaal niet zo erg is :p

Wat ik niet snap is de output buffering en catch-all mechanismen van PHPUnit. Elke php parse error wordt opgeslokt en niet op een normale, duidelijke wijze naar buiten gebracht. Ik wordt dus helemaal gestoord van het schrijven van unit tests omdat ik op geen enkele manier kan debuggen en maar test-code in mijn source ga stoppen, runnen, kijken welke warning ik krijg om er achter te komen een typo te hebben gemaakt in een call van een methode 7(8)7

Een voorbeeldje van hoe ik denk aan TDD te doen. Je bedenkt een handige use case, dus die schrijf je op in een test:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

class MyTest extends PHPUnit_Framework_TestCase
{
  public function testMyFoo ()
  {
    $service = new Foo;
    $object  = new Bar;

    $return = $service->doSomething($object);
    $this->assertEquals('my-value', $return);
  }
}
Je runt hem:
ik@pc:~/phpunit-test/tests$ phpunit ./
PHPUnit 3.6.10 by Sebastian Bergmann.

ik@pc:~/phpunit-test/tests$
Ok, er is dus iets mis. Je hebt geen idee wat, maar je begint maar de Foo en Bar class te definieren en zet de autoloading aan. Misschien helpt het, want je hebt geen idee 8)7

ik@pc:~/phpunit-test/tests$ phpunit ./
PHPUnit 3.6.10 by Sebastian Bergmann.

ik@pc:~/phpunit-test/tests$
Oh ja, de methode Foo#doSomething bestaat nog niet, dus daar krijg je ook een lekkere terugkoppeling van 8)7 Laten we die maken en het nog eens proberen

ik@pc:~/phpunit-test/tests$ phpunit ./
PHPUnit 3.6.10 by Sebastian Bergmann.

F

Time: 0 seconds, Memory: 3.00Mb

There was 1 failure:

1) MyTest::testMyFoo
Failed asserting that null matches expected 'Foo'.

/home/ik/phpunit-test/tests/MyTest.php:11

FAILURES!                                                                                         
Tests: 1, Assertions: 1, Failures: 1.                                                             
ik@pc:~/phpunit-test/tests$
Tadaa! Waarom krijg ik niet een failing test als er iets mis is, met de php error als message waarom het niet is gelukt |:(

Goed, ik heb tot 10 geteld, het van me af geschreven :+ Ben ik gek of hebben meer mensen hier last van?

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
mithras schreef op maandag 16 april 2012 @ 18:30:
Goed, ik heb tot 10 geteld, het van me af geschreven :+ Ben ik gek of hebben meer mensen hier last van?
Uit mijn hoofd was het niet iets als :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

class MyTest extends PHPUnit_Framework_TestCase
{
  /**
   * @expectedException PHPUnit_Framework_Error
   */
  public function testMyFoo ()
  {
    $service = new Foo;
    $object  = new Bar;

    $return = $service->doSomething($object);
    $this->assertEquals('my-value', $return);
  }
}


PHPUnit doet net als alle andere hippe PHP dingen vooral veel config magic in annotations :|

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • SoulWar1
  • Registratie: Augustus 2004
  • Laatst online: 21:06
Ligt dit niet aan de configuratie? Als ik een fatal error heb zoals een functie die niet bestaat klapt hij eruit met een backtrace. Bij andere errors of noticen komen ze in de samenvatting.

PS: Die annotation moet je gebruiken als je juist een fout verwacht, en de test dus moet slagen.

code:
1
2
3
4
5
6
7
There was 1 error:

1) CalculatorTest::testCanAddTwoNumbers
Undefined variable: bsdf

/Volumes/Test/Calculator.php:15
/Volumes/Test/CalculatorTest.php:31


En als ik jou voorbeeldje draai:
code:
1
2
3
4
5
6
MacPro:PHP54 Bla$ phpunit MyTest.php 
PHPUnit 3.6.7 by Sebastian Bergmann.

PHP Fatal error:  Class 'Foo' not found in /Volumes/Bla/Sites/PHP54/MyTest.php on line 7

Fatal error: Class 'Foo' not found in /Volumes/Bla/Sites/PHP54/MyTest.php on line 7

[ Voor 36% gewijzigd door SoulWar1 op 16-04-2012 20:44 ]

Know Thyself


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
kwaakvaak_v2 schreef op maandag 16 april 2012 @ 19:48:
[...]


Uit mijn hoofd was het niet iets als :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

class MyTest extends PHPUnit_Framework_TestCase
{
  /**
   * @expectedException PHPUnit_Framework_Error
   */
  public function testMyFoo ()
  {
    $service = new Foo;
    $object  = new Bar;

    $return = $service->doSomething($object);
    $this->assertEquals('my-value', $return);
  }
}


PHPUnit doet net als alle andere hippe PHP dingen vooral veel config magic in annotations :|
Dan ben ik wel snel klaar, want al mijn testen slagen dan zonder één regel code :p

Ik ken van de regel trouwens, maar gebruik hem specifiek voor eigen gegooide uitzonderingen. Ook doe ik dan liever setExpectedException() trouwens.
SoulWar1 schreef op maandag 16 april 2012 @ 20:32:
Ligt dit niet aan de configuratie? Als ik een fatal error heb zoals een functie niet bestaat klapt hij eruit met een backtrace. Bij andere errors of noticen komen ze in de samenvatting.

code:
1
2
3
4
5
6
7
There was 1 error:

1) CalculatorTest::testCanAddTwoNumbers
Undefined variable: bsdf

/Volumes/Test/Calculator.php:15
/Volumes/Test/CalculatorTest.php:31


En als ik jou voorbeeldje draai:
code:
1
2
3
4
5
6
MacPro:PHP54 Bla$ phpunit MyTest.php 
PHPUnit 3.6.7 by Sebastian Bergmann.

PHP Fatal error:  Class 'Foo' not found in /Volumes/Bla/Sites/PHP54/MyTest.php on line 7

Fatal error: Class 'Foo' not found in /Volumes/Bla/Sites/PHP54/MyTest.php on line 7
Mm, je hebt wel mijn dag, sterker nog, mijn week gemaakt als ik dit ook zo krijg. Kennelijk heb ik een default staan in de config waar ik nu nog geen weet van heb.

Ps. Moeilijk tikken op mobiel, ik ga thuis wel verder reageren ;)

[ Voor 53% gewijzigd door mithras op 16-04-2012 23:30 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Deze fatal error moet je gewoon zien hoor? Staat je error reporting/display settings wel goed? Staat het ook niet @ error_log ?

Dan nog zuigt PHPunit op een aantal vlakken en is de code style van Sebastian stiekem een beetje ruk. Maar ja, je hebt het wel nodig. :)

Overigens doe ik liever $this->setExpectedException('WistIkHetMaarException'); direct voor de statement in kwestie ipv dmv de annotations. Duidelijker (puur persoonlijke voorkeur O-) ) en bovendien slaagt je test niet als de WistIkHetMaarException opeens een paar regels eerder gegooid wordt.

{signature}


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Voutloos schreef op maandag 16 april 2012 @ 21:02:
Deze fatal error moet je gewoon zien hoor? Staat je error reporting/display settings wel goed? Staat het ook niet @ error_log ?
Nope, ik zie dus niets. Ook geen idee waarom :?

Wel weer leuk dat ik deze rant heb geschreven en het aan een of andere config ligt :+ Meestal start ik met een schone phpunit.xml config:
XML:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>

<phpunit bootstrap="bootstrap.php" colors="true">
    <testsuite name="Test">
        <directory>./</directory>
    </testsuite>
</phpunit>


En een vrij simpele boostrap.php:
PHP:
1
2
<?php
error_reporting(E_ALL | E_STRICT);


Ik heb ook gekeken in de phpunit.xml naar de volgende opties:
  • convertErrorsToExceptions
  • convertWarningsToExceptions
  • stopOnError
  • stopOnFailure
Dan nog zuigt PHPunit op een aantal vlakken en is de code style van Sebastian stiekem een beetje ruk. Maar ja, je hebt het wel nodig. :)
Compleet gelijk inderdaad. Uberhaupt onhandig hoe de assertions werken en de documentatie is ook niet lekker om te gebruiken.
Overigens doe ik liever $this->setExpectedException('WistIkHetMaarException'); direct voor de statement in kwestie ipv dmv de annotations. Duidelijker (puur persoonlijke voorkeur O-) ) en bovendien slaagt je test niet als de WistIkHetMaarException opeens een paar regels eerder gegooid wordt.
Die gebruik ik ook.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12-09 13:36
Display_errors settings even controleren in php.ini.
Pagina: 1