tdd (with flow3)

Post on 14-May-2015

1.288 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

An introduction to Test-Driven Development using FLOW given at the TYPO3 University in Annecy, France in May 2008.

TRANSCRIPT

Inspiring people toshare

TDD (with FLOW3)Karsten Dambekalns <karsten@typo3.org>

Robert Lemke <robert@typo3.org>

Inspiring people toshare

What?Why?How?

Integrate!

Test first,code later

Inspiring people toshare

Test first, code laterWrite tests for all your code

• New features come with a test

• Bugfixes come with a test

Write tests before your code

• Adding a feature means adding a test first

• Fixing a bug means writing a test first

Inspiring people toshare

Unit testsUnit tests are small programs that test your code

They check

• the result of methods against expected values

• whether methods are (not) called as expected

A test should

• be well-named

• check only one assertion

Inspiring people toshare

Good testsShould be...

• automated

• self-contained

• repeatable

• thorough

• small

• talk about the domain

Inspiring people toshare

Unit testsUnit tests are usually run with a test runner

The xUnit family is most widespread

PHPUnit does the job for PHP

Tests aren’tthe goal

But you said...

They make you feel good

Inspiring people toshare

They make you feel goodThe tests make you

• focus on your task

• code exactly what you need

• think from the outside

• a better programmer*

So what the tests do for you is the key

* decoupling helps with testing, decoupled code is easier to maintain, easier is better - q.e.d.

Inspiring people toshare

Reasons for TDDFeel more comfortable

• Build confidence in your code

• Reduce fear of change

(Good) tests are (good) documentation

Acts as safety net

• Regression testing built in

• Helps with refactoring

Inspiring people toshare

D for DesignWriting tests first is likely to improve your code

Constant refactoring keeps code clean

Unit testing ensure decoupling

You only code what is really needed

Inspiring people toshare

TDD in Practice

Inspiring people toshare

The Mantra

Inspiring people toshare

The Mantra

Implement

Test Test

Design

Inspiring people toshare

More testingSometimes you need to test interaction with external systems, like database access

A test should be small, encapsulated, stand-alone

So how do you test database access?

Inspiring people toshare

Mocks & stubsMock objects allow you to use fake objects instead of real implementations

Stubs can be used to return hard-coded results

Using them is actually (somewhat) easy with PHPUnit

Inspiring people toshare

Saving in TYPO3CRAssumptions / Background

• The Session object has a save() method

• It uses a Storage_Backend implementation to do the work

• That implementation has methods like addNode(), updateNode() and deleteNode()

You need to make sure those are used when calling save()

No FLOW3?No TDD!

Inspiring people toshare

No TDD without FLOW3Without Dependency Injection you cannot really do unit testing

Inspiring people toshare

DependenciesProblem: Classes explicitly refer to other classes:

Inspiring people toshare

DependenciesTry to test this class:

Inspiring people toshare

DependenciesUnit Testing: You want to test a small unit

You don't want to test

• The Simple File Logger

• The Card Repository

Inspiring people toshare

DependenciesUnit Testing: You want to test a small unit

You want to test

• if the action returns a string representation of the random card it gets from the repository

Inspiring people toshare

Dependency InjectionA class doesn't ask for the instance of another class but gets it injected

This methodology is referred to as the "Hollywood Principle":"Don't call us, we'll call you"

Enforces loose coupling and high cohesion

Allows you to mock collaborators

Makes you a better programmer

Questions!

Inspiring people toshare

Test-Driven Development By ExampleKent Beck, Addison-Wesley

Links & Literature

Continuous Integration – Improving Software Quality and Reducing RiskPaul M. Duvall, Addison-Wesley

xUnit Test Patterns – Refactoring Test CodeGerard Meszaros, Addison-Wesley

Inspiring people toshare

Links & LiteratureFLOW3http://flow3.typo3.org/

PHPUnithttp://www.phpunit.de/

Hudson CI-Serverhttps://hudson.dev.java.net/

TYPO3 Forgehttp://forge.typo3.org/

top related