SpringOne Americas

Private Events

Blogs

View all Blogs >>
  • Andrew Glover

    Co-author of "Continuous Integration"

    Every once in a while the topic of code coverage surfaces, which more»

  • Stuart Halloway

    CEO of Relevance

    Programmers coming to functional languages for the first time cannot imagine life without variables. I address this head-on in the more»

  • Richard Monson-Haefel

    VP of Developer Relations, Curl Inc.

    more»

  • Neal Ford

    Application Architect at ThoughtWorks, Inc.

    The lowly whiteboard is one of my favorite tools for design work on projects: you can stand in front of it as a group, you can easily play... more»

  • Michael Nygard

    Agile technology leader and dynamicist

    Sizing, Danish Style Folks in telecommunications and operations research have used Erl more»

  • Matt Raible

    Creator of AppFuse and author of Spring Live

    It's been three weeks since I joined the realm of the unemployed. Fortunately, I more»

  • Alex Miller

    Sr. Engineer with Terracotta Inc.

    Or maybe that should be “a bit of final advice”. :) There was a more»

  • Vladimir Vivien

    Software Engineer / Consultant

    I finally downloaded the latest JDK 6 u 10 (download) recently. This is a significant re more»

  • Scott Leberknight

    Chief Architect at Near Infinity

    Re nae Bair's post on The Ranting Rubyis more»

  • Graeme Rocher

    Project Lead of the Grails Project & CTO of G2One

    Those crazy guys over at the Grails podcast interviewed me about various things ranging from being part of more»

  • Ted Neward

    Enterprise, Virtual Machine and Language Wonk

    Dustin Campbell, a self-professed "IDE guy", is speaking at the .NET Developer's Association of Redmond this evening, on the future of... more»

  • Pratik Patel

    Enterprise Architect

    There's been a 'backlash' of sorts brewing in the Java developer community over the past 2 years. From talking to my developer buddies around... more»

  • Howard Lewis Ship

    Creator of Tapestry and HiveMind

    Seems like the Mac has a huge number of RSS readers. For a while I was using Vienna, but it stopped working after a recent update (no blogs... more»

  • Mike Levin

    Software Developer specializing in Web2.0 websites

    (photo from more»

  • Brian Pontarelli

    Founder of Inversoft

    Just figured out how to get git tab completion working in zsh on a Mac. Turns out that the completion scripts use a bunch of extra git... more»

  • Erik Doernenburg

    Principal Consultant @ Thoughtworks

    If you are somebody who writes code you probably know that moment when you look at some code you didn’t write, or some code you wrote a... more»

  • Kirk Knoernschild

    Software Developer & Mentor

    more»

  • Brian Goetz

    Author of Java Concurrency in Practice

    I live in an AT&T-free state, so I have not had access to the cult that is iPhone. But recently, in preparation for AT&T moving... more»

  • Matthew Bass

    Software Developer & Entrepreneur

    Can Sphinx and foxy fixtures place nicely together? Due to the way Sphinx indexing works, foxy fixtures will often slow down the indexing... more»

  • Jason Rudolph

    Author of Getting Started with Grails

    I had the more»

  • Ryan Shriver

    Business and Technology Consulting

    more»

  • Nathaniel Schutta

    Author, speaker, software engineer focused on user interface design.

    Today we learned something important, the NTSB announced the more»

  • Jeff Brown

    SpringSource Engineering And Professional Services - Groovy and Grails Developer

    Strange enough title.Let's start with a hypothetical conversation between a geeky developer and his much less geeky wife: more»

  • Jared Richardson

    Agile coach and co-author of Ship It

    Jurgen Appelo has an ongoing interview series on his blog. He's published a lot of very smart people and I'm honored to squeak in too! ;) more»

  • David Bock

    Principal Consultant, CodeSherpas Inc.

    I have been setting up a rock-solid server cluster for a client and ran into an interesting issue trying to install Phusion Passenger onto... more»

  • Pramod Sadalage

    Co-author of "Refactoring Databases:Evolutionary Database Development"

    Consider this Hibernate mapping @Column(name = "qReferenceId") public Long getQReferenceId() { return qReferenceId; more»

  • Craig Walls

    Author of Spring in Action

    At one time not too long ago, I wasn't a big fan of annotations. But then I let my guard down and even started liking them. But now I'm... more»

  • Kenneth Kousen

    President of Kousen IT, Inc.

    In this entry in my “Making Swing Groovy” series, I want to talk about threading issues. Specifically, more»

  • Venkat Subramaniam

    Founder of Agile Developer, Inc.

    I wrote a four part article for Java World on creating DSLs in Java and Groovy. For your convenience, I decided to list the links to those... more»

  • Jason Harwig

    Senior Software Engineer at Near Infinity

    The most popular entry I've written at Near Infinity has been the more»

  • John Heintz

    Principal Consultant with New Aspects of Software

    In a recent discussion interview questions came up, here's my favorite one.To set some context this question is designed to gauge the abst more»

  • Mark Johnson

    Director of Consulting at CGI

    At the Columbus NFJS show held on July 25-27th during one of the BOF sessions Dave Bock, Scott Davis and I discussed unit tests vs functional... more»

  • Joseph Nusairat

    Author of Beginning JBoss Seam & Co-Author of Beginning Groovy & Grails

    Well i am assuming Apress has the most random site in the world at times.But today only they have our recent book, Beginning Groovy & Grai more»

  • Keith Donald

    Lead of Spring Web and Creator of Spring Web Flow

    I am pleased to announce that Developing Rich Web Applications with Spring, a three-day bootcamp lead by SpringSource engineers on web... more»

  • Pete Behrens

    Organizational Agility Coach

    Marti nig & Associates Methods & Tools group recentl more»

  • Brian Sam-Bodden

    Java author, Ruby geek and Open Source Advocate

    In this installment we are going to build the Dashboard page of the Tempo application. T more»

  • Mark Fisher

    Spring Integration Lead

    In my recent post, I had mentio more»

  • Ron Bodkin

    Chief Software Architect, Quantcast

    I'm looking forward to speaking at The Rich Web Experience conference in San Jose next month. The event runs from September 7th through 9th.... more»

  • Mark Goodwin

    Web Application Security Specialist

    We've already looked at one of the two big problems posed by anti DNS pinning on Java applets; because there's rebinding on the applet and... more»

  • Scott Davis

    Author of "Groovy Recipes" & TDD Expert

    Every time I see a live show at the Denver Botanic more»

  • Romain Guy

    Java User Interface expert.

    more»

  • Ramnivas Laddad

    Author of AspectJ in Action, Principal at SpringSource

    InfoQ.com has published my AOP myths and realities talk recorded at a No Fluff Just Stuff conference. InfoQ.com founded by Floyd Marine more»

  • David Geary

    Author of Graphic Java and co-author of Core JSF

    The 2006 NFJS tour kicked off t more»

  • Kito Mann

    Editor-in-chief of JSF Central and the author of JSF in Action

    I miss the latest.integration keyword from ivy.... more»

  • Jason Hunter

    Author of Java Servlet Programming

    I just posted the JDOM 1.1 release for download. This release includes about 20 improvements and bug fixes. more»

Unit vs Functional and Behavior testing

Posted by: Mark Johnson on 08/07/2008
At the Columbus NFJS show held on July 25-27th during one of the BOF sessions Dave Bock, Scott Davis and I discussed unit tests vs functional tests. As we all have been taught to believe that unit tests will help improve software quality. Many of the BOF attendants commented that writing Unit tests help them think about their code organization which has the affect to improve code quality. In fact most everyone in the room defended the need for writing Unit tests using tools such as JUnit to improve code quality.

I however have developed a different view. Unit tests work well when the developer understands the "true" requirements. My perceived problem with Unit tests are two fold; (1) most business users cannot understand JUnit output, thus they cannot identify where the wrong functionality was tested, and (2) If you write 2-5x LOC for testing as the original functionality, then how do you know your testing programming logic is accurate?

I have personally been focusing my projects over the last couple of years by looking at functional testing using tools such as FitNesse and WebTest, static code analysis using tools such as PMD, FindBugs and Checkstyle, and finally code coverage to make certain we have fully examined the high risk code. This strategy so far has been successful at identifying defects and risk areas long before QA encounters the defect and at a much lower cost than would have been incurred using pure JUnit. The best part of this strategy is I can take the functional test output and review it with business takeholders to gain their acceptance.

At the close of the Columbus NFJS BOF session most everyone agreed that functional testing strategies such as described above have value. But most believed that the functional testing strategy described needs to also include a strong dose of Unit testing.

The real problem mentioned, I believe by Scott is that only 10% of all projects have unit testing, and that attendees to NFJS shows are special because they are more likely to be in that 10% group. So my closing comment to this blog entry is as follows. If you are not already happily using a Unit testing strategy in your projects, and are looking for a lower cost way to improve project quality, then follow these steps in order:
  1. Setup continuous builds using any of the fine tools out there (Hudson, Cruise Control, Anthill, etc)
  2. Include static code analysis tools such as PMD, Checkstyle, FindBugs, etc in your build process. Schedule resources to resolve all of the serious problems identified by these tools.
  3. Begin writing Functional tests using tools such as FitNesse and Webtest (in a later blog posting I will describe these two tools in more details). You can setup both of these tools in a test first or test last approach. To make the most of your time, review your functional tests with the project BA's and other interested stakeholders. In a test first approach, you might find that after the stakeholder has spent some time reviewing a functional workflow that they might identify some workflow problems which they did not identify while writing stories/use cases. Such discoveries will save you lots of aggrevation later on in the project.
  4. Setup a code coverage tool (Cobertura, Emma, Clover, etc.) to identify which parts of the application are being exercised by the tests created in step 3. You don't have to achieve 100% code coverage. But you do need to spend some time to review the code which has no functional test coverage. Thus, a higher code coverage rate means less code you have to manually review. I often find that code which does not get hit by the functional test cases is either dead code or gold plated code. Either way such a review provides a great opportunity to remove extra code. Since code is a liability just waiting to become a bug, finding dead code is a great opportunity to remove future bugs.
  5. For complex code which is still not adequately tested with the functional tests, take a look at some of the BDD tools such as easyB to create behavior tests for your code. Using easyB enables you to perform tests at a unit test level, while producing BA readable artifacts. These artifacts the BA can review and agree that the test validating the intended functionality. As a developer, I also find the easyB BDD style enables me to think of my code in a much more structured approach than using traditional JUnit like tools.
Whether you still think Unit testing will solve all problems or not, or whether you are starting to see that functional and/or BDD testing is a better solution, you definitely should still plan on creating automated tests for your code prior to release for traditional QA acceptance testing.

So what do the readers of this blog posting think? I would love to hear your comments.
  • Currently 5.0/5
  • 1
  • 2
  • 3
  • 4
  • 5
5.0 rating out of 2 votes


About Mark Johnson

Mark Johnson is currently Director of Consulting at CGI where he is exploring software development management approaches to leverage offshore and local development resources to deliver high quality applications on-time and budget in a highly competitive environment.

Mark Johnson has over 20 years of software development experience in industries including Healthcare, state government, and strategic sourcing. Mark most recently has spent the last 2 years working with Commonwealth of Massachusets EOHHS to develop the NewMMIS application. The NewMMIS application makes use of J2EE, Portal, and Web Services technologies designed to modernize the existing Medicaid processing. In addition, Mark is active in the software community as the President of the New England Java Users Group. When not working, Mark can be found riding his mountain bike on local trails and playing with his family.