際際滷

際際滷Share a Scribd company logo
terry.yinzhe@gmail.com
Agenda
 Background
 Motivation
 Principles
 Practices
 What is fun?
BACKGROUND
Large scale software
Telecommunication device
10+ years old
1,000 people
10,000,000 lines of code in one build
C, SDL
Some very complicated
Thousands LOCs functions
Cyclomatic complexity > 50.
Duplicate rate > 100%!
Adding Unit Test To Legacy Code
Where do we usually call it legacy code?
MOTIVATION
It's NOT about finding bugs!
The purpose of unit testing is to facilitate
changes
You still have the choice and reasons
          not to do it.
PRINCIPLES
BASIC UNIT TESTING
PRINCIPLES
PRINCIPLE 1
KEEP IT VERY SIMPLE, VERY STUPID



   It is not that the more test cases the better
       Actually, it is on the contrary, the less the better.
        The purpose of UT is to facilitate change
          It can only facilitate change if it survive
              Therefore, it needs maintainability
              So, it needs to be simple
  "The only way for humans to deal with complexity is to
  avoid it ..."
PRINCIPLE 2
DON'T TRY TO ADD GOOD UT TO BAD CODE
PRINCIPLE 3
DON'T MAKE ASSUMPTION




             Exploding stub

      error_t release_message_received(
         msg_header_t * msg ) {
         DO_FAIL_TEXT("I'm called!!");
         return SUCCESS_EC;
      }
PRINCIPLE 4
STOP MAKING 'LEGACY CODE'



  Test drive new code
  Add tests to legacy code before modification
  Test drive changes to legacy code

  Boy Scout Principle
PRINCIPLE 5
EDUCATE THE PEOPLE



  Do NOT let just one or two people do it.
  NEVER let interns do it!
WHERE TO START?
Setup the framework
 To setup the framework for legacy
 code can be very challenging.
 Choose the test framework
 We use CppUTest
  Ask for performance
Domain Modeling
 Reverse engineering to clarify the
 concepts used in the legacy code
   And their relationships
 Use the terms consistently in your
 unit testing.
 It will also give your refactoring
 a road-map.
Identify the hot area
 Start from the hot area will be most
 cost-efficient
 Example
   Through SVN log
   Along with the new work and bug fixing
Bottom-up?
 Have some integration test first
 Then,
   One practical approach is bottom-up
   Get a higher level of abstraction
Learn the function by testing it
  Characterization Test
  Start from the 1st (failing) exit
  Write your plan on a piece of paper
Make the legacy code testable
 Use safe refactoring techniques to
 change the legacy code without unit
 testing.
   Extract function
   If you are using C
     Data injection to break the dependency on
     globals.
Break Dependency
WHAT IS FUN
Bring chaos to order
Learn the feature
Delete tons of code
Feel the peace of your heart
REFERENCES
Acknowledgement

More Related Content

Adding Unit Test To Legacy Code