[TDD] Aantal asserts per unittest

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ward van der Put
Moderator

Ward van der Put

21/09/2016 10:18:50
Quote Anchor link
Volgens sommigen kun je een unittest het beste beperken tot één assertion. Volgens anderen kun je in veel situaties beter meerdere assertions in één unittest verpakken. Zie hiervoor bijvoorbeeld Is it OK to have multiple asserts in a single unit test? op Stack Exchange.

Nu heb ik een class die een public static function validate() moet bevatten. Ik kan deze vereiste testen met één unittest met drie asserts:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class InternationalArticleNumberTest extends PHPUnit_Framework_TestCase
{
    /**
     * @testdox Public static validate() method exists
     */

    public function testPublicStaticValidateMethodExists()
    {

        $class = new \ReflectionClass('\NewCo\Types\InternationalArticleNumber');
        $this->assertTrue($class->hasMethod('validate'));
        $method = new \ReflectionMethod('\NewCo\Types\InternationalArticleNumber', 'validate');
        $this->assertTrue($method->isPublic());
        $this->assertTrue($method->isStatic());
    }
}

?>

Ik kan hetzelfde echter ook testen met drie unittests met elk één assert:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
class InternationalArticleNumberTest extends PHPUnit_Framework_TestCase
{
    /**
     * @testdox validate() method exists
     */

    public function testValidateMethodExists()
    {

        $class = new \ReflectionClass('\NewCo\Types\InternationalArticleNumber');
        $this->assertTrue($class->hasMethod('validate'));
    }


    /**
     * @testdox validate() method is public
     */

    public function testValidateMethodIsPublic()
    {

        $method = new \ReflectionMethod('\NewCo\Types\InternationalArticleNumber', 'validate');
        $this->assertTrue($method->isPublic());
    }


    /**
     * @testdox validate() method is static
     */

    public function testValidateMethodIsStatic()
    {

        $method = new \ReflectionMethod('\NewCo\Types\InternationalArticleNumber', 'validate');
        $this->assertTrue($method->isStatic());
    }
}

?>

Welke aanpak verdient de voorkeur? En wat zijn jullie andere gedachten hierover?
Gewijzigd op 24/09/2016 08:27:07 door Ward van der Put
 
PHP hulp

PHP hulp

21/10/2019 20:46:39
 
Jelmer -

Jelmer -

03/10/2016 12:24:44
Quote Anchor link
Het lijkt mij prima om deze assertions te combineren in één test, onder het motto dat ze samen de interface van je methode testen.

Zelf zou ik deze test niet eens schrijven denk ik. Ik zou unit tests vooral gebruiken om het gedrag van je class te testen. Wanneer een methode die je verwacht als public static aan te kunnen roepen dat dan niet is, dan volgt dat vanzelf wel uit die tests.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.