GithubHelp home page GithubHelp logo

Comments (32)

mageekguy avatar mageekguy commented on May 22, 2024
public function test__construct()
{
   $this->if($armaggedon = new Armageddon($year = 2000))
          ->then->integer($armaggedon->getEndDate())->isEqualTo($year)
   ;
}

public function testApocalypse()
{
   $this->if($armaggedon = new Armageddon(2000))
          ->then->boolean($armaggedon->apocalypse())->isFalse()
          ->if($armaggedon = new Armageddon(2012))
          ->then->boolean($armaggedon->apocalypse())->isTrue()
   ;
}

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Thanks Mageekguy for you quick answer, I'm Happy now cause it's apocalypse :D

I have another question, I encounter difficulties to test protected methods.

Another silly example :

class Zday
{
    protected function zombie()
    {
        return "braiiin";
    }
}

How can I implement the test class of Zday ?

Last question, what is the name of the assertion to test if a variable exists or not and if it's value is equal to null or not ?

Is there somewhere a documentation of all assertions available ? It's a bit hard to guess them all :)

Thanks for your future answer ;)

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

A protected method must be tested in the scope of a public method.
You can assert that a variable is null with the variable asserter.

$this->variable($nullVariable)->isNull();

I know that the lack of documentation is currently the main problem of atoum, but a WIP version is available.

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Ok thanks a lot again ! I'll try to do some serious tests today, maybe I'll be back if I encounter other issues ;)

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Bonjour Mageekguy, Je me permets de revenir car je rencontre toujours quelques problèmes d'implémentation. Je me permets d'écrire en Français car j'ai remarqué que tu l'étais en découvrant ton blog, d'ailleurs j'ai bien aimé l'article sur "comment devenir un bon chef de projet".

Pour en revenir aux tests unitaires j'ai essayé de tester une classe très simple de mon entreprise qui permet de gérer un chronomètre. Néanmoins je rencontre des difficultés. Je me permets de poster un bout de code, désolé pour sa longueur, je vais l'expliquer et le rendre le plus agréable possible. Tout d'abord le constructeur permet d'initialiser le chrono et il y'a 4 méthodes :

  • tempsInter(): Qui prend un temps intermédiaire.
  • stop() : Qui arrête le chrono.
  • recupTemps() : qui retourne un tableau des temps mesurés.
  • getValNum() : Permet simplement de retourner une valeur numérique du microtime.

Voici le source de la classe que je désire tester :

<?php
class CgChrono
{
//===========================
// Déclaration des attributs
//=========================== 
    /**
     * Date de début
     *
     * @access private
     * @var timestamp
     */ 
    private $mDateDeb;

    /**
     * Tableau des temps intermédiaires
     *
     * @access private
     * @var timestamp
     */ 
    private $mTempsInter;
    /**
     * Date de début
     *
     * @access private
     * @var timestamp
     */ 
    private $mIndexInter = 0;
    /**
     * Date de début
     *
     * @access private
     * @var timestamp
     */ 
    private $mDateFin=NULL; 

//===========================
// Déclaration des méthodes
//===========================
    /**
     * Constructeur
     *
     * Crée l'objet et initialise la date de début
     *
     * @access public
     */ 
    public function __construct()
    { 
        $this->mDateDeb = microtime(); 
    } 
//===================================================================   
    /**
     * Arrêt du chrono
     *
     * Récupère la date de fin
     *
     * @access public
     */ 
    public function stop()
    { 
        $this->mDateFin = microtime(); 
        return true; 
    } 
//===================================================================   
    /**
     * Temps intermédiaire
     *
     * @access public
     */ 
    public function tempsInter()
    {
        if($this->mDateFin!=NULL)
            return false;

        $this->mTempsInter[$this->mIndexInter++] = microtime();
        return true;
    }
//===================================================================   
    /**
     * Retourne la valeur numérique d'un microtime
     *
     * @access public
     */ 
    public function getValNum($aDate)
    {
        $lTabTps = explode(" ", $aDate);
        return ((float)$lTabTps[0] + (float)$lTabTps[1]); 
    }
//===================================================================   
    /**
     * Récupération des temps du timer
     *
     * Retourne un tableau associatif contenant les index suivants :
     *       - debut   = microtime absolu de démarrage du chrono,
     *       - fin     = temps total chronométré,
     *       - nbInter = Nombre de valeurs de temps intermédiaires,
     *       - interX  = temps intermédiaire No X
     *
     * @access public
     */ 
    public function recupTemps()
    {
        $lTabTemps['debut']   = $this->getValNum($this->mDateDeb);
        $lTabTemps['fin']     = $this->getValNum($this->mDateFin);
        $lTabTemps['total']   = $lTabTemps['fin'] - $lTabTemps['debut'];
        $lTabTemps['nbInter'] = $this->mIndexInter;

        for($lInd=0; $lInd<$this->mIndexInter; $lInd++)
        {
            $lNomInter = 'inter'.$lInd;
            $lTabTemps[$lNomInter] = $this->getValNum($this->mTempsInter[$lInd]) - $lTabTemps['debut'];
        }
        return $lTabTemps;
    } 
} 
?>

