Introduction to
Test-Driven Development
                  Hao-Cheng Lee

    本著作係依據創用 CC Attribution-ShareAlike 3.0 Unported 授權
      條款進行授權。如欲瀏覽本授權條款之副本,請造訪 http:
   //creativecommons.org/licenses/by-sa/3.0/ ,或寄信至 Creative
   Commons, 171 Second Street, Suite 300, San Francisco, California,
                           94105, USA 。
About me

● Hao-Cheng Lee
● Java Engineer for 7+ years
● Software Engineer @ Armorize
● Interested in Java, Scala, TDD, CI
● email: haocheng.lee@gmail.com
● twitter: haocheng
● Google+: 浩誠
Download Java 7 RC Now
  Project Coin Slides
Agenda

● What is TDD?

● Why use TDD?

● How to do TDD?

● Pros and Cons

● How do I start?
TDD
    =
   TFD
    +
Refactoring
Not about
writing tests...
TDD is about
writing better
     code
from http://ch.englishbaby.com/forum/LifeTalk/thread/441379
Test Myths
I have no time
   for testing
Technical Debt




 from http://www.freedebtadvice-uk.com/
My code is
BUG-FREE!
from http://vincentshy.pixnet.net/blog/post/5397455
QA will do the
   testing
Black Box Testing




 from http://www.jasonser.com/marketing-black-box/
http://www.ocoee.org/Departments/HR/
Faster



from http://cllctr.com/view/c2fdb4d2625e109069c843ea1bb99e50
from Test Driven Development Tutorial by Kirrily Robert
Faster

● Shorter release cycle

● Automation saves time

● Find bugs earlier
Better




from http://www.nataliedee.com/archives/2005/sep/
Better

● Greater code coverage

● The courage to refactor

● Prevent regression bugs

● Improve your design
"I'm not a great programmer;
I'm just a good programmer
with great habits."
                  - Kent Beck
Testing the Old Way
TDD
TDD
How to do TDD?

● Design: figure out what you want to do
● Test: write a test to express the design
   ○ It should FAIL
● Implement: write the code
● Test again
   ○ It should PASS
Design

We need a method add(), which
 takes two parameters and add
them together, then it will return
           the result.
Test
FAIL
java.lang.AssertionError: expected:<2> but was:<0>
...
at tw.idv.haocheng.play.
CalculatorTest.one_plus_one_is_two
(CalculatorTest.java:20)
Implement
PASS
Write the least code
to make the test pass
More Test
FAIL
java.lang.AssertionError: expected:<4> but was:<2>
...
at tw.idv.haocheng.play.
CalculatorTest.two_plus_two_is_four
(CalculatorTest.java:25)
Implement
PASS
Design

The add() method only accept
      positive numbers
Test
FAIL
java.lang.AssertionError: IllegalArgumentException expected
at org.junit.Assert.fail(Assert.java:91)
at tw.idv.haocheng.play.
CalculatorTest.negative_numbers_will_throw_exception
(CalculatorTest.java:32)
Implement
PASS
from http://www.oracle.com/
Design

We need a addNewCustomer()
method that will save a customer
     record in Database
Test
Test
FAIL

java.lang.NullPointerException
at tw.idv.haocheng.CustomerDAOTest.addNewCustomer
(CustomerDAOTest.java:24)
Implement
PASS
from https://www.google.com/accounts/NewAccount
Design

  We hava a page that user
can apply for a new account
Test
Test
FAIL

wicket.markup.MarkupException: Unable to find
component with id 'accountFormPanel' in
[MarkupContainer ....
at ngc.account.wicket.edit.CreateAccountPageTest.
setUp
(CreateAccountPageTest.java:49)
Implement
PASS
Unit Test Frameworks

● Java - JUnit
● Python - PyUnit
● PHP - PHPUnit
● Ruby - Test:Unit
● Javascript - Jasmine
● .Net - NUnit
There's No Silver Bullet




from http://www.penn-olson.com/2009/12/22/social-media-the-silver-bullet/
Costs




from http://ora-pl-sql.blogspot.com/2011/05/database-costs.html
It takes time...



from http://chunkeat626.blogspot.com/2010_11_01_archive.html
Need to
maintain tests
TDD is not suitable for...
   from http://www.flickr.com/photos/ilike/2443295369/
from http://tw.gamelet.com/game.do?code=heroes
from http://dilbert.com/
But how do I start??




from http://zekjevets.blogspot.com/2010/02/alternative-racism.html
from http://www.alexbolboaca.ro/wordpress/the-remote-pair-programming-tour
Suggestions

● Prepare tools and environments

● Learn to write Unit test

● Start from easy ones
Reading List

● The Bowling Game Kata
● Unit Testing Guidelines
● Why are we embarrassed to admit that we don’t know how
  to write tests? (中譯版本)
● "The Clean Code Talks -- Unit Testing"
● Top 10 things which make your code hard to test
References - Test-Driven Development

● Test Driven Development Tutorial by Kirrily Robert
● Engineer Notebook: An Extreme Programming Episode by
  Robert C. Martin and Robert S. Koss
● Technical Debt by Martin Fowler
● InfoQ: Testing Misconceptions by Liam O'Connor
● Unit Test Isolation
● Erratic Test
● Singletons are Evil
● RSpec 讓你愛上寫測試
Introduction to test_driven_development

Introduction to test_driven_development