Test Driven Development with PHPUnit

Post on 10-May-2015

607 views 6 download

Tags:

description

This presentation would help learn how to install, integrate, write automated test script with PHPUnit.Would also involve looking into different example and execute them.

Transcript of Test Driven Development with PHPUnit

Test Driven Development with PHPUnit

By: Kshirodra MeherSoftware EngineerMindfire Solutions

Contents

Who am I ?

What & Why to do Testing ?

What is Unit testing ?

PHPUnit

Starting with PHPUnit

PHPUnit Example

Test Dependencies

Data Provider

Testing Error & Exceptions

Test Output

Assertion

Fixtures

Database Testing

Incomplete & Skipped Test

Test Doubles

Testing Practice

Code Coverage Analysis

Skeleton Generator & Selenium

Sources & Questions?

Who am I ?

Kshirodra Meher

PHP Developer,

Mindfire Solutions

(Aug-2011 to Present)

What & Why to do Testing ?

Testing : revealing a person's capabilities by putting them under strain; challenging. :P

S/W Testing : Software testing is an investigation conducted to provide stakeholders with information about the quality of the product or service under test.

Why S/W Testing :

- Meet the requirements that guided its design and development

- Expected Results / Unexpected Failure

Software never was perfect and won’t get perfect. But is that a license to create garbage? The missing ingredient is our reluctance to quantify quality. – Boris Beizer

What is Unit Testing ?

Unit : The smallest testable code of an application

Test : Code that checks code on

If you don’t like unit testing your product, most likely your customers won’t like to test it either.

Benefits :

- Changing/maintaining code

- Fixing cost is low

- Faster development etc etc .

Simple Test

Comparable to JUnit/PHPUnit

Created by Marcus Baker

Popular for testing web

pages at browser level

PHPUnit

PHPUnit is a programmer oriented testing framework for PHP

Part of xUnit family (JUnit, SUnit..)

Created By : Sebastian Bergmann

Integrated in most IDE :

- Eclipse, Netbeans, Zend Studio, PHPStorm

Integrated/Supported by :

- Zend Framework, Cake, Symfony

Starting with PHPUnit

PHPUnit can be installed using PEAR installer

Commands to install :

#pear config-set auto_discover 1

#pear install pear.phpunit.de/PHPUnit

Writing Tests for PHPUnit

The tests for a class Class go into a class ClassTest

ClassTest inherits(most of the time) from PHPUnit_Framework_TestCase

The tests are public methods that are named test*.

Inside the test methods, assertions methods such as assertEquals() are used to assert that an actual value matches an expected value.

Lets do 'Hello World'

<?php

class HelloWorld {

public $helloWorld;

public function __construct($string = ‘Hello World!’) {

$this->helloWorld = $string;

}

public function sayHello() {

return $this->helloWorld;

}

}

Test HelloWorld Class

require_once 'HelloWorld.php';

class HelloWorldTest extends PHPUnit_Framework_TestCase {

public function test__construct() {

$hw = new HelloWorld();

$this->assertInstanceOf('HelloWorld', $hw);

}

public function testSayHello() {

$hw = new HelloWorld();

$string = $hw->sayHello();

$this->assertEquals('Hello World!', $string);

}

}

Testing HelloWorld

#phpunit HelloWorldTest.php

PHPUnit 4.0.7 by Sebastian Bergmann.

..

Time: 70 ms, Memory: 3.75Mb

OK (2 tests, 2 assertions)

PHPUnit Test Results Details

. - Printed when the test succeeds

F - Printed when an assertion fails while running the test method

E - Printed when an error occurs while running the test method

S - Printed when the test has been skipped

I - Printed when the test is marked as being incomplete or not yet implemented

PHPUnit distinguishes between failures and errors. A failure is a violated PHPUnit assertion such as a failing assertEquals() call. An error is an unexpected exception or a PHP error. Sometimes this distinction proves useful since errors tend to be easier to fix than failures.

Test Dependencies

PHPUnit supports the declaration of the explicit dependencies between test methods. Such dependencies do not define the order in which the test methods are to be executed but they allow the returning of an instance of the test fixture by a producer and passing it to the dependent consumers.

A producer is a test method that yields its unit under test as return values.

A consumer is a test method that depends on one or more producers and their return values.

Annotated by @depends

Data Provider

Test method can accept arbitrary arguments. These arguments are to be provided by a data provider methods.

- Array

- Objects (that implements iterator)

Multiple arguments