Maintenant voici mon implémentation de la classe de test du chronomètre :

<?php
namespace tests\units;

//Inclusion de la classe à tester
require_once'../classes/chrono.php';

//Inclusion de atoum dans toutes les classes de tests
require_once './mageekguy.atoum.phar';

use \mageekguy\atoum;

 /**
 * Test de la classe \cgChrono
 */
class cgChrono extends atoum\test
{

    public function testgetValNum()
    {
        $lTestChrono = new \cgChrono();
        $aDate = microtime();//on génère un microtime
        $this->assert
                //le retour de la méthode getValNum doit être un float
                ->float($lTestChrono->getValNum($aDate));
    }
    public function testTempsInter()
    {
        $this->if($lTestChrono = new \cgChrono())
             //L'attribut mDateFin est nul, la méthode doit retourner un booleen false 
             ->then->boolean($lTestChrono->tempsInter())
                ->isFalse()
             ->if($lTestChrono = new \cgChrono())
             //On instancie mDateFin avec la méthode Stop
             ->if($lTestChrono->stop())
             //le retour de la méthode tempsInter doit être un booleen true 
             ->then->boolean($lTestChrono->tempsInter())
                ->isTrue();
    }
    public function testRecupTemps()
    {
        $lTestChrono = new \cgChrono();
        $this->if($lTestChrono->stop())
             //la methode recupTemps doit retourner un tableau (associatif) 
             ->then->array($lTestChrono->recupTemps())
                        ->hasSize(4) // Tableau doit être de de taille 4
                        ->isNotEmpty(); // et non vide
    }
    public function testStop()
    {
        $lTestChrono = new \cgChrono();
        $this->assert
                    //la methode stop doit retourner un boolean
                    ->boolean($lTestChrono->stop())
                        ->isTrue();//egal à true
    }

}           

Voici mon message d'erreur au moment de l'execution :

http://hpics.li/890eb89

J'aimerais trouver ce qui ne va pas dans mon implémentation du test de la classe chrono, elle me fournira un bon exemple pour mes jeux de tests futurs.

Merci d'avance pour ton aide précieuse.

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Peux-tu me mettre le message d'erreur de atoum dans son intégralité, stp ?

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Oui bien sûr, Le voici :

http://hpics.li/e5666aa

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Ton code ne provoque pas la même erreur chez moi.
J'ai juste un test qui ne passe pas.

fch@Tornade:~/tmp/atour
14> php chrono.test.php 
> PHP path: /usr/local/bin/php
> PHP version:
=> PHP 5.4.0 (cli) (built: Mar  7 2012 13:32:47)
=> Copyright (c) 1997-2012 The PHP Group
=> Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
> tests\units\cgChrono...
[SSFS________________________________________________________][4/4]
=> Test duration: 0.01 second.
=> Memory usage: 0.00 Mb.
> Total test duration: 0.01 second.
> Total test memory usage: 0.00 Mb.
> Running duration: 0.21 second.
Failure (1 test, 4/4 methods, 1 failure, 0 error, 0 exception) !
> There is 1 failure:
=> tests\units\cgChrono::testTempsInter():
In file /Users/fch/Tmp/atoum/chrono.test.php on line 31, mageekguy\atoum\asserters\boolean::isFalse() failed: boolean(true) is not false
-Reference
+Data
@@ -1 +1 @@
-bool(false)
+bool(true)

Peux-tu me dire de quelle façon tu lances tes tests ?
Et m'indiquer également la version de atoum (php mageekguy.atoum.phar -v) ?
Je vois également que tu utilises PHP 5.3.3 et il me semble qu'il faut à minima la version 5.3.5 pour que atoum fonctionne correctement.
Peux-tu tester sur une version plus récente de PHP ?

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Merci pour ces retours très réactifs :)

J'utilise atoum version nightly-1109-201204282316

Je lance les tests sous une linux Centos 5.5 à l'aide de la commande :

php -f nomDuFichierPHP

