SlideShare a Scribd company logo
1 of 58
Download to read offline
&
FÉLIX-ANTOINE
BOURBONNAIS
B.ING., M.SC, PSM
Version: Mai 2017 (DEV)
Characterization Testing :
regaining control
of your Legacy Code
PASCAL ROY
ING., CSM, PSM, PMP
Think how Legacy code affects
your work in everyday life…
Imagine a tool that helps you
explore, understand and
refactor it without fear.
… a nice dream, isn’t?
4
Qui sommes-nous ?
Pascal Roy
Ing., PSM, CSM, PMP
Félix-Antoine Bourbonnais
B.ing., PSM, M.Sc.
Training Mentoring Diagnostics Talks
Speakers
Trainers
Coaches
&
Mentors
Tech.
Team &
Business
Mgmt.
TDD
Emergent
architecture
Automated
tests
DDD
…
Scrum
Agile QA
Project
management
Agility
BDD
> We are
Strategic
advice
> What we do
Am I the only one to
have Legacy Code ?
Code that is difficult to
modify and evolve.
Regardless how old it is or
why it got this way.
What is Legacy Code ?
• Code written by others
• Code nobody wants to touch anymore
• Code no longer supported by the people who wrote it
• Code that could be rewritten using better coding practices, tools
or languages
• ...
Other popular definitions …
Code without tests
Michael Feathers,
Working Effectively with Legacy Code
Two basic
strategies…
What to do with my Legacy Code ?
Fear : software
development’s worst
enemy
Tired of the continuous stress
of delivery, of endless
debugging sessions, of the fear
of breaking something?
Please, give me a
new project
!@/$%!/%
The cycle of death…
Legacy Code No tests
No
refactoringPatches
Why not
rejuvenate
your code?
Correctly equipped,
yes you can !
Gradually,
while still producing
business value
Pick your next « Story »
and begin paying out
some of that debt!
Characterization
test
A characterization test describes the actual behavior
of an existing piece of code.
- Michael Feathers
Overcome fear!
To…
Understand and
document what
the code does
Protect against
unintended
changes when
refactoring
+
1. Find and isolate a piece of code that you need to analyze or
modify
2. Write a test that uses that code, use an assertion you know
will fail
3. Execute the test and let it tell you the actual behavior
4. Change the test assertion and the naming to match the actual
behavior
5. Repeat…
5 steps for writing a characterization test
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
public double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR + (tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1 +
(tSales - BQ * 2) * BCR * OQM2;
}
}
}
http://s3.amazonaws.com/giles/demons_010609/wtfm.jpg
An example of Legacy Code?
WTF?
WTF?
WTF?
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
public double calculate(double tSales){
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1 +
(tSales - BQ * 2) * BCR * OQM2;
}
}
}
@Test
public void test… {
assert(...)
}
Step 1: identify a piece of code to characterize
1
?
2
? ?
1
2
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1+
(tSales - BQ*2)*BCR * OQM2;
}
}
}
@Test
public void testCalculate() {
assertEquals(
0.0,
SalesUtil.calculate(1000.0)
);
}
Step 2: write a failing assertion
1
?
2
? ?
1
2
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1 +
(tSales - BQ * 2) * BCR * OQM2;
}
}
}
@Test
public void testCalculate() {
assertEquals(
0.0,
SalesUtil.calculate(1000.0)
);
}
Step 3: execute the test
+ find out the actual behavior is
> junit.framework.AssertionFailedError:
expected:<0.0> but was:<200.0>1
?
2
? ?
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1+
(tSales – BQ*2)*BCR * OQM2;
}
}
}
@Test
public void
lessThanBaseQuota_useBaseCommissionRate() {
assertEquals(
200.0,
SalesUtil.calculate(1000.0)
);
}
Step 4: Replace the assertion by the actual behavior
1
2
1
200
2
? ?
public class SalesUtil {
double BQ = 1000.0;
double BCR = 0.20;
double OQM1 = 1.5;
double OQM2 = OQM1 * 2;
double calculate(double tSales) {
if (tSales <= BQ) {
return tSales * BCR;
} else if (tSales <= BQ * 2) {
return (BQ) * BCR +
(tSales - BQ) * BCR * OQM1;
} else {
return (BQ) * BCR +
(tSales - BQ) * BCR*OQM1+
(tSales – BQ*2) * BCR*OQM2;
}
}
}
…
@Test
public void testCalculate () {
assertEquals(
0.0,
SalesUtil.calculate(2000.0)
);
}
Step 5: Repeat
1
2
1
200
2
? ?
Watch out for :
« While we’re at it, we might as well… » !
Work only on what you need to modify now.
We really don’t have the time
for this ?!?
How long does it take to understand
a piece of Legacy code before you
can change it (reasonably safely)?
• Specifies required
behavior
• Known behavior
and new code
• Permanent
• Specifies actual
behavior
• Legacy code, Lost or
forgotten behavior
• Temporary
Unit test Characterization test
How is a CT different?
Will end-to-end tests around my
application help me characterize
my code?
Refactoring is not a
rewrite on a small scale!
Why are
managers/customers/project
managers so afraid of refactoring?
Watch out for Big Bang refactoring !
46
A big expense
Big Bang
Very high risk
No new business value
Regular payments (debt)
Step by Step
Lower risk
Still produce value
Rewrite Renovate / Rejuvenate
Rewrite or refactoring ?!?
A strategy
> stabilize the patient
and focus on what is most
critical
As in the emergency room…
Let what you are
currently working on
guide your efforts
This talk was about understanding and securing your Legacy Code….
Now, you can learn how to mercilessly renovate your Legacy Code:
• Sprout Methods/Classes
• Instance Delegator
• Extract to Method
• …
Next… Refactoring techniques
Maintainability: a great
challenge for the future
Code rot
is avoidable
Although our first joy of programming may have
been intense, the misery of dealing with legacy code
is often sufficient to extinguish that flame.
Michael Feathers,
Working Effectively with Legacy Code
Legacy code can kill the flame!
Imagede http://beinweb.fr/wp-content/uploads/2014/04/boite-a-outils-entrepreneurs.jpg
Characterization testing…
Another tool to add to your toolbox!
« Legacy code » can be treated !
Thank
you.
Site
elapsetech.com
Twitter
@fbourbonnais
Email
fbourbonnais@elapsetech.com
pascalroy@elapsetech.com
LinkedIn
linkedin.com/in/fbourbonnais
ca.linkedin.com/in/roypa
conferences.elapsetech.com
All our conferences (french)
conferences.elapsetech.com
/legacy-tests-caracterisation
Slides and references (french)
Félix-Antoine Bourbonnais
Pascal Roy

