[TDD] Aantal asserts per unittest
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:
Ik kan hetzelfde echter ook testen met drie unittests met elk één assert:
Welke aanpak verdient de voorkeur? En wat zijn jullie andere gedachten hierover?
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 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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());
}
}
?>
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)
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
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());
}
}
?>
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
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.