Je vais voir si mon entreprise me permet d'upgrade en 5.3.5 en début d'après midi. Sinon je regarde ton log d'erreur avec beaucoup d'intérêt d'après toi d'où vient l'erreur de la méthode testTempsInter() ?

Je me répète un peu mais encore merci de m'aider :)

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Coucou c'est encore moi (hélas^^), donc j'ai suivi tes conseils et suis passé en PHP 5.4, après reflexion l'erreur de la méthode testTempsInter() est algorithmique (je l'ai corrigée), donc à priori toutes les assertions devraient fonctionner.

Cependant mon log à l'execution est encore très différent du tien, le voici :

> PHP path: /usr/local/php/bin/php
> PHP version:
=> PHP 5.4.3 (cli) (built: Jun  4 2012 16:48:31) (DEBUG)
=> Copyright (c) 1997-2012 The PHP Group
=> Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
=>     with Xdebug v2.2.0, Copyright (c) 2002-2012, by Derick Rethans
> tests\units\cgChrono...
[UUUU________________________________________________________][4/4]
=> Test duration: 0.00 second.
=> Memory usage: 0.00 Mb.
> Total test duration: 0.00 second.
> Total test memory usage: 0.00 Mb.
> Running duration: 52.05 seconds.
Failure (1 test, 0/4 methods, 0 failure, 0 error, 0 exception) !
> There are 4 uncompleted methods:
=> tests\units\cgChrono::testTempsInter() with exit code 0:
==> output(1778) "O:21:"mageekguy\atoum\score":19:{s:30:"mageekguy\atoum\scorefactory";C:23:"mageekguy\atoum\factory":6:{a:0:{}}s:37:"mageekguy\atoum\scorepassAssertions";i:4;s:37:"mageekguy\atoum\scorefailAssertions";a:0:{}s:33:"mageekguy\atoum\scoreexceptions";a:0:{}s:40:"mageekguy\atoum\scoreruntimeExceptions";a:0:{}s:29:"mageekguy\atoum\scoreerrors";a:0:{}s:30:"mageekguy\atoum\scoreoutputs";a:0:{}s:32:"mageekguy\atoum\scoredurations";a:1:{i:0;a:4:{s:4:"case";N;s:5:"class";s:20:"tests\units\cgChrono";s:6:"method";s:14:"testTempsInter";s:5:"value";d:0.016664028167724609;}}s:35:"mageekguy\atoum\scorememoryUsages";a:0:{}s:31:"mageekguy\atoum\scorecoverage";O:30:"mageekguy\atoum\score\coverage":7:{s:10:"*factory";r:2;s:10:"*classes";a:1:{s:8:"CgChrono";s:63:"/Bureau/ProdeliaTests/outilsTests/tests_unit/classes/chrono.php";}s:8:"*lines";a:0:{}s:10:"*methods";a:1:{s:8:"CgChrono";a:5:{s:11:"__construct";a:2:{i:76;i:1;i:77;i:1;}s:4:"stop";a:3:{i:88;i:1;i:89;i:1;i:90;i:-2;}s:10:"tempsInter";a:5:{i:99;i:1;i:100;i:1;i:102;i:1;i:103;i:1;i:104;i:-2;}s:9:"getValNum";a:3:{i:113;i:-1;i:114;i:-1;i:115;i:-2;}s:10:"recupTemps";a:10:{i:130;i:-1;i:131;i:-1;i:132;i:-1;i:133;i:-1;i:135;i:-1;i:137;i:-1;i:138;i:-1;i:139;i:-1;i:140;i:-1;i:141;i:-2;}}}s:18:"*excludedClasses";a:0:{}s:21:"*excludedNamespaces";a:0:{}s:22:"*excludedDirectories";a:0:{}}s:41:"mageekguy\atoum\scoreuncompletedMethods";a:0:{}s:27:"mageekguy\atoum\scorecase";N;s:33:"mageekguy\atoum\scoredataSetKey";N;s:38:"mageekguy\atoum\scoredataSetProvider";N;s:30:"mageekguy\atoum\scorephpPath";N;s:33:"mageekguy\atoum\scorephpVersion";N;s:32:"mageekguy\atoum\scoreatoumPath";N;s:35:"mageekguy\atoum\scoreatoumVersion";N;s:37:"mageekguy\atoum\scoreincomptedTests";a:0:{}}"
=> tests\units\cgChrono::testgetValNum() with exit code 0:
==> output(1781) "O:21:"mageekguy\atoum\score":19:{s:30:"mageekguy\atoum\scorefactory";C:23:"mageekguy\atoum\factory":6:{a:0:{}}s:37:"mageekguy\atoum\scorepassAssertions";i:1;s:37:"mageekguy\atoum\scorefailAssertions";a:0:{}s:33:"mageekguy\atoum\scoreexceptions";a:0:{}s:40:"mageekguy\atoum\scoreruntimeExceptions";a:0:{}s:29:"mageekguy\atoum\scoreerrors";a:0:{}s:30:"mageekguy\atoum\scoreoutputs";a:0:{}s:32:"mageekguy\atoum\scoredurations";a:1:{i:0;a:4:{s:4:"case";N;s:5:"class";s:20:"tests\units\cgChrono";s:6:"method";s:13:"testgetValNum";s:5:"value";d:0.018074989318847656;}}s:35:"mageekguy\atoum\scorememoryUsages";a:0:{}s:31:"mageekguy\atoum\scorecoverage";O:30:"mageekguy\atoum\score\coverage":7:{s:10:"*factory";r:2;s:10:"*classes";a:1:{s:8:"CgChrono";s:63:"/Bureau/ProdeliaTests/outilsTests/tests_unit/classes/chrono.php";}s:8:"*lines";a:0:{}s:10:"*methods";a:1:{s:8:"CgChrono";a:5:{s:11:"__construct";a:2:{i:76;i:1;i:77;i:1;}s:4:"stop";a:3:{i:88;i:-1;i:89;i:-1;i:90;i:-2;}s:10:"tempsInter";a:5:{i:99;i:-1;i:100;i:-1;i:102;i:-1;i:103;i:-1;i:104;i:-2;}s:9:"getValNum";a:3:{i:113;i:1;i:114;i:1;i:115;i:-2;}s:10:"recupTemps";a:10:{i:130;i:-1;i:131;i:-1;i:132;i:-1;i:133;i:-1;i:135;i:-1;i:137;i:-1;i:138;i:-1;i:139;i:-1;i:140;i:-1;i:141;i:-2;}}}s:18:"*excludedClasses";a:0:{}s:21:"*excludedNamespaces";a:0:{}s:22:"*excludedDirectories";a:0:{}}s:41:"mageekguy\atoum\scoreuncompletedMethods";a:0:{}s:27:"mageekguy\atoum\scorecase";N;s:33:"mageekguy\atoum\scoredataSetKey";N;s:38:"mageekguy\atoum\scoredataSetProvider";N;s:30:"mageekguy\atoum\scorephpPath";N;s:33:"mageekguy\atoum\scorephpVersion";N;s:32:"mageekguy\atoum\scoreatoumPath";N;s:35:"mageekguy\atoum\scoreatoumVersion";N;s:37:"mageekguy\atoum\scoreincomptedTests";a:0:{}}"
=> tests\units\cgChrono::testRecupTemps() with exit code 0:
==> output(1774) "O:21:"mageekguy\atoum\score":19:{s:30:"mageekguy\atoum\scorefactory";C:23:"mageekguy\atoum\factory":6:{a:0:{}}s:37:"mageekguy\atoum\scorepassAssertions";i:3;s:37:"mageekguy\atoum\scorefailAssertions";a:0:{}s:33:"mageekguy\atoum\scoreexceptions";a:0:{}s:40:"mageekguy\atoum\scoreruntimeExceptions";a:0:{}s:29:"mageekguy\atoum\scoreerrors";a:0:{}s:30:"mageekguy\atoum\scoreoutputs";a:0:{}s:32:"mageekguy\atoum\scoredurations";a:1:{i:0;a:4:{s:4:"case";N;s:5:"class";s:20:"tests\units\cgChrono";s:6:"method";s:14:"testRecupTemps";s:5:"value";d:0.015460968017578125;}}s:35:"mageekguy\atoum\scorememoryUsages";a:0:{}s:31:"mageekguy\atoum\scorecoverage";O:30:"mageekguy\atoum\score\coverage":7:{s:10:"*factory";r:2;s:10:"*classes";a:1:{s:8:"CgChrono";s:63:"/Bureau/ProdeliaTests/outilsTests/tests_unit/classes/chrono.php";}s:8:"*lines";a:0:{}s:10:"*methods";a:1:{s:8:"CgChrono";a:5:{s:11:"__construct";a:2:{i:76;i:1;i:77;i:1;}s:4:"stop";a:3:{i:88;i:1;i:89;i:1;i:90;i:-2;}s:10:"tempsInter";a:5:{i:99;i:-1;i:100;i:-1;i:102;i:-1;i:103;i:-1;i:104;i:-2;}s:9:"getValNum";a:3:{i:113;i:1;i:114;i:1;i:115;i:-2;}s:10:"recupTemps";a:10:{i:130;i:1;i:131;i:1;i:132;i:1;i:133;i:1;i:135;i:1;i:137;i:-1;i:138;i:-1;i:139;i:-1;i:140;i:1;i:141;i:-2;}}}s:18:"*excludedClasses";a:0:{}s:21:"*excludedNamespaces";a:0:{}s:22:"*excludedDirectories";a:0:{}}s:41:"mageekguy\atoum\scoreuncompletedMethods";a:0:{}s:27:"mageekguy\atoum\scorecase";N;s:33:"mageekguy\atoum\scoredataSetKey";N;s:38:"mageekguy\atoum\scoredataSetProvider";N;s:30:"mageekguy\atoum\scorephpPath";N;s:33:"mageekguy\atoum\scorephpVersion";N;s:32:"mageekguy\atoum\scoreatoumPath";N;s:35:"mageekguy\atoum\scoreatoumVersion";N;s:37:"mageekguy\atoum\scoreincomptedTests";a:0:{}}"
=> tests\units\cgChrono::testStop() with exit code 0:
==> output(1773) "O:21:"mageekguy\atoum\score":19:{s:30:"mageekguy\atoum\scorefactory";C:23:"mageekguy\atoum\factory":6:{a:0:{}}s:37:"mageekguy\atoum\scorepassAssertions";i:2;s:37:"mageekguy\atoum\scorefailAssertions";a:0:{}s:33:"mageekguy\atoum\scoreexceptions";a:0:{}s:40:"mageekguy\atoum\scoreruntimeExceptions";a:0:{}s:29:"mageekguy\atoum\scoreerrors";a:0:{}s:30:"mageekguy\atoum\scoreoutputs";a:0:{}s:32:"mageekguy\atoum\scoredurations";a:1:{i:0;a:4:{s:4:"case";N;s:5:"class";s:20:"tests\units\cgChrono";s:6:"method";s:8:"testStop";s:5:"value";d:2.7005581855773926;}}s:35:"mageekguy\atoum\scorememoryUsages";a:0:{}s:31:"mageekguy\atoum\scorecoverage";O:30:"mageekguy\atoum\score\coverage":7:{s:10:"*factory";r:2;s:10:"*classes";a:1:{s:8:"CgChrono";s:63:"/Bureau/ProdeliaTests/outilsTests/tests_unit/classes/chrono.php";}s:8:"*lines";a:0:{}s:10:"*methods";a:1:{s:8:"CgChrono";a:5:{s:11:"__construct";a:2:{i:76;i:1;i:77;i:1;}s:4:"stop";a:3:{i:88;i:1;i:89;i:1;i:90;i:-2;}s:10:"tempsInter";a:5:{i:99;i:-1;i:100;i:-1;i:102;i:-1;i:103;i:-1;i:104;i:-2;}s:9:"getValNum";a:3:{i:113;i:-1;i:114;i:-1;i:115;i:-2;}s:10:"recupTemps";a:10:{i:130;i:-1;i:131;i:-1;i:132;i:-1;i:133;i:-1;i:135;i:-1;i:137;i:-1;i:138;i:-1;i:139;i:-1;i:140;i:-1;i:141;i:-2;}}}s:18:"*excludedClasses";a:0:{}s:21:"*excludedNamespaces";a:0:{}s:22:"*excludedDirectories";a:0:{}}s:41:"mageekguy\atoum\scoreuncompletedMethods";a:0:{}s:27:"mageekguy\atoum\scorecase";N;s:33:"mageekguy\atoum\scoredataSetKey";N;s:38:"mageekguy\atoum\scoredataSetProvider";N;s:30:"mageekguy\atoum\scorephpPath";N;s:33:"mageekguy\atoum\scorephpVersion";N;s:32:"mageekguy\atoum\scoreatoumPath";N;s:35:"mageekguy\atoum\scoreatoumVersion";N;s:37:"mageekguy\atoum\scoreincomptedTests";a:0:{}}"