More Related Content

Similar to Characterization Testing : regaining control of your Legacy Code [EN]

Meg bernal insight2014 4219
Meg bernal insight2014 4219Meg bernal insight2014 4219
Meg bernal insight2014 4219Peter Schouboe
 
From clever code to better code
From clever code to better codeFrom clever code to better code
From clever code to better codeDror Helper
 
Evolving a Clean, Pragmatic Architecture at JBCNConf 2019
Evolving a Clean, Pragmatic Architecture at JBCNConf 2019Evolving a Clean, Pragmatic Architecture at JBCNConf 2019
Evolving a Clean, Pragmatic Architecture at JBCNConf 2019Victor Rentea
 
C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2Hammad Rajjoub
 
C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2Hammad Rajjoub
 
20.1 Java working with abstraction
20.1 Java working with abstraction20.1 Java working with abstraction
20.1 Java working with abstractionIntro C# Book
 
Mutation Testing with PIT
Mutation Testing with PITMutation Testing with PIT
Mutation Testing with PITRafał Leszko
 
關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......hugo lu
 
Mutation testing with PIT
Mutation testing with PITMutation testing with PIT
Mutation testing with PITRafał Leszko
 
How I Learned to Stop Worrying and Love Legacy Code
How I Learned to Stop Worrying and Love Legacy CodeHow I Learned to Stop Worrying and Love Legacy Code
How I Learned to Stop Worrying and Love Legacy CodeGene Gotimer
 
Avoiding cursors with sql server 2005 tech republic
Avoiding cursors with sql server 2005   tech republicAvoiding cursors with sql server 2005   tech republic
Avoiding cursors with sql server 2005 tech republicKaing Menglieng
 
Navigating the xDD Alphabet Soup
Navigating the xDD Alphabet SoupNavigating the xDD Alphabet Soup
Navigating the xDD Alphabet SoupDror Helper
 
Presentation slides: "How to get 100% code coverage"
Presentation slides: "How to get 100% code coverage" Presentation slides: "How to get 100% code coverage"
Presentation slides: "How to get 100% code coverage" Rapita Systems Ltd
 
