2003幎ã«ã¯ãDerick Rethansã¯ãªãªãŒã¹Xdebugã1.2ã«ãPHPãšã³ã·ã¹ãã ã§åããŠãã³ãŒãã«ãã¬ããžããŒã¿ãåéã§ããããã«ãªããŸããã 2004幎ã«ã¯ãã»ãã¹ãã£ã³ã»ããŒã°ãã³ããªãªãŒã¹PHPUnitã®2圌ãæåã«ããã䜿çšãããéçºè ã¯ãã«ãã¬ããžã¬ããŒãã䜿çšããŠãã¹ãã¹ã€ãŒãã®ããã©ãŒãã³ã¹ã枬å®ã§ããããã«ãªããŸããã
ãã以æ¥ãæ©èœã¯æ±çšã®ç¬ç«ããphp-code-coverageã³ã³ããŒãã³ãã«ç§»åãããŸãããPHPDBGãšPCOVã代æ¿ãã©ã€ããŒãšããŠç»å ŽããŸãããããããåºæ¬çã«ãéçºè ã®ã³ââã¢ããã»ã¹ã¯éå»16幎éå€æŽãããŠããŸããã
2020幎8æã«ã¯ãã®ãªãªãŒã¹ã§PHPã³ãŒãã»ã«ãã¬ããž9.0ããã³ããã«é¢é£ãããªãªãŒã¹ã¯9.3 PHPUnitã®ãšbehatã³ãŒãã»ã«ãã¬ããž5.0ããæšå®ããæ°ããæ¹æ³ã«ãã¬ããžãå©çšå¯èœã«ãªããŸããã
ä»æ¥ã¯æ€èšããŸã
- åºæ¬ã®ã¯ã€ãã¯ãã¢ãŒ
- å¶éäºé
- 代æ¿ã¡ããªãã¯
- ãã©ã³ãã«ãã¬ããž
- ã«ããŒãã¹
- æ°ããææšãå«ã
- ã©ã®ã¡ããªãã¯ã䜿çšããŸããïŒ
- æ°ããææšãå«ããªãçç±ã¯ãããŸããïŒ
- çµæ
åºæ¬ã®ã¯ã€ãã¯ãã¢ãŒ
ã»ãšãã©ã®PHPéçºè ã¯ãèªåã³ãŒããã¹ãã®ã¢ã€ãã¢ã«ç²ŸéããŠããŸããã³ãŒãã«ãã¬ããžã®æŠå¿µã¯ãèªåãã¹ããšå¯æ¥ã«é¢é£ããŠãããå®è¡ãããããŸãã¯ãã¹ãã«ãã£ãŠãã«ããŒããããã³ãŒãã®å²åã枬å®ããããšã§ããããšãã°ã次ã®ã³ãŒããããå ŽåïŒ
<?php
class PercentCalculator
{
public function __construct(int $numerator, int $denominator)
{
$this->numerator = $numerator;
$this->denominator = $denominator;
}
public function calculatePercent(): float
{
return round($this->numerator / $this->denominator * 100, 1);
}
}
次ã«ã以äžã«ç€ºãããã«PHPUnitãã¹ããèšè¿°ã§ããŸãã
<?php
class PercentCalculatorTest extends PHPUnit\Framework\TestCase
{
public function testTwentyIntoForty(): void
{
$calculator = new PercentCalculator(20, 40);
self::assertEquals(50.0, $calculator->calculatePercent());
}
}
ãã¹ããå®è¡ããåŸãPHPUnitã¯ããã®ç°¡åãªäŸã§100ïŒ ã®ã«ãã¬ããžã«å°éããããšã確èªããŸãã
å¶éäºé
ãã ããäžèšã®äŸã§ã¯ãå°ããªæœåšçãªãã°ããããŸããã$åæ¯ã0ã®å ŽåããŒãé€ç®ãšã©ãŒãçºçããŸãããããä¿®æ£ããŠãäœãèµ·ãããèŠãŠã¿ãŸãããïŒ
<?php
class PercentCalculator
{
public function __construct(int $numerator, int $denominator)
{
$this->numerator = $numerator;
$this->denominator = $denominator;
}
public function calculatePercent(): float
{
// ,
//
//
return $this->denominator ? round($this->numerator / $this->denominator * 100, 1) : 0.0;
}
}
12è¡ç®ã§3å€ã®if / elseã¹ããŒãã¡ã³ãã䜿çšãããŠããŸããïŒnullåŠçãæ£ããããšã確èªããããã®ãã¹ããäœæããŠããŸããïŒãã¬ããŒãã«ã¯ã100ïŒ ã®ã³ãŒãã«ãã¬ããžãããããšã瀺ãããŠããŸãã
è¡ã®äžéšããã¹ãã§ã«ããŒãããŠããå Žåãè¡å šäœãã«ããŒæžã¿ãšããŠããŒã¯ãããŸããããã¯èª€è§£ãæãå¯èœæ§ããããŸãã
è¡ãå®è¡ããããã©ãããåçŽã«èšç®ããã ãã§ãä»ã®ã³ãŒãæ§é ã§ãåãåé¡ãçºçããããšããããããŸããããšãã°ã次ã®ããã«ãªããŸãã
if ($a || $b || $c) { // **
doSomething(); // 100%
}
public function pluralise(string $thing, int $count): string
{
$string = $count . ' ' . $thing;
if ($count > 1) { // $count >= 2, - 100%
$string .= 's'; // $count === 1,
} // ,
return $string;
}
代æ¿ã¡ããªãã¯
ããŒãžã§ã³2.3以éãXdebugã¯ã䜿ãæ £ããè¡ããšã®ã¡ããªãã¯ã ãã§ãªãã代æ¿ã®ãã©ã³ãããã³ãã¹ã«ãã¬ããžã¡ããªãã¯ãåéã§ããããã«ãªããŸããããã®æ©èœã«ã€ããŠè©±ããŠããDerikã®ããã°æçš¿ã¯ãæªåé«ã声æã§çµãããŸããã
ãã»ãã¹ãã£ã³ïŒãŸãã¯ä»ã®èª°ãïŒãPHP_CodeCoverageãæŽæ°ããŠããã©ã³ããšãã¹ã®ã«ãã¬ããžã衚瀺ããæéãã§ãããŸã§åŸ ã€å¿ èŠããããŸããããããŒãããã³ã°ïŒ
Derik Retansã2015幎1æ "
ãã®äžæè°ãªã誰ããã5幎éåŸ ã£ãåŸãç§ã¯ããããã¹ãŠèªåã§å®è£ ããããšæ±ºå¿ããŸãããç§ã®ãã«ãªã¯ãšã¹ããåãå ¥ããŠãããSebastianBergmanã«æè¬ããŸãã
ãã©ã³ãã«ãã¬ããž
æãåçŽãªã³ãŒããé€ããã¹ãŠã®ã³ãŒãã§ãå®è¡ãã¹ã2ã€ä»¥äžã®ãã¹ã«åå²ããå¯èœæ§ãããå ŽæããããŸããããã¯ããã¹ãŠã®if / elseãwhileãªã©ããã¹ãŠã®æ±ºå®ãã€ã³ãã§çºçããŸãããããã®åå²ç¹ã®åãåŽãã¯ãåå¥ã®ãã©ã³ãã§ãã決å®ãã€ã³ãããªãå ŽåããããŒã«ã¯1ã€ã®ãã©ã³ãã®ã¿ãå«ãŸããŸãã
ããªãŒã¡ã¿ãã¡ãŒã䜿çšããŠããã«ããããããããã®ã³ã³ããã¹ãã®ãã©ã³ãã¯ããŒãžã§ã³ã³ã³ãããŒã«ãã©ã³ããšåãã§ã¯ãªãããšã«æ³šæããŠãã ãããæ··åããªãã§ãã ããã
ãã©ã³ããšãã¹ã®ã«ãã¬ããžãæå¹ã«ãªã£ãŠããå Žåãphp-code-coverageã§çæãããHTMLã¬ããŒããéåžžã®ã©ã€ã³ã«ãã¬ããžã¬ããŒãã«å ããŠããã©ã³ãããã³ãã¹ã«ãã¬ããžã衚瀺ããããã®ã¢ããªã³ãå«ãŸããŠããŸããããã¯ã以åãšåãã³ãŒãäŸã䜿çšããå Žåã®ãã©ã³ãã«ãã¬ããžã®å€èŠ³
ã§ããã芧ã®ãšãããããŒãžäžéšã®ããããããã¯ã¹ã¯ãè¡ããšã®å®å šãªã«ãã¬ããžããããŸããããã©ã³ããšãã¹ã®ã«ãã¬ããžã«ã¯é©çšãããªãããšãããã«ç€ºããŠããŸãïŒãã¹ã«ã€ããŠã¯ã次ã®ã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãïŒã
ããã«ã12è¡ç®ã¯ã«ãã¬ããžãäžå®å šã§ããããšã瀺ãããã«é»è²ã§åŒ·èª¿è¡šç€ºãããŸãïŒã«ãã¬ããžã0ïŒ ã®è¡ã¯éåžžã©ããèµ€ã§è¡šç€ºãããŸãïŒã
æåŸã«ããã泚ææ·±ã人ã¯ãè¡ããšã®ã«ãã¬ããžãšã¯ç°ãªããããå€ãã®è¡ãã«ã©ãŒã§åŒ·èª¿è¡šç€ºãããŠããããšã«æ°ä»ããããããŸãããããã¯ãåå²ãPHPã€ã³ã¿ãŒããªã¿ãŒå ã®å®è¡ãããŒã«åºã¥ããŠèšç®ãããããã§ããåé¢æ°ã®æåã®ãã©ã³ãã¯ããã®é¢æ°ãå ¥åããããšãã«éå§ãããŸããããã¯ãé¢æ°æ¬äœã®ã¿ãå®è¡å¯èœãªæååãå«ããšèŠãªãããé¢æ°å®£èšèªäœãå®è¡äžå¯èœãšèŠãªãããæååããŒã¹ã®ã«ãã¬ããžãšã¯å¯Ÿç §çã§ãã
æãèŠã€ãã
PHP ã€ã³ã¿ãŒããªã¿ãŒãè«ççã«åé¢ããã³ãŒãã®ãã©ã³ããšèŠãªããã®ãšãéçºè ã®ã¡ã³ã¿ã«ã¢ãã«ãšã®ãã®ãããªéãã«ãããã¡ããªãã¯ãç解ããã®ãé£ãããªãå¯èœæ§ããããŸããããšãã°ãcalculatePercentïŒïŒã«ããã€ã®ãã©ã³ããããããå°ããããå Žåããã®2ã«çããŸãïŒ0ã®ç¹æ®ãªã±ãŒã¹ãšäžè¬çãªã±ãŒã¹ïŒããã ããäžèšã®php-code-coverageã¬ããŒããèŠããšããã®1è¡ã®é¢æ°ã«ã¯å®éã«ã¯... 4ã€ã®ãã©ã³ããå«ãŸããŠããŸããïŒïŒPHP
ã€ã³ã¿ãŒããªã¿ãŒã®æå³ãç解ããããã«ãã¢ããã¹ããªãŒã ã®äžã«è¿œå ã®ã«ãã¬ããžã¬ããŒãããããŸããåãã©ã³ãã®è¡šç€ºã®æ¡åŒµããŒãžã§ã³ã衚瀺ããããœãŒã¹ã³ãŒãã«é ãããŠãããã®ãããå¹ççã«èå¥ã§ããŸãã次ã®ããã«ãªããŸãã
ãã£ãã·ã§ã³ã¯æ¬¡ã®ãšããã§ããã以äžã¯ãXdebugãæ€åºããã³ãŒãã®åãã©ã³ããè¡šããœãŒã¹ã®è¡ã§ãããã©ã³ãã¯æååãšåãã§ããå¿ èŠã¯ãªãããšã«æ³šæããŠãã ãããæååã«ã¯è€æ°ã®ãã©ã³ããå«ããããšãã§ãããããè€æ°å衚瀺ãããŸãããŸããäžéšã®ãã©ã³ãã¯æé»çã§ããå¯èœæ§ãããããšã«ã泚æããŠãã ãããããšãã°ãifã¹ããŒãã¡ã³ãã¯ãèšè¿°ããŠããªããŠããè«çãããŒã«åžžã«elseãå«ãŸããŸããã
ããã¯ãŸã ã¯ã£ããããŠããŸããããcalculatePercentïŒïŒã«å®éã«ã©ã®ãã©ã³ãããããã¯ãã§ã«ç解ã§ããŸãã
- ãã©ã³ã1ã¯é¢æ°ãšã³ããªããå§ãŸãã$ this->åæ¯ãã§ãã¯ãå«ãŸããŠããŸãã
- 次ã«ãç¹å¥ãªå ŽåãåŠçããããã©ããã«å¿ããŠãå®è¡ããã©ã³ã2ãš3ã«åå²ãããŸãã
- ãã©ã³ã4ã¯ããã©ã³ã2ãš3ãããŒãžããå Žæã§ãããé¢æ°ã®æ»ããšçµäºã§æ§æãããŸãã
ãã©ã³ãããœãŒã¹ã³ãŒãã®åã ã®éšåã«ç²Ÿç¥çã«äžèŽãããããšã¯ãå°ãç·Žç¿ãå¿ èŠãªæ°ããã¹ãã«ã§ããããããèªã¿ãããç解ããããã³ãŒãã§ãããè¡ãã®ã¯ééããªãç°¡åã§ãããã®äŸã®ããã«ãã³ãŒããè€æ°ã®ããžãã¯ãçµã¿åãããã¹ããŒããªã¯ã³ã©ã€ããŒã§ãã£ã±ãã®å Žåã¯ããã©ã³ãã«å®å šã«å¯Ÿå¿ãããã¹ãŠãæ°è¡ã§æ§é åããã³èšè¿°ãããŠããã³ãŒããšæ¯èŒããŠãããè€éã«ãªããšäºæ³ãããŸãããã®ã¹ã¿ã€ã«ã§èšè¿°ãããåãããžãã¯ã¯æ¬¡ã®ããã«ãªããŸãã
ã¯ããŒããŒ
php-code-coverage ã¬ããŒããClover圢åŒã§ãšã¯ã¹ããŒãããŠå¥ã®ã·ã¹ãã ã«è»¢éãããã©ã³ãããŒã¹ã®ã«ãã¬ããžãæå¹ã«ãããšãããŒã¿ã¯æ¡ä»¶ä»ãããŒãšcoveredconditionalsããŒã«æžã蟌ãŸããŸãã以åïŒãŸãã¯ãã©ã³ãã«ãã¬ããžãæå¹ã«ãªã£ãŠããªãå ŽåïŒããšã¯ã¹ããŒããããå€ã¯åžžã«ãŒãã§ããã
ã«ããŒãã¹
ãã¹ã¯ããã©ã³ãã®å¯èœãªçµã¿åããã§ãã次ã®ããã«ãcalculatePercentïŒïŒã®äŸã«ã¯2ã€ã®å¯èœãªãã¹ããããŸãã
- ãã©ã³ã1ã次ã«ãã©ã³ã2ã次ã«ãã©ã³ã4;
- ãã©ã³ã1ããã©ã³ã3ããã©ã³ã4ã®é ã«ãªããŸãã
ãã ããå€ãã®å Žåãããšãã°ãå€ãã®æ¡ä»¶ãšã«ãŒããå«ãã³ãŒãã§ã¯ããã¹ã®æ°ããã©ã³ãã®æ°ãããå€ããªããŸããphp-code-coverageããååŸãã次ã®äŸã«ã¯ã23ã®ãã©ã³ãããããŸãããå®éã«ã¯ãé¢æ°ã«ã¯65ã®ç°ãªããã¹ããããŸãã
final class File extends AbstractNode
{
public function numberOfTestedMethods(): int
{
if ($this->numTestedMethods === null) {
$this->numTestedMethods = 0;
foreach ($this->classes as $class) {
foreach ($class['methods'] as $method) {
if ($method['executableLines'] > 0 &&
$method['coverage'] === 100) {
$this->numTestedMethods++;
}
}
}
foreach ($this->traits as $trait) {
foreach ($trait['methods'] as $method) {
if ($method['executableLines'] > 0 &&
$method['coverage'] === 100) {
$this->numTestedMethods++;
}
}
}
}
return $this->numTestedMethods;
}
}
23ã®ãã©ã³ããã¹ãŠãèŠã€ãããªãå Žåãforeachã¯ç©ºã®ã€ãã¬ãŒã¿ãŒãåãå ¥ããããšãã§ããåžžã«èŠããªãelseãååšããå Žåã¯èŠããŠãããŠãã ããã
ã¯ããã€ãŸãã100ïŒ ã®ã«ãã¬ããžã«ã¯65ã®ãã¹ããå¿ èŠã§ãããã©ã³ããšåæ§ã«ãphp-code-coverage
HTMLã¬ããŒãã«ã¯ããã¹ããšã«è¿œå ã®ãã¥ãŒãå«ãŸããŠããŸããçå°ã§èŠãããŠãããã®ãšèŠãããŠããªããã®ã瀺ããŠããŸãã
ãã ããªã
ãã¹ã«ãã¬ããžãæå¹ã«ãããšã衚瀺ãããã¡ããªãã¯ãã€ãŸãCRAPã¹ã³ã¢ã«ããã«åœ±é¿ããŸããcrap4j.orgã§å ¬éãããŠããå®çŸ©ã§ã¯ãPHPã§ãããŸã§å©çšã§ããªãã£ããã¹ã«ãã¬ããžã®ããŒã»ã³ããŒãžã¡ããªãã¯ãèšç®ã®å ¥åãšããŠäœ¿çšããŸããäžæ¹ãPHPã§ã¯ãè¡ããšã®ã«ãã¬ããžãåžžã«äœ¿çšãããŠããŸãããã«ãã¬ããžãè¯å¥œãªå°ããªæ©èœã®å ŽåãCRAPã¹ã³ã¢ã¯åããŸãŸã§ããããããã«ã¯æžå°ããå¯èœæ§ããããŸãããã ããå®è¡ãã¹ãå€ããã«ãã¬ããžãäœãé¢æ°ã®å Žåãå€ã¯å€§å¹ ã«å¢å ããŸãã
æ°ããææšãå«ã
ãã©ã³ããšãã¹ã®ã«ãã¬ããžã¯ãåãåºã«ãªãã³ãŒãå®è¡ããŒã¿ã®åãªãç°ãªãè¡šçŸã§ãããããäžç·ã«æå¹ãŸãã¯ç¡å¹ã«ãªããŸãã
PHPUnit
PHPUnit 9.3+ãè¿œå çãªææšã¯ãããã©ã«ãã§ã¯ç¡å¹ã«ãªã£ãŠãããšãã³ãã³ãã©ã€ã³ãä»ããŠããŸãã¯ãããããä»ããŠæå¹ã«ããããšãã§ããŸãphpunit.xmlã®ã³ã³ãã£ã®ã¥ã¬ãŒã·ã§ã³ã»ãã¡ã€ã«ããå¯äžã®ããšã§å®è¡ããŠããå Žåã¯XdebugãPCOVãŸãã¯PHPDBGã䜿çšããŠãããšãã«ãã®æ©èœãæå¹ã«ããããšãããšãæ§æã®éäºææ§ã«é¢ããèŠåã衚瀺ãããã«ãã¬ããžã¯åéãããŸããã
- ã³ã³ãœãŒã«ã§ã-path -coverageãªãã·ã§ã³ã䜿çšããŸãïŒvendor / bin / phpunit -- path-coverageã
- phpunit.xmlã§ãcoverageèŠçŽ ã®pathCoverageå±æ§ãtrueã«èšå®ããŸãã
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
<testsuites>
<testsuite name="default">
<directory>tests</directory>
</testsuite>
</testsuites>
<coverage pathCoverage="true" processUncoveredFiles="true" cacheDirectory="build/phpunit/cache">
<include>
<directory suffix=".php">src</directory>
</include>
<report>
<text outputFile="php://stdout"/>
<html outputDirectory="build/coverage"/>
</report>
</coverage>
</phpunit>
PHPUnit 9.3ã§ã¯ãæ§æãã¡ã€ã«ã®åœ¢åŒãå€§å¹ ã«å€æŽãããŠãããããäžèšã®æ§é ã¯ãããã以åãšã¯ç°ãªã£ãŠèŠããŸãã
behat-cââode-coverage
behatã³ãŒãã«ããŒ5.0+ãèšå®ãã§è¡ããbehat.ymlãå±æ§ãåŒã³åºããbranchAndPathCoverageãXdebug以å€ã®ãã©ã€ããŒã§æå¹ã«ããããšãããšãèŠåãçºè¡ãããŸãããã«ãã¬ããžã¯çæãããŸããããã¯ãç°ãªãç°å¢ã§åãæ§æãã¡ã€ã«ãç°¡åã«äœ¿çšã§ããããã«ããããã§ããæ瀺çã«æ§æãããŠããªãå ŽåãXdebugã§å®è¡ãããšãæ°ããã«ãã¬ããžãããã©ã«ãã§æå¹ã«ãªããŸãã
ã©ã®ã¡ããªãã¯ã䜿çšããŸããïŒ
å人çã«ã¯ãç§ïŒDoug WrightïŒã¯å¯èœãªéãæ°ããã¡ããªãã¯ã䜿çšããŸããããŸããŸãªã³ãŒãã§ãããããã¹ãããŠããæ£åžžããªãã®ã確èªããŸãããç§ã®ãããžã§ã¯ãã§ã¯ãããããããã€ããªããã¢ãããŒãã䜿çšããŸããããã以äžã«ç€ºããŸããåçšãããžã§ã¯ãã®å Žåãæ°ããã¡ããªãã¯ã«åãæ¿ãã決å®ã¯ãæããã«ããŒã å šäœã§è¡ãå¿ èŠããããŸããç§ã¯ã圌ãã®èª¿æ»çµæãèªåã®èª¿æ»çµæãšæ¯èŒããæ©äŒã楜ãã¿ã«ããŠããŸãã
ç§ã®æèŠ
100ïŒ ã®ãã¹ããŒã¹ã®ã«ãã¬ããžã¯ééããªãèæ¯ã§ãããé©çšããããšãçã«ããªã£ãŠããå Žåã¯ãããã§ãªãå Žåã§ãåªåããã®ã«é©ããææšã§ãããã¹ããäœæããå Žåã§ãããšããžã±ãŒã¹ãªã©ã«ã€ããŠèããå¿ èŠããããŸãããã¹ããŒã¹ã®ã«ãã¬ããžã¯ãåé¡ããªãããšã確èªããã®ã«åœ¹ç«ã¡ãŸãã
ãã ããã¡ãœããã«æ°åãæ°çŸããŸãã¯æ°åãã®ãã¹ãå«ãŸããŠããå ŽåïŒããã¯å®éã«ã¯ããªãè€éãªãã®ã§ã¯çããããšã§ã¯ãããŸããïŒãæ°çŸã®ãã¹ããäœæããæéãç¡é§ã«ããããšã¯ãããŸããã 10æã«åæ¢ããã®ãè³¢æã§ãããã¹ãã¯ããèªäœãç®çã§ã¯ãªãããªã¹ã¯è»œæžããŒã«ã§ãããå°æ¥ãžã®æè³ã§ãããã¹ãã¯å ±ãããã¹ãã§ãããããã«è²»ããããæéãã¹ããå ±ãããå¯èœæ§ã¯äœãã§ãããã®ãããªç¶æ³ã§ã¯ãå°ãªããšãå決å®ãã€ã³ãã§äœãèµ·ãã£ãŠãããã確å®ã«èããããšãã§ãããããé©åãªãã©ã³ãã«ãã¬ããžãç®æãã®ãæåã§ãã
å€æ°ã®ãã¹ã®å ŽåïŒãããã¯æ£çŽãªCRAPã§é©åã«å®çŸ©ãããŠããŸãïŒãåé¡ã®ã³ãŒããããŸãæ©èœããªããã©ãããè©äŸ¡ãããããããå°ããªé¢æ°ïŒãã§ã«è©³çŽ°ã«è§£æã§ããŸãïŒã«å解ããåççãªæ¹æ³ã¯ãããŸããïŒããã§ãªãå ŽåããããŸãããããã¯åé¡ãããŸããããããžã§ã¯ãã®ãã¹ãŠã®ãªã¹ã¯ãå®å šã«æé€ããå¿ èŠã¯ãããŸããããããã«ã€ããŠç¥ãããšããçŽ æŽãããã§ãããŸããæ©èœã®å¢çãšãããã®åé¢ããããŠããããã¹ãã¯ããœãããŠã§ã¢å šäœã®çã®è€éãã§ã¯ãªããããžãã¯ã®äººçºçãªåé¢ã§ããããšãèŠããŠããããšãéèŠã§ãããããã£ãŠãå®è¡ãã¹ã®æ°ãéåžžã«å€ããšããçç±ã ãã§ã倧ããªé¢æ°ãå£ããªãããšããå§ãããŸããããã¯ãåé¢ã«ãã£ãŠèªç¥è² è·ã軜æžãããã³ãŒãã®èªèã«åœ¹ç«ã€å Žåã«ã®ã¿å®è¡ããŠãã ããã
æ°ããææšãå«ããªãçç±ã¯ãããŸããïŒ
ã¯ããããã©ãŒãã³ã¹ãXdebugã³ãŒããéåžžã®PHPããã©ãŒãã³ã¹ãšæ¯èŒããŠä¿¡ããããªãã»ã©é ãããšã¯åšç¥ã®äºå®ã§ãããŸãããã©ã³ããšãã¹ã®ã«ãã¬ããžããªã³ã«ãããšã圌ã远跡ããå¿ èŠã®ãããã¹ãŠã®è¿œå ã®å®è¡ããŒã¿ã«ãªãŒããŒãããã³ã¹ããè¿œå ãããããããã¹ãŠãæªåããŸãã
幞ããªããšã«ããããã®åé¡ã«åãçµãå¿ èŠããããããéçºè ã¯php-code-coverageå ã§äžè¬çãªããã©ãŒãã³ã¹ãæ¹åããXdebugã䜿çšãããã¹ãŠã®äººã«ã¡ãªããããããããŸããããã¹ãã¹ã€ãŒãã®ããã©ãŒãã³ã¹ã¯å€§ããç°ãªãããããããåãã¹ãã¹ã€ãŒãã«ã©ã®ããã«åœ±é¿ããããå€æããã®ã¯å°é£ã§ãããæååããŒã¹ã®ã«ãã¬ããžã®åéã¯ãšã«ããé«éã«ãªããŸãã
ãã©ã³ãããã¹ããã«ãã¬ããžãäœæããã®ã¯ããŸã çŽ3ã5åé ããªããŸãããããèæ ®ã«å ¥ããå¿ èŠããããŸãããã¹ãã¹ã€ãŒãå šäœã§ã¯ãªããåã ã®ãã¹ããã¡ã€ã«ãéžæçã«æå¹ã«ãããããã¹ãŠã®ããã·ã¥ãå®è¡ããã®ã§ã¯ãªãããããè¯ãã«ãã¬ããžãã§å€éãã«ããæå¹ã«ããããšãæ€èšããŠãã ããã
Xdebug 3ã¯ãã¢ãžã¥ãŒã«åãšããã©ãŒãã³ã¹ã«é¢ããäœæ¥ã«ãããçŸåšã®ããŒãžã§ã³ãããå€§å¹ ã«é«éã«ãªãããããããã®èŠåã¯Xdebug2ã®ã¿ã«åºæã®ãã®ãšèŠãªãå¿ èŠããããŸããããŒãžã§ã³3ã§ã¯ãè¿œå ããŒã¿ã®åéã®ãªãŒããŒããããèæ ®ããŠããè¡ããšã®ã«ãã¬ããžãååŸããã®ã«ãããæéãããçãæéã§ããã©ã³ãããŒã¹ããã³ãã¹ããŒã¹ã®ã«ãã¬ããžãçæã§ããŸãã
Sebastian Bergmannãå®æœãããã¹ããDerickRethansãããããããã°ã©ã
çµæ
æ°æ©èœããã¹ãããŠãç§ãã¡ã«æžããŠãã ããã圌ãã¯åœ¹ã«ç«ã¡ãŸãããïŒïŒããããä»ã®èšèªããã®ïŒä»£æ¿ã®èŠèŠåã®ã¢ã€ãã¢ã¯ç¹ã«èå³æ·±ããã®ã§ãã
ãããšãç§ã¯åžžã«ã³ãŒãã«ãã¬ããžã®éåžžã®ã¬ãã«ã«ã€ããŠã®ããªãã®æèŠã«èå³ããããŸãã
ã§PHPãã·ã¢2005幎11æ29æ¥ã«ãç§ãã¡ã¯ãããã¥ã¡ã³ãã«ãªããã®ã«ã€ããŠPHPã®éçºã«é¢ãããã¹ãŠã®æãéèŠãªè³ªåãã説æããŸãããäœãããªãã®ã³ãŒãã®æ°ããã¬ãã«ãæäŸããŸãã
ã«ã³ãã¡ã¬ã³ã¹ã«ãåå ãã ãããPHPãŠãããŒã¹ã®æé«ã®ã¹ããŒã«ãŒã«ã¬ããŒããèããã質åãããããã ãã§ãªããæããé°å²æ°ã®äžã§ããã®ã³ãã¥ãã±ãŒã·ã§ã³ïŒã€ãã«ãªãã©ã€ã³ïŒïŒãè¡ãããšãã§ããŸããç§ãã¡ã®ã³ãã¥ããã£ïŒTelegramãFacebookãVKontakteãYouTubeã