Merci d'avance pour ton aide précieuse.

PS : J'ai également pris la dernière version de l'archive .phar :

atoum version nightly-1141-201206061136

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Malgré mes recherches le problème persiste toujours, aurais tu une idée de sa cause ? :)

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Es-ce que si tu supprimes ou met en commentaire toutes tes méthodes de test et que tu en défini une autre dans laquelle tu fais juste un $this->boolean(true)->isTrue();, le problème persiste ?

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Le code suivant

<?php
namespace tests\units;

//Inclusion de la classe à tester
require_once'../classes/chrono.php';

//Inclusion de atoum dans toutes les classes de tests
require_once './mageekguy.atoum.phar';

use \mageekguy\atoum;

 /**
 * Test de la classe \cgChrono
 */
class cgChrono extends atoum\test
{

    public function trololo()
    {
        $lTestChrono = new \cgChrono();
        $this->boolean(true)->isTrue();
    }

}
?>

Me retourne :

> PHP path: /usr/local/php/bin/php
> PHP version:
=> PHP 5.4.3 (cli) (built: Jun  4 2012 16:48:31) (DEBUG)
=> Copyright (c) 1997-2012 The PHP Group
=> Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
=>     with Xdebug v2.2.0, Copyright (c) 2002-2012, by Derick Rethans
> Total test duration: 0.00 second.
> Total test memory usage: 0.00 Mb.
> Running duration: 0.90 second.
Success (0 test, 0/0 method, 0 assertion, 0 error, 0 exception) !