Cis 115 Education Redefined-snaptutorial.com
Cis 115 Education Redefined-snaptutorial.comCis 115 Education Redefined-snaptutorial.com
Cis 115 Education Redefined-snaptutorial.comrobertledwes38
 
Bdd for-dso-1227123516572504-8
Bdd for-dso-1227123516572504-8Bdd for-dso-1227123516572504-8
Bdd for-dso-1227123516572504-8Frédéric Delorme
 

Similar to Characterization Testing : regaining control of your Legacy Code [EN] (20)

Meg bernal insight2014 4219
Meg bernal insight2014 4219Meg bernal insight2014 4219
Meg bernal insight2014 4219
 
From clever code to better code
From clever code to better codeFrom clever code to better code
From clever code to better code
 
Evolving a Clean, Pragmatic Architecture at JBCNConf 2019
Evolving a Clean, Pragmatic Architecture at JBCNConf 2019Evolving a Clean, Pragmatic Architecture at JBCNConf 2019
Evolving a Clean, Pragmatic Architecture at JBCNConf 2019
 
C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2
 
C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2
 
20.1 Java working with abstraction
20.1 Java working with abstraction20.1 Java working with abstraction
20.1 Java working with abstraction
 
Mutation Testing with PIT
Mutation Testing with PITMutation Testing with PIT
Mutation Testing with PIT
 
關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......
 
Mutation testing with PIT
Mutation testing with PITMutation testing with PIT
Mutation testing with PIT
 
2-Functions.pdf
2-Functions.pdf2-Functions.pdf
2-Functions.pdf
 
How I Learned to Stop Worrying and Love Legacy Code
How I Learned to Stop Worrying and Love Legacy CodeHow I Learned to Stop Worrying and Love Legacy Code
How I Learned to Stop Worrying and Love Legacy Code
 
Avoiding cursors with sql server 2005 tech republic
Avoiding cursors with sql server 2005   tech republicAvoiding cursors with sql server 2005   tech republic
Avoiding cursors with sql server 2005 tech republic
 
Navigating the xDD Alphabet Soup
Navigating the xDD Alphabet SoupNavigating the xDD Alphabet Soup
Navigating the xDD Alphabet Soup
 
Presentation slides: "How to get 100% code coverage"
Presentation slides: "How to get 100% code coverage" Presentation slides: "How to get 100% code coverage"
Presentation slides: "How to get 100% code coverage"
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Write bulletproof trigger code
Write bulletproof trigger codeWrite bulletproof trigger code
Write bulletproof trigger code
 
Code Refactoring
Code RefactoringCode Refactoring
Code Refactoring
 
Cis 115 Education Redefined-snaptutorial.com
Cis 115 Education Redefined-snaptutorial.comCis 115 Education Redefined-snaptutorial.com
Cis 115 Education Redefined-snaptutorial.com
 
Bdd for-dso-1227123516572504-8
Bdd for-dso-1227123516572504-8Bdd for-dso-1227123516572504-8
Bdd for-dso-1227123516572504-8
 
Apex Unit Testing in the Real World
Apex Unit Testing in the Real WorldApex Unit Testing in the Real World
Apex Unit Testing in the Real World
 

Recently uploaded

Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 

Recently uploaded (20)

Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 