Annotated by @dataProvider

Testing Error & Exceptions

PHPUnit converts PHP errors, warning, and notices that are triggered during the execution of a test to an exception. Using these exceptions, you can, for instance, expect a test to trigger a PHP error

Tests whether an exception is thrown inside the tested code.

Annotated by @expectedExceptions

Test Output

Sometimes you want to assert that the execution of a method, for instance, generates an expected output via echo or print.

class OutputTest extends PHPUnit_Framework_TestCase {

public function testExpectFooActualFoo() {

$this->expectOutputString('foo');

print 'foo';

}

public function testExpectBarActualBaz() {

$this->expectOutputString('bar');

print 'baz';

}

}

Assertions

assertArrayHasKey()

assertClassHasAttribute()

assertClassHasStaticAttribute()

assertContains()

assertContainsOnly()

assertContainsOnlyInstancesOf()

assertCount()

assertEmpty()

assertEqualXMLStructure()

assertEquals()

assertFalse()

assertFileEquals()

assertFileExists()

assertGreaterThan()

assertGreaterThanOrEqual()

assertInstanceOf()

assertInternalType()

assertJsonFileEqualsJsonFile()

assertJsonStringEqualsJsonFile()

assertJsonStringEqualsJsonString()

Assertions

assertLessThan()

assertLessThanOrEqual()

assertNull()

assertObjectHasAttribute()

assertRegExp()

assertStringMatchesFormat()

assertStringMatchesFormatFile()

assertSame()

assertSelectCount()

assertSelectEquals()

assertSelectRegExp()

assertStringEndsWith()

assertStringEqualsFile()

assertStringStartsWith()

assertTag()

assertThat()

assertTrue()

assertXmlFileEqualsXmlFile()

assertXmlStringEqualsXmlFile()

assertXmlStringEqualsXmlString()

Fixtures

Is a known state of an application

Need to be set up at the start of the test

Need to be torn down at the end of the test

Share states over the test methods

setUp() is where you create objects against which you will test

tearDown() is where you clean up the objects against which you tested

More setUp() then tearDown()

The setUpBeforeClass() and tearDownAfterClass() template methods are called before the first test of the test case class is run and after the last test of the case class is run, respectively

Database Testing

PHPUnit Database Extension

Can be installed by :

# pear install phpunit/DbUnit

Currently supported database :

- MySQL

- PostgreSQL

- Oracle

- SQLite

Has access to other database systems such as IBM DB2 / Microsoft SQL Server through Zend Framework or Doctrine 2 integration

Database Testing

Four stages of database testing

- Setup fixture

- Exercise System Under Test

- Verify Outcome

- Teardown

(1. Clean-Up Database, 2. Set up fixture, 3–5. Run Test, Verify outcome and Teardown)

Must implement

- getConnection() : Returns a database connection wrapper

- getDataSet() : Returns the dataset to seed the database with

Incomplete & Skipped Test

Interface PHP_Unit_Framework_IncompleteTest

- markTestImcomplete()

- markTestIncomplete(string $msg)

Skipped Test

- markTestSkipped()

- markTestIncomplete(string $msg)

Skipped @requires

Test Doubles

Introduced By : Gerard Meszaros

Replace a System Under Test (SUT) for the purpose of testing

Stubs

- Used for providing the tested code with "indirect input"

Mocks

- Used for verifying "indirect output" of the tested code, by first defining the expectations before the tested code is executed

Testing Practices

Development

- All unit tests run correctly.

- The code communicates its design principles.

- The code contains no redundancies.

- The code contains the minimal number of classes and methods.

Debugging

- Verify that you can reproduce the defect.

- Find the smallest-scale demonstration of the defect in the code.

- Write an automated test that fails now but will succeed when the defect is fixed.

- Fix the defect.

Code Coverage Analysis

How do you find code that is not yet tested or, in other words, not yet covered by a test?

How do you measure testing completeness?

phpunit --coverage-html ./report BankAccountTest

Skeleton Generator & Selenium

PHPUnit Skeleton Generator is a tool that can generate skeleton test classes from production code classes and vice versa.

pear install phpunit/PHPUnit_SkeletonGenerator

phpunit-skelgen --test Calculator

Selenium

- Is a test tool that allows you to write automated user-interface tests for web applications in any programming language against any HTTP website using any mainstream browser.

Sources

http://phpunit.de/manual/current/en/index.html

https://github.com/sebastianbergmann/phpunit

Thank You