Test Driven Development with PHPUnit

30
Test Driven Development with PHPUnit By: Kshirodra Meher Software Engineer Mindfire Solutions

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

Page 1: Test Driven Development with PHPUnit

Test Driven Development with PHPUnit

By: Kshirodra MeherSoftware EngineerMindfire Solutions

Page 2: Test Driven Development with PHPUnit

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?

Page 3: Test Driven Development with PHPUnit

Who am I ?

Kshirodra Meher

PHP Developer,

Mindfire Solutions

(Aug-2011 to Present)

Page 4: Test Driven Development with PHPUnit

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

Page 5: Test Driven Development with PHPUnit

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 .

Page 6: Test Driven Development with PHPUnit

Simple Test

Comparable to JUnit/PHPUnit

Created by Marcus Baker

Popular for testing web

pages at browser level

Page 7: Test Driven Development with PHPUnit

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

Page 8: Test Driven Development with PHPUnit

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

Page 9: Test Driven Development with 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.

Page 10: Test Driven Development with PHPUnit

Lets do 'Hello World'

<?php

class HelloWorld {

public $helloWorld;

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

$this->helloWorld = $string;

}

public function sayHello() {

return $this->helloWorld;

}

}

Page 11: Test Driven Development with PHPUnit

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);

}

}

Page 12: Test Driven Development with PHPUnit

Testing HelloWorld

#phpunit HelloWorldTest.php

PHPUnit 4.0.7 by Sebastian Bergmann.

..

Time: 70 ms, Memory: 3.75Mb

OK (2 tests, 2 assertions)

Page 13: Test Driven Development with PHPUnit

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.

Page 14: Test Driven Development with PHPUnit

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

Page 15: Test Driven Development with PHPUnit

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

Page 16: Test Driven Development with PHPUnit

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

Page 17: Test Driven Development with PHPUnit

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';

}

}

Page 18: Test Driven Development with PHPUnit

Assertions

assertArrayHasKey()

assertClassHasAttribute()

assertClassHasStaticAttribute()

assertContains()

assertContainsOnly()

assertContainsOnlyInstancesOf()

assertCount()

assertEmpty()

assertEqualXMLStructure()

assertEquals()

assertFalse()

assertFileEquals()

assertFileExists()

assertGreaterThan()

assertGreaterThanOrEqual()

assertInstanceOf()

assertInternalType()

assertJsonFileEqualsJsonFile()

assertJsonStringEqualsJsonFile()

assertJsonStringEqualsJsonString()

Page 19: Test Driven Development with PHPUnit

Assertions

assertLessThan()

assertLessThanOrEqual()

assertNull()

assertObjectHasAttribute()

assertRegExp()

assertStringMatchesFormat()

assertStringMatchesFormatFile()

assertSame()

assertSelectCount()

assertSelectEquals()

assertSelectRegExp()

assertStringEndsWith()

assertStringEqualsFile()

assertStringStartsWith()

assertTag()

assertThat()

assertTrue()

assertXmlFileEqualsXmlFile()

assertXmlStringEqualsXmlFile()

assertXmlStringEqualsXmlString()

Page 20: Test Driven Development with PHPUnit

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

Page 21: Test Driven Development with PHPUnit

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

Page 22: Test Driven Development with PHPUnit

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

Page 23: Test Driven Development with PHPUnit

Incomplete & Skipped Test

Interface PHP_Unit_Framework_IncompleteTest

- markTestImcomplete()

- markTestIncomplete(string $msg)

Skipped Test

- markTestSkipped()

- markTestIncomplete(string $msg)

Skipped @requires

Page 24: Test Driven Development with PHPUnit

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

Page 25: Test Driven Development with PHPUnit

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.

Page 26: Test Driven Development with PHPUnit

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

Page 27: Test Driven Development with PHPUnit

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.

Page 28: Test Driven Development with PHPUnit

Sources

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

https://github.com/sebastianbergmann/phpunit

Page 29: Test Driven Development with PHPUnit
Page 30: Test Driven Development with PHPUnit

Thank You