Characterization Testing : regaining control of your Legacy Code [EN]

  • 1. & FÉLIX-ANTOINE BOURBONNAIS B.ING., M.SC, PSM Version: Mai 2017 (DEV) Characterization Testing : regaining control of your Legacy Code PASCAL ROY ING., CSM, PSM, PMP
  • 2. Think how Legacy code affects your work in everyday life… Imagine a tool that helps you explore, understand and refactor it without fear. … a nice dream, isn’t?
  • 3.
  • 4. 4 Qui sommes-nous ? Pascal Roy Ing., PSM, CSM, PMP Félix-Antoine Bourbonnais B.ing., PSM, M.Sc.
  • 7.
  • 8. Am I the only one to have Legacy Code ?
  • 9. Code that is difficult to modify and evolve. Regardless how old it is or why it got this way. What is Legacy Code ?
  • 10. • Code written by others • Code nobody wants to touch anymore • Code no longer supported by the people who wrote it • Code that could be rewritten using better coding practices, tools or languages • ... Other popular definitions …
  • 11. Code without tests Michael Feathers, Working Effectively with Legacy Code
  • 12.
  • 13. Two basic strategies… What to do with my Legacy Code ?
  • 15. Tired of the continuous stress of delivery, of endless debugging sessions, of the fear of breaking something?
  • 16. Please, give me a new project !@/$%!/%
  • 17. The cycle of death… Legacy Code No tests No refactoringPatches
  • 18.
  • 22. Pick your next « Story » and begin paying out some of that debt!
  • 23.
  • 25.
  • 26. A characterization test describes the actual behavior of an existing piece of code. - Michael Feathers
  • 27. Overcome fear! To… Understand and document what the code does Protect against unintended changes when refactoring +
  • 28.
  • 29. 1. Find and isolate a piece of code that you need to analyze or modify 2. Write a test that uses that code, use an assertion you know will fail 3. Execute the test and let it tell you the actual behavior 4. Change the test assertion and the naming to match the actual behavior 5. Repeat… 5 steps for writing a characterization test
  • 30. public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; public double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1 + (tSales - BQ * 2) * BCR * OQM2; } } } http://s3.amazonaws.com/giles/demons_010609/wtfm.jpg An example of Legacy Code? WTF? WTF? WTF?
  • 31. public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; public double calculate(double tSales){ if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1 + (tSales - BQ * 2) * BCR * OQM2; } } } @Test public void test… { assert(...) } Step 1: identify a piece of code to characterize 1 ? 2 ? ? 1 2
  • 32. public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1+ (tSales - BQ*2)*BCR * OQM2; } } } @Test public void testCalculate() { assertEquals( 0.0, SalesUtil.calculate(1000.0) ); } Step 2: write a failing assertion 1 ? 2 ? ? 1 2
  • 33. public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1 + (tSales - BQ * 2) * BCR * OQM2; } } } @Test public void testCalculate() { assertEquals( 0.0, SalesUtil.calculate(1000.0) ); } Step 3: execute the test + find out the actual behavior is > junit.framework.AssertionFailedError: expected:<0.0> but was:<200.0>1 ? 2 ? ?
  • 34. public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1+ (tSales – BQ*2)*BCR * OQM2; } } } @Test public void lessThanBaseQuota_useBaseCommissionRate() { assertEquals( 200.0, SalesUtil.calculate(1000.0) ); } Step 4: Replace the assertion by the actual behavior 1 2 1 200 2 ? ?
  • 35. public class SalesUtil { double BQ = 1000.0; double BCR = 0.20; double OQM1 = 1.5; double OQM2 = OQM1 * 2; double calculate(double tSales) { if (tSales <= BQ) { return tSales * BCR; } else if (tSales <= BQ * 2) { return (BQ) * BCR + (tSales - BQ) * BCR * OQM1; } else { return (BQ) * BCR + (tSales - BQ) * BCR*OQM1+ (tSales – BQ*2) * BCR*OQM2; } } } … @Test public void testCalculate () { assertEquals( 0.0, SalesUtil.calculate(2000.0) ); } Step 5: Repeat 1 2 1 200 2 ? ?
  • 36. Watch out for : « While we’re at it, we might as well… » ! Work only on what you need to modify now.
  • 37.
  • 38. We really don’t have the time for this ?!?
  • 39. How long does it take to understand a piece of Legacy code before you can change it (reasonably safely)?
  • 40.
  • 41. • Specifies required behavior • Known behavior and new code • Permanent • Specifies actual behavior • Legacy code, Lost or forgotten behavior • Temporary Unit test Characterization test How is a CT different?
  • 42. Will end-to-end tests around my application help me characterize my code?
  • 43.
  • 44. Refactoring is not a rewrite on a small scale!
  • 46. Watch out for Big Bang refactoring ! 46
  • 47. A big expense Big Bang Very high risk No new business value Regular payments (debt) Step by Step Lower risk Still produce value Rewrite Renovate / Rejuvenate Rewrite or refactoring ?!?
  • 48. A strategy > stabilize the patient and focus on what is most critical As in the emergency room…
  • 49. Let what you are currently working on guide your efforts
  • 50.
  • 51. This talk was about understanding and securing your Legacy Code…. Now, you can learn how to mercilessly renovate your Legacy Code: • Sprout Methods/Classes • Instance Delegator • Extract to Method • … Next… Refactoring techniques
  • 54. Although our first joy of programming may have been intense, the misery of dealing with legacy code is often sufficient to extinguish that flame. Michael Feathers, Working Effectively with Legacy Code Legacy code can kill the flame!
  • 56. « Legacy code » can be treated !