Bizarre qu'il ne se passe rien il y'a quand même un test.

Je suis intrigué :)

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

tu dois préfixer ta méthode par 'test' pour qu'elle soit exécutée.

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Bonjour, me revoici après un petit week end de parenthèse :)

Oops désolé j'avais en effet oublié le préfixe test sur ma méthode, en le rajoutant j'obtiens une erreur lors de l'execution du test :

 PHP path: /usr/local/php/bin/php
> PHP version:
=> PHP 5.4.3 (cli) (built: Jun  4 2012 16:48:31) (DEBUG)
=> Copyright (c) 1997-2012 The PHP Group
=> Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
=>     with Xdebug v2.2.0, Copyright (c) 2002-2012, by Derick Rethans
> tests\units\cgChrono...
[U___________________________________________________________][1/1]
=> Test duration: 0.00 second.
=> Memory usage: 0.00 Mb.
> Total test duration: 0.00 second.
> Total test memory usage: 0.00 Mb.
> Running duration: 2.21 seconds.
Failure (1 test, 0/1 method, 0 failure, 0 error, 0 exception) !
> There is 1 uncompleted method:
=> tests\units\cgChrono::testTrololo() with exit code 0:
==> output(1781) "O:21:"mageekguy\atoum\score":19:{s:30:"mageekguy\atoum\scorefactory";C:23:"mageekguy\atoum\factory":6:{a:0:{}}s:37:"mageekguy\atoum\scorepassAssertions";i:2;s:37:"mageekguy\atoum\scorefailAssertions";a:0:{}s:33:"mageekguy\atoum\scoreexceptions";a:0:{}s:40:"mageekguy\atoum\scoreruntimeExceptions";a:0:{}s:29:"mageekguy\atoum\scoreerrors";a:0:{}s:30:"mageekguy\atoum\scoreoutputs";a:0:{}s:32:"mageekguy\atoum\scoredurations";a:1:{i:0;a:4:{s:4:"case";N;s:5:"class";s:20:"tests\units\cgChrono";s:6:"method";s:11:"testTrololo";s:5:"value";d:0.014848947525024414;}}s:35:"mageekguy\atoum\scorememoryUsages";a:0:{}s:31:"mageekguy\atoum\scorecoverage";O:30:"mageekguy\atoum\score\coverage":7:{s:10:"*factory";r:2;s:10:"*classes";a:1:{s:8:"CgChrono";s:63:"/Bureau/ProdeliaTests/outilsTests/tests_unit/classes/chrono.php";}s:8:"*lines";a:0:{}s:10:"*methods";a:1:{s:8:"CgChrono";a:5:{s:11:"__construct";a:2:{i:76;i:1;i:77;i:1;}s:4:"stop";a:3:{i:88;i:-1;i:89;i:-1;i:90;i:-2;}s:10:"tempsInter";a:5:{i:99;i:-1;i:100;i:-1;i:102;i:-1;i:103;i:-1;i:104;i:-2;}s:9:"getValNum";a:3:{i:113;i:-1;i:114;i:-1;i:115;i:-2;}s:10:"recupTemps";a:10:{i:130;i:-1;i:131;i:-1;i:132;i:-1;i:133;i:-1;i:135;i:-1;i:137;i:-1;i:138;i:-1;i:139;i:-1;i:140;i:-1;i:141;i:-2;}}}s:18:"*excludedClasses";a:0:{}s:21:"*excludedNamespaces";a:0:{}s:22:"*excludedDirectories";a:0:{}}s:41:"mageekguy\atoum\scoreuncompletedMethods";a:0:{}s:27:"mageekguy\atoum\scorecase";N;s:33:"mageekguy\atoum\scoredataSetKey";N;s:38:"mageekguy\atoum\scoredataSetProvider";N;s:30:"mageekguy\atoum\scorephpPath";N;s:33:"mageekguy\atoum\scorephpVersion";N;s:32:"mageekguy\atoum\scoreatoumPath";N;s:35:"mageekguy\atoum\scoreatoumVersion";N;s:37:"mageekguy\atoum\scoreincomptedTests";a:0:{}}"

