● What is Unit Testing?
● Benefits
● What is PHPUnit?
● Installation
● The Bank Account Example
● Categories of (Unit) Tests / Software Testing
Pyramid
● Links
[2024]Digital Global Overview Report 2024 Meltwater.pdf
Php unit (eng)
1. PHPUnit
● What is Unit Testing?
● Benefits
● What is PHPUnit?
● Installation
● The Bank Account Example
● Categories of (Unit) Tests / Software Testing
Pyramid
● Links
2. What is Unit Testing?
● In computer programming, unit testing is a method by which
individual units of source code are tested to determine if they
are fit for use. A unit is the smallest testable part of an
application. In procedural programming a unit may be an
individual function or procedure. Unit tests are created by
programmers or occasionally by white box testers.
● Ideally, each test case is independent from the others:
substitutes like method stubs, mock objects, fakes and test
harnesses can be used to assist testing a module in
isolation. Unit tests are typically written and run by software
developers to ensure that code meets its design and
behaves as intended. Its implementation can vary from
being very manual (pencil and paper) to being formalized as
part of build automation
3. Benefits
The goal of unit testing is to isolate each part of the program and
show that the individual parts are correct. A unit test provides a
strict, written contract that the piece of code must satisfy. As a
result, it affords several benefits. Unit tests find problems early in
the development cycle.
● Facilitates change (refactor, regression, etc.)
● Simplifies integration (parts, sum & integration)
● Documentation (live, understand API)
● Design (TDD, no formal design, design element)
4. What is PHPUnit?
● PHPUnit is the de-facto standard for unit testing
in PHP projects. It provides both a framework
that makes the writing of tests easy as well as
the functionality to easily run the tests and
analyse their results.
● Part of xUnit family, created by Sebastian
Bergmann, integrated & supported by Zend
Studio/Framework.
● Simple installation with PEAR
5. Installation
● PHPUnit should be installed using the PEAR Installer. This installer is
the backbone of PEAR, which provides a distribution system for PHP
packages, and is shipped with every release of PHP since version
4.3.0.
● The PEAR channel (pear.phpunit.de) that is used to distribute
PHPUnit needs to be registered with the local PEAR environment.
Furthermore, components that PHPUnit depends upon are hosted on
additional PEAR channels.
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
● This has to be done only once. Now the PEAR Installer can be used to
install packages from the PHPUnit channel:
pear install phpunit/PHPUnit
● After the installation you can find the PHPUnit source files inside
your local PEAR directory; the path is usually /usr/lib/php/PHPUnit.
6. The Bank Account Example
<?php
class BankAccount
{
protected $balance = 0;
public function getBalance()
{
return $this->balance;
}
protected function setBalance($balance)
{
if ($balance>=0) {
$this->balance = $balance;
} else {
throw new BankAccountException;
}
}
public function depositMoney($balance)
{
$this->setBalance($this->getBalance() + $balance);
return $this->getBalance();
}
public function withdrawMoney($balance)
{
$this->setBalance($this->getBalance() - $balance);
return $this->getBalance();
}
}
7. Bank Account Test
<?php
require_once 'BankAccount.php';
class BankAccountTest extends PHPUnit_Framework_TestCase
{
public function testBalanceIsInitiallyZero()
{
$ba = new BankAccount;
$this->assertEquals(0, $ba->getBalance());
}
}
9. The setUp() template method
<?php
require_once 'BankAccount.php';
class BankAccountTest extends PHPUnit_Framework_TestCase
{
protected $ba;
public function setUp()
{
$this->ba = new BankAccount
}
public function testBalanceIsInitiallyZero()
{
$this->assertEquals(0, $this->ba->getBalance());
}
}
10. More Tests...
<?php
require_once 'BankAccount.php';
class BankAccountTest extends PHPUnit_Framework_TestCase
{
// ...
public function testBalanceCannotBecomeNegative()
{
try {
$this->ba->withdrawMoney(1);
} catch (BankAccountException $e) {
$this->assertEquals(0, $this->ba->getBalance());
return;
}
$this->fail();
}
}
11. Even More Tests...
<?php
require_once 'BankAccount.php';
class BankAccountTest extends PHPUnit_Framework_TestCase
{
// ...
public function testBalanceCannotBecomeNegative2()
{
try {
$this->ba->withdrawMoney(-1);
} catch (BankAccountException $e) {
$this->assertEquals(0, $this->ba->getBalance());
return;
}
$this->fail();
}
}
12. More and More Tests...
<?php
require_once 'BankAccount.php';
class BankAccountTest extends PHPUnit_Framework_TestCase
{
// ...
public function testDepositingAndWithdrawingMoneyWorks()
{
$this->assertEquals(0, $this->ba->getBalance());
$this->ba->depositMoney(1);
$this->assertEquals(1, $this->ba->getBalance());
$this->ba->withdrawMoney(1);
$this->assertEquals(0, $this->ba->getBalance());
}
}
14. Categories of (Unit) Tests
● Small: Unit Tests
● Check conditional logic in the code
● A debugger should not be required in case of failure
● Medium: Functional Tests
● Check whether the interfaces between classes
abide by their contracts
● Large: End-to-End Tests
● Check for “wiring bugs”