Tu penses que le problème vient de la config de mon server PHP ?

Edit : Je viens de faire le test avec les classes que tu donnes en exemple dans la documentation (Hello et TestHello) et ça marche, j'ai bien 1 test et 2 assertions. Bizarre.

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Es-tu certain d'avoir la dernière version de atoum ?

from atoum.

glonglon avatar glonglon commented on May 22, 2024

J'utilise :

atoum version nightly-1141-201206061136

Que j'ai obtenu à cette adresse :

http://downloads.atoum.org/nightly/mageekguy.atoum.phar

Est-ce correct ?

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Je pense que tu as quelques versions de retard, mais je ne vois pas pourquoi cela serait un problème.
Peux-tu essayer en clonant le dépôt git ?

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Oui bien sûr.

Je viens d'installer git et cloner ton dépôt, néanmoins dans quel répertoire se trouve l'archive .phar?

Désolé de ma maladresse :)

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Le phar n'est pas dans les sources mais je voudrais justement que tu tests sans passer par lui.
Lance tes tests avec la commande suivante, exécutée à partir du répertoire de atoum :

# php scripts/runner.php -f /path/to/your/test/file -ncc

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Merci pour ces explications, donc en supprimant l'include de l'archive phar et en executant la commande depuis le script des sources j'obtiens une erreur similaire à celle de l'archive :

[root@LampP-caenEMO atoum]# php ./scripts/runner.php -f /var/www/html/prodelia/outilsTests/tests_unit/tests/testChrono.php

> PHP path: /usr/local/php/bin/php
> PHP version:
=> PHP 5.4.3 (cli) (built: Jun  4 2012 16:48:31) (DEBUG)
=> Copyright (c) 1997-2012 The PHP Group
=> Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
=>     with Xdebug v2.2.0, Copyright (c) 2002-2012, by Derick Rethans
> tests\units\cgChrono...
[U___________________________________________________________][1/1]
=> Test duration: 0.00 second.
=> Memory usage: 0.00 Mb.
> Total test duration: 0.00 second.
> Total test memory usage: 0.00 Mb.
> Running duration: 1.25 seconds.
Failure (1 test, 0/1 method, 0 failure, 1 error, 0 exception) !
> There is 1 error:
=> tests\units\cgChrono::testTrololo():
==> Error FATAL ERROR in /Bureau/ProdeliaTests/outilsTests/tests_unit/tests/testChrono.php on unknown line, generated by file /Bureau/ProdeliaTests/outilsTests/tests_unit/tests/testChrono.php on line 22:
Call to undefined method CgChrono::boolean()
> There is 1 uncompleted method:
=> tests\units\cgChrono::testTrololo() with exit code 255:
==> output(11) ""

Mystère au chocolat.

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Peux-tu me faire un gist de tes fichiers, notamment /Bureau/ProdeliaTests/outilsTests/tests_unit/tests/testChrono.php ?

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Bonjour, je vais arrêter de t'embêter, j'ai testé sur un autre PC avec php 5.4 hier soir et les sources marchent parfaitement avec atoum. Le problème doit venir de ma configuration de PHP, je vais le réinstaller aujourd'hui.

Merci beaucoup pour ton aide et ta patience en tout cas.

PS : Ah au fait, mon boss t'as vu à la conférence php ;)

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Tu ne m'embête pas, j'aimerais au contraire comprendre d'ou vient le problème pour pouvoir aider le prochain qui le rencontrera ou corriger le bug éventuel dans atoum.

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Rebonjour, désolé pour cette réponse tardive. Pour l'origine du problème j'avoue que j'ai du mal à la comprendre et je ne connais pas le fonctionnement de gist, j'ai refait des tests depuis un autre répertoire en codant sous vi et le test de la classe de chronomètre fonctionne parfaitement, pour preuve :

http://www.hostingpics.net/viewer.php?id=196366chrono.jpg

Peut-être que celà vient de mon encodage de caractère sous eclipse (iso 8859-1) ou d'un caractère binaire invalide dans mon script.

Sinon un dernier détail je rencontre des problèmes à tester des méthodes privées et j'ai fait comme tu m'as dit à savoir les tester depuis la portée d'une méthode publique, donc j'ai fait l'experience suivante :

Fichier cgChrono.class.php contenant une classe avec une méthode privée :

<?php

class cgChrono
{
        private function getValNum($aDate)
    {
        $lTabTps = explode(" ", $aDate);
        return ((float)$lTabTps[0] + (float)$lTabTps[1]); 
    }
}
?>

Fichier priveChrono.class.php Contenant une classe héritant de cgChrono permettant de tester sa méthode privée via une méthode publique :

<?php
require_once './cgChrono.class.php';

class PriveChrono extends cgChrono
{
        public function priveGetValNum()
        {
                return parent::getValNum($aDate=microtime());
        }
}
?>

Fichier contenant l'implémentation du test de PriveChrono avec atoum :

<?php
namespace tests\units;

require_once './cgChrono.class.php';
require_once './priveChrono.class.php';
require_once './mageekguy.atoum.phar';

use \mageekguy\atoum;
class PriveChrono extends atoum\test
{
        public function testPriveGetValNum()
        {
                $lTestPriveChrono = new \PriveChrono();
                $this->assert
                //le retour de la methode getValNum doit etre un float
                        ->float($lTestPriveChrono->priveGetValNum());
        }
}
?>

Néanmoins au moment de l'execution j'ai toujours une erreur sur la méthode privée.

> There is 1 error:
=> tests\units\PriveChrono::testPriveGetValNum():
==> Error FATAL ERROR in /var/www/html/tests/testChrono.php on unknown line, generated by file /var/www/html/tests/priveChrono.class.php on line 12:
Call to private method CgChrono::getValNum() from context 'PriveChrono'
> There is 1 uncompleted method:
=> tests\units\PriveChrono::testPriveGetValNum() with exit code 255:
==> output(0) ""

Comment puis-je tester une méthode privée ? Merci d'avance pour ton aide toujours très précieuse.

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Je pense connaître l'origine du problème : tu dois avoir un caractère comme un espace soit avant la balise <?php, soit après `?>' dans ton code.
Pour les méthodes privées, tu ne peux pas les tester dans une classe différente de la classe dans lesquelles elles sont déclarées (c'est normal, elles sont privées).
Je pense que je n'ai pas été suffisamment clair lors de la conférence à ce niveau.
Les méthodes privées dépendent de l'implémentation de la classe, c'est même leur seule et unique raison d'exister.
Si tu fais du TDD, ces méthodes apparaissent au cours du refactoring, donc elles sont testées implicitement par les méthodes publiques de la classe qui sont testées, puisque ces dernières les utilisent dans leur code.
En clair, une méthode privée qui n'est pas utilisée (donc testée) par au moins UNE méthode publique de la classe n'a pas lieu d'être.

from atoum.

glonglon avatar glonglon commented on May 22, 2024

En effet Frédéric, tu avais raison l'erreur venait d'un espace après '?>', erreur classique en php, la honte me submerge :(

Sinon merci pour ton explication très claire, en effet tester les méthodes publiques revient à tester implicitement les méthodes privées qu'elles appellent.

En tout cas merci, j'ai vraiment appris pas mal de choses sur Atoum et les tests unitaires, je vais me lancer dans des tests de classes plus complexes.

Peut-être reviendrais-je si des problèmes apparaissent mais ça devrait aller maintenant.

Je me répète vraiment beaucoup mais merci pour ton aide, ta patience et ta réactivité :)

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Au passage, je pense faire un petit script bash qui execute le test de toutes mes classes et inclure les résultats dans une petite fenêtre que j'aurais codée en HTML5. Aurais tu une idée de la manière dont je pourrais m'y prendre ? :)

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

À vue de nez, je dirais via un report realtime similaire à reports\realtime\cli avec un writer qui écrit sur une websocket, mais quel est l'intérêt ?

from atoum.

glonglon avatar glonglon commented on May 22, 2024

Ce serait pour générer une vue pour l'utilisateur.

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Mais quel en serait l'intérêt par rapport à la vue en ligne de commande ?

from atoum.

mageekguy avatar mageekguy commented on May 22, 2024

Je ferme le ticket car le problème d'origine est résolu, mais tu peux me contacter quand tu veux pour discuter de ton idée de console HTML 5.

from atoum.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.