SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  1	
  
Automated Debugging with 	
  
git bisect	
  
TDD
Camille	
  Bell	
  
Agile	
  Coach	
  /	
  Rails	
  Developer	
  
cbell@CamilleBellConsul9ng.com	
  
Twi6er	
  @agilecamille	
  
h;p://www.slideshare.net/Camille_Bell/	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  2	
  
How	
  do	
  you	
  find	
  a	
  bug	
  in	
  a	
  large	
  	
  
code	
  base	
  with	
  lots	
  of	
  commits?	
  
1st	
   2nd	
  
3rd	
   4th	
  
97th	
   98th	
   99th	
  
100th	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  3	
  
Debugging	
  Op9ons	
  
•  Manually	
  inspect	
  all	
  the	
  code	
  and	
  hope	
  you	
  
find	
  the	
  bug	
  	
  !"
•  Logically	
  eliminate	
  some	
  of	
  the	
  code,	
  inspect	
  
all	
  the	
  rest	
  and	
  hope	
  you	
  find	
  the	
  bug	
  	
  !	
  
•  Use	
  automa9on	
  to	
  find	
  your	
  bug	
  fast	
  	
  ☺	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  4	
  
Steps	
  to	
  Target	
  the	
  Buggy	
  Code	
  
•  Create	
  new	
  or	
  use	
  an	
  exis9ng	
  automated	
  bug	
  
detector	
  to	
  dis9nguish	
  between	
  bug	
  free	
  code	
  
from	
  buggy	
  code	
  (usually	
  an	
  automated	
  test)	
  
•  Determine	
  the	
  bug	
  commit	
  range	
  
–  Use	
  git log	
  	
  if	
  needed	
  
•  Use	
  git bisect
–  Run	
  the	
  test	
  
–  Use	
  	
  git diff	
  	
  to	
  narrow	
  bug	
  to	
  code	
  lines	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  5	
  
Automa9ng	
  Bug	
  Detec9on	
  
•  Perhaps	
  you	
  already	
  have	
  a	
  good	
  automated	
  test,	
  
but	
  weren’t	
  running	
  it	
  with	
  every	
  commit.	
  Use	
  
that	
  test	
  (and	
  set	
  up	
  a	
  CI	
  server	
  soon).	
  
•  If	
  not	
  create	
  a	
  new	
  test	
  that	
  should	
  fail	
  (RED)	
  
when	
  the	
  bug	
  is	
  present	
  and	
  pass	
  (GREEN)	
  when	
  
the	
  bug	
  is	
  fixed.	
  	
  
–  Write	
  the	
  test	
  in	
  whatever	
  test	
  language	
  makes	
  sense	
  
(e.g.	
  RSpec	
  for	
  low	
  level	
  Ruby,	
  Cucumber	
  high	
  level	
  
behavior,	
  Jasmine	
  for	
  JavaScript,	
  JUnit	
  for	
  Java,	
  NUnit	
  
for	
  C#,	
  etc.)	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  6	
  
Verify	
  the	
  Test	
  Catches	
  the	
  Bug	
  
•  Run	
  the	
  test	
  on	
  the	
  latest	
  buggy	
  code	
  and	
  
watch	
  it	
  fail	
  (RED).	
  
•  Go	
  back	
  to	
  a	
  known	
  good	
  commit,	
  run	
  the	
  test	
  
and	
  watch	
  it	
  pass	
  (GREEN).	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  7	
  
$ rspec . –color
F.
Failures:
1) Account depositing to account produces the correct balance
when 9 dollars is deposited the balance is 10 dollars
Failure/Error: @account.balance.should == 1000
expected: 1000
got: 999.9999 (using ==)
# ./account_spec.rb:15:in `block (3 levels) in <top
(required)>'
Finished in 0.00058 seconds
2 examples, 1 failure
Failed examples:
rspec ./account_spec.rb:12 # Account depositing to account
produces the correct balance when 9 dollars is deposited the
balance is 10 dollars
$
Verifying	
  Failure	
  on	
  	
  Known	
  Bad	
  Commit	
  	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  8	
  
$ rspec . –color
..
Finished in 0.00047 seconds
2 examples, 0 failures
$
Verifying	
  Success	
  on	
  a	
  
Known	
  Good	
  Commit	
  	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  9	
  
Running	
  	
  git bisect 	
  
•  Start	
  with	
  a	
  known	
  bad	
  git repository	
  
–  $	
  git bisect start
–  $	
  git bisect bad
–  $	
  git bisect good <good_commit>	
  
•  Run	
  your	
  tests	
  
•  If	
  the	
  test	
  passes	
  
–  $	
  git bisect good
•  If	
  the	
  test	
  fails	
  
–  $ git bisect bad
•  Repeat	
  un9l	
  you	
  find	
  the	
  bad	
  commit
Use	
  either	
  tag	
  
	
  or	
  git	
  commit	
  #	
  
If	
  needed	
  checkout	
  a	
  
bad	
  git	
  commit	
  #	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  10	
  
!"#"#"#"#" #"#"#"
Determine	
  the	
  Bug	
  Commit	
  Range:	
  
• 	
  	
  The	
  last	
  known	
  commit	
  without	
  the	
  bug	
  
• 	
  	
  The	
  first	
  commit	
  aeer	
  the	
  bug	
  observed	
  
Star9ng	
  
Good	
  
Commit	
  
Star9ng	
  
Bad	
  
Commit	
  
Bug	
  Inserted	
  Within	
  	
  
These	
  8	
  Commits	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  11	
  
git bisect does	
  a	
  binary	
  
search	
  through	
  your	
  commit	
  range.	
  
!"#"#"#"#" #"#"#"
Good	
  	
  
Commit	
  
Bad	
  	
  
Commit	
  
bisect	
  	
  
Star9ng	
  	
  	
  
Commit	
  
bisect begins	
  with	
  the	
  commit	
  halfway	
  between	
  
the	
  known	
  good	
  commit	
  and	
  the	
  known	
  bad	
  commit	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  12	
  
Assume	
  the	
  1st	
  test	
  on	
  bisect failed.	
  
!"!"#"#"#" !"!"!"
Good	
  	
  
Commit	
  
Bad	
  	
  
Commit	
  
bisect	
  	
  
Next	
  	
  	
  
Commit	
  
	
  Then	
  	
  bisect would	
  select	
  the	
  commit	
  between	
  the	
  
known	
  good	
  commit	
  and	
  the	
  last	
  bad	
  bisect	
  
Bad	
  	
  
Commit	
  
Can	
  ignore	
  
these	
  Commits	
  
Bug	
  inserted	
  Within	
  	
  
These	
  4	
  Commits	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  13	
  
Assume	
  the	
  2nd	
  test	
  on	
  bisect passed.	
  
!"!"#" !"!"!"
Good	
  	
  
Commit	
  
Bad	
  	
  
Commit	
  
	
  Then	
  	
  bisect would	
  select	
  the	
  commit	
  between	
  the	
  
last	
  known	
  good	
  commit	
  and	
  the	
  last	
  bad	
  bisect	
  
Bad	
  	
  
Commit	
  
Can	
  ignore	
  
these	
  Commits	
  
Bug	
  inserted	
  Within	
  	
  
These	
  2	
  Commits	
  
Can	
  ignore	
  
these	
  Commits	
  
Good	
  	
  
Commit	
  
bisect	
  	
  
Next	
  	
  	
  
Commit	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  14	
  
If	
  the	
  3rd	
  test	
  on	
  bisect failed.	
  
!"!"!" !"!"!"
Good	
  	
  
Commit	
  
Bad	
  	
  
Commit	
  
	
  Then	
  that	
  commit	
  is	
  where	
  the	
  bug	
  was	
  inserted.	
  	
  
Bad	
  	
  
Commit	
  
Can	
  ignore	
  
these	
  Commits	
  
Bug	
  inserted	
  Within	
  	
  
These	
  2	
  Commits	
  
Can	
  ignore	
  
these	
  Commits	
  
Good	
  	
  
Commit	
  
Final	
  
Commit	
  	
  	
  
Failed	
  
Test	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  15	
  
If	
  the	
  3rd	
  test	
  on	
  bisect passed.	
  
!"!"!"!"!"
Good	
  	
  
Commit	
  
Bad	
  	
  
Commit	
  
	
  Then	
  the	
  next	
  commit	
  is	
  where	
  the	
  bug	
  was	
  inserted.	
  	
  
Bad	
  	
  
Commit	
  
Can	
  ignore	
  
these	
  Commits	
  
Bug	
  inserted	
  Within	
  	
  
These	
  2	
  Commits	
  
Can	
  ignore	
  
these	
  Commits	
  
Good	
  	
  
Commit	
  
Final	
  
Commit	
  	
  	
  
Passed	
  
Test	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  16	
  
Example	
  Test	
  
require_rela9ve	
  'account'	
  
describe	
  Account	
  do	
  
	
  	
  before	
  do	
  
	
  	
  	
  	
  @star9ng_balance_in_pennies	
  =	
  100	
  
	
  	
  	
  	
  @account	
  =	
  Account.new(@star9ng_balance_in_pennies)	
  	
  	
  	
  	
  
	
  	
  end	
  
	
  	
  context	
  "deposi9ng	
  to	
  account	
  produces	
  the	
  correct	
  balance"	
  do	
  
	
  	
  	
  	
  it	
  "when	
  9	
  dollars	
  is	
  deposited	
  the	
  balance	
  is	
  10	
  dollars"	
  do	
  	
  	
  
	
  	
  	
  	
  	
  	
  deposit_amount_in_pennies	
  =	
  900	
  
	
  	
  	
  	
  	
  	
  @account.deposit(deposit_amount_in_pennies)	
  
	
  	
  	
  	
  	
  	
  @account.balance.should	
  ==	
  1000	
  
	
  	
  	
  	
  end	
  
	
  	
  end	
  
end	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  17	
  
Some9mes	
  the	
  Commit	
  Messages	
  	
  
from	
  git log Pinpoint	
  the	
  Bug	
  
$ git log --pretty="%h - %s"
561bb3a - added withdrawal and deposit messages
6ca7ee1 - added error
c546d1f - added to_s
1974592 - added withdrawal
7a8c508 - Initial commit
But	
  usually	
  the	
  log	
  only	
  provides	
  a	
  range	
  
Known	
  
Good	
  
Commit	
  
Known	
  
Bad	
  
Commit	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  18	
  
Star9ng	
  up	
  git bisect with 	
  
Test	
  on	
  the	
  Middle	
  git Commit 	
  
$ git bisect start
Already on 'master’
$ git bisect bad
$ git bisect good 7a8c508
Bisecting: 1 revision left to test after this (roughly
1 step)
[c546d1f89b5b0c14ab160e227fc83d62fb780e6f] added to_s
$ rspec . --color
..
Finished in 0.00071 seconds
2 examples, 0 failures
$ git bisect good
Bisecting: 0 revisions left to test after this (roughly
0 steps)
[6ca7ee1909bf0b3f7344feee25a5b44a97602e2c] added error
Known	
  Good	
  Commit	
  
Known	
  Bad	
  Commit	
  
If	
  the	
  tests	
  pass,	
  	
  
Tell	
  	
  git bisect good
Otherwise	
  git bisect bad
C	
  
O	
  
M	
  
M	
  
I	
  
T	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  19	
  
Test	
  on	
  the	
  final	
  git commit 	
  
$ rspec . --color
F.
Failures:
1) Account depositing to account produces the correct balance when 9
dollars is deposited the balance is 10 dollars
Failure/Error: @account.balance.should == 1000
expected: 1000
got: 999.9999 (using ==)
# ./account_spec.rb:15:in `block (3 levels) in <top (required)>'
Finished in 0.00053 seconds
2 examples, 1 failure
Failed examples:
rspec ./account_spec.rb:12 # Account depositing to account produces
the correct balance when 9 dollars is deposited the balance is 10
dollars
$
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  20	
  
$ git diff c546d1f 6ca7ee1
diff --git a/account.rb b/account.rb
index a979e55..0a572ef 100644
--- a/account.rb
+++ b/account.rb
@@ -5,7 +5,7 @@ class Account
end
def deposit(new_deposit)
- @balance += new_deposit
+ @balance += (new_deposit - 0.0001)
end
def withdrawl(new_withdrawl)
$
git diff Targets	
  the	
  Bug	
  Even	
  More	
  
Good	
  Commit	
  
Just	
  Before	
  Bug	
  
Commit	
  Where	
  
Bug	
  First	
  Appeared	
  
Bug	
  inserted	
  in	
  one	
  or	
  
more	
  of	
  the	
  +	
  lines.	
  
cbell@CamilleBellConsul/ng.com	
  	
  	
  	
  	
  	
  	
  21	
  
Thank You for Listening	
  
Camille	
  Bell	
  
Agile	
  Coach	
  /	
  Rails	
  Developer	
  
cbell@CamilleBellConsul9ng.com	
  
Twi6er	
  @agilecamille	
  
h;p://www.slideshare.net/Camille_Bell/	
  

Mais conteúdo relacionado

Mais procurados

Structural testing
Structural testingStructural testing
Structural testing
Slideshare
 
1. Introduction to PnR.pptx
1. Introduction to PnR.pptx1. Introduction to PnR.pptx
1. Introduction to PnR.pptx
Ahmed Abdelazeem
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Luis Goldster
 
4 greedy methodnew
4 greedy methodnew4 greedy methodnew
4 greedy methodnew
abhinav108
 

Mais procurados (20)

Google test training
Google test trainingGoogle test training
Google test training
 
0-1 KNAPSACK PROBLEM
0-1 KNAPSACK PROBLEM0-1 KNAPSACK PROBLEM
0-1 KNAPSACK PROBLEM
 
N Queens problem
N Queens problemN Queens problem
N Queens problem
 
Structural testing
Structural testingStructural testing
Structural testing
 
Minimization of DFA
Minimization of DFAMinimization of DFA
Minimization of DFA
 
JTAG Interface (Intro)
JTAG Interface (Intro)JTAG Interface (Intro)
JTAG Interface (Intro)
 
Code tuning techniques
Code tuning techniquesCode tuning techniques
Code tuning techniques
 
1. Introduction to PnR.pptx
1. Introduction to PnR.pptx1. Introduction to PnR.pptx
1. Introduction to PnR.pptx
 
ASIC Design.pdf
ASIC Design.pdfASIC Design.pdf
ASIC Design.pdf
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Code Tuning
Code TuningCode Tuning
Code Tuning
 
Structure testing
Structure testingStructure testing
Structure testing
 
4 greedy methodnew
4 greedy methodnew4 greedy methodnew
4 greedy methodnew
 
Mealy and moore machine
Mealy and moore machineMealy and moore machine
Mealy and moore machine
 
GUI for DRV fix in ICC2
GUI for DRV fix in ICC2GUI for DRV fix in ICC2
GUI for DRV fix in ICC2
 
SystemVerilog OOP Ovm Features Summary
SystemVerilog OOP Ovm Features SummarySystemVerilog OOP Ovm Features Summary
SystemVerilog OOP Ovm Features Summary
 
Phases of Compiler
Phases of CompilerPhases of Compiler
Phases of Compiler
 
Python Programming | JNTUK | UNIT 2 | Lecture 6 & 7 | Conditional & Control S...
Python Programming | JNTUK | UNIT 2 | Lecture 6 & 7 | Conditional & Control S...Python Programming | JNTUK | UNIT 2 | Lecture 6 & 7 | Conditional & Control S...
Python Programming | JNTUK | UNIT 2 | Lecture 6 & 7 | Conditional & Control S...
 
How to create SystemVerilog verification environment?
How to create SystemVerilog verification environment?How to create SystemVerilog verification environment?
How to create SystemVerilog verification environment?
 
Chess board problem(divide and conquer)
Chess board problem(divide and conquer)Chess board problem(divide and conquer)
Chess board problem(divide and conquer)
 

Semelhante a Automate Debugging with git bisect

Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
Kerry Buckley
 

Semelhante a Automate Debugging with git bisect (20)

Week 5
Week 5Week 5
Week 5
 
Week 5
Week 5Week 5
Week 5
 
des mutants dans le code.pdf
des mutants dans le code.pdfdes mutants dans le code.pdf
des mutants dans le code.pdf
 
Clearly, I Have Made Some Bad Decisions
Clearly, I Have Made Some Bad DecisionsClearly, I Have Made Some Bad Decisions
Clearly, I Have Made Some Bad Decisions
 
Enjoy fighting regressions_with_git_bisect
Enjoy fighting regressions_with_git_bisectEnjoy fighting regressions_with_git_bisect
Enjoy fighting regressions_with_git_bisect
 
Your Own Metric System
Your Own Metric SystemYour Own Metric System
Your Own Metric System
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
 
Bugs found in GCC with the help of PVS-Studio
Bugs found in GCC with the help of PVS-StudioBugs found in GCC with the help of PVS-Studio
Bugs found in GCC with the help of PVS-Studio
 
Automated debugging with git
Automated debugging with gitAutomated debugging with git
Automated debugging with git
 
Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
 
Achievement Unlocked: Drive development, increase velocity, and write blissfu...
Achievement Unlocked: Drive development, increase velocity, and write blissfu...Achievement Unlocked: Drive development, increase velocity, and write blissfu...
Achievement Unlocked: Drive development, increase velocity, and write blissfu...
 
ICSE 2022 - Software Batch Testing to Save Build Test Resources and to Reduce...
ICSE 2022 - Software Batch Testing to Save Build Test Resources and to Reduce...ICSE 2022 - Software Batch Testing to Save Build Test Resources and to Reduce...
ICSE 2022 - Software Batch Testing to Save Build Test Resources and to Reduce...
 
Starting Fresh Every Morning
Starting Fresh Every MorningStarting Fresh Every Morning
Starting Fresh Every Morning
 
Static analysis should be used regularly
Static analysis should be used regularlyStatic analysis should be used regularly
Static analysis should be used regularly
 
Life after Calc core change
Life after Calc core changeLife after Calc core change
Life after Calc core change
 
Mockito 2.x Migration - Droidcon UK 2018
Mockito 2.x Migration - Droidcon UK 2018Mockito 2.x Migration - Droidcon UK 2018
Mockito 2.x Migration - Droidcon UK 2018
 
Mocking - Visug session
Mocking - Visug sessionMocking - Visug session
Mocking - Visug session
 
Growing Manual Testers into Automators
Growing Manual Testers into AutomatorsGrowing Manual Testers into Automators
Growing Manual Testers into Automators
 
Optimization in the world of 64-bit errors
Optimization  in the world of 64-bit errorsOptimization  in the world of 64-bit errors
Optimization in the world of 64-bit errors
 
COMP 122 Entire Course NEW
COMP 122 Entire Course NEWCOMP 122 Entire Course NEW
COMP 122 Entire Course NEW
 

Mais de Camille Bell

Mais de Camille Bell (11)

What CS Class Didn't Teach About Testing
What CS Class Didn't Teach About TestingWhat CS Class Didn't Teach About Testing
What CS Class Didn't Teach About Testing
 
Remote Mob Programming
Remote Mob ProgrammingRemote Mob Programming
Remote Mob Programming
 
Kata Your Way to SW Craftsmanship
Kata Your Way to SW CraftsmanshipKata Your Way to SW Craftsmanship
Kata Your Way to SW Craftsmanship
 
Software Craftsmanship Workshop
Software Craftsmanship WorkshopSoftware Craftsmanship Workshop
Software Craftsmanship Workshop
 
What They Didn't Tell You in CSM Clas
What They Didn't Tell You in CSM ClasWhat They Didn't Tell You in CSM Clas
What They Didn't Tell You in CSM Clas
 
Inside Behavior Driven Development
Inside Behavior Driven DevelopmentInside Behavior Driven Development
Inside Behavior Driven Development
 
Testing for Agility: Bringing Testing into Everything
Testing for Agility: Bringing Testing into EverythingTesting for Agility: Bringing Testing into Everything
Testing for Agility: Bringing Testing into Everything
 
An Introduction to Kanban
An Introduction to KanbanAn Introduction to Kanban
An Introduction to Kanban
 
Promoting Agility with Running Tested Features - Lightening Talk
Promoting Agility with Running Tested Features - Lightening TalkPromoting Agility with Running Tested Features - Lightening Talk
Promoting Agility with Running Tested Features - Lightening Talk
 
Promoting Agility with Running Tested Features - Paper
Promoting Agility with Running Tested Features - PaperPromoting Agility with Running Tested Features - Paper
Promoting Agility with Running Tested Features - Paper
 
Adapting Agility: Getting your Agile Transformation Unstuck
Adapting Agility: Getting your Agile Transformation UnstuckAdapting Agility: Getting your Agile Transformation Unstuck
Adapting Agility: Getting your Agile Transformation Unstuck
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 

Automate Debugging with git bisect

  • 1. cbell@CamilleBellConsul/ng.com              1   Automated Debugging with   git bisect   TDD Camille  Bell   Agile  Coach  /  Rails  Developer   cbell@CamilleBellConsul9ng.com   Twi6er  @agilecamille   h;p://www.slideshare.net/Camille_Bell/  
  • 2. cbell@CamilleBellConsul/ng.com              2   How  do  you  find  a  bug  in  a  large     code  base  with  lots  of  commits?   1st   2nd   3rd   4th   97th   98th   99th   100th  
  • 3. cbell@CamilleBellConsul/ng.com              3   Debugging  Op9ons   •  Manually  inspect  all  the  code  and  hope  you   find  the  bug    !" •  Logically  eliminate  some  of  the  code,  inspect   all  the  rest  and  hope  you  find  the  bug    !   •  Use  automa9on  to  find  your  bug  fast    ☺  
  • 4. cbell@CamilleBellConsul/ng.com              4   Steps  to  Target  the  Buggy  Code   •  Create  new  or  use  an  exis9ng  automated  bug   detector  to  dis9nguish  between  bug  free  code   from  buggy  code  (usually  an  automated  test)   •  Determine  the  bug  commit  range   –  Use  git log    if  needed   •  Use  git bisect –  Run  the  test   –  Use    git diff    to  narrow  bug  to  code  lines  
  • 5. cbell@CamilleBellConsul/ng.com              5   Automa9ng  Bug  Detec9on   •  Perhaps  you  already  have  a  good  automated  test,   but  weren’t  running  it  with  every  commit.  Use   that  test  (and  set  up  a  CI  server  soon).   •  If  not  create  a  new  test  that  should  fail  (RED)   when  the  bug  is  present  and  pass  (GREEN)  when   the  bug  is  fixed.     –  Write  the  test  in  whatever  test  language  makes  sense   (e.g.  RSpec  for  low  level  Ruby,  Cucumber  high  level   behavior,  Jasmine  for  JavaScript,  JUnit  for  Java,  NUnit   for  C#,  etc.)  
  • 6. cbell@CamilleBellConsul/ng.com              6   Verify  the  Test  Catches  the  Bug   •  Run  the  test  on  the  latest  buggy  code  and   watch  it  fail  (RED).   •  Go  back  to  a  known  good  commit,  run  the  test   and  watch  it  pass  (GREEN).  
  • 7. cbell@CamilleBellConsul/ng.com              7   $ rspec . –color F. Failures: 1) Account depositing to account produces the correct balance when 9 dollars is deposited the balance is 10 dollars Failure/Error: @account.balance.should == 1000 expected: 1000 got: 999.9999 (using ==) # ./account_spec.rb:15:in `block (3 levels) in <top (required)>' Finished in 0.00058 seconds 2 examples, 1 failure Failed examples: rspec ./account_spec.rb:12 # Account depositing to account produces the correct balance when 9 dollars is deposited the balance is 10 dollars $ Verifying  Failure  on    Known  Bad  Commit    
  • 8. cbell@CamilleBellConsul/ng.com              8   $ rspec . –color .. Finished in 0.00047 seconds 2 examples, 0 failures $ Verifying  Success  on  a   Known  Good  Commit    
  • 9. cbell@CamilleBellConsul/ng.com              9   Running    git bisect   •  Start  with  a  known  bad  git repository   –  $  git bisect start –  $  git bisect bad –  $  git bisect good <good_commit>   •  Run  your  tests   •  If  the  test  passes   –  $  git bisect good •  If  the  test  fails   –  $ git bisect bad •  Repeat  un9l  you  find  the  bad  commit Use  either  tag    or  git  commit  #   If  needed  checkout  a   bad  git  commit  #  
  • 10. cbell@CamilleBellConsul/ng.com              10   !"#"#"#"#" #"#"#" Determine  the  Bug  Commit  Range:   •     The  last  known  commit  without  the  bug   •     The  first  commit  aeer  the  bug  observed   Star9ng   Good   Commit   Star9ng   Bad   Commit   Bug  Inserted  Within     These  8  Commits  
  • 11. cbell@CamilleBellConsul/ng.com              11   git bisect does  a  binary   search  through  your  commit  range.   !"#"#"#"#" #"#"#" Good     Commit   Bad     Commit   bisect     Star9ng       Commit   bisect begins  with  the  commit  halfway  between   the  known  good  commit  and  the  known  bad  commit  
  • 12. cbell@CamilleBellConsul/ng.com              12   Assume  the  1st  test  on  bisect failed.   !"!"#"#"#" !"!"!" Good     Commit   Bad     Commit   bisect     Next       Commit    Then    bisect would  select  the  commit  between  the   known  good  commit  and  the  last  bad  bisect   Bad     Commit   Can  ignore   these  Commits   Bug  inserted  Within     These  4  Commits  
  • 13. cbell@CamilleBellConsul/ng.com              13   Assume  the  2nd  test  on  bisect passed.   !"!"#" !"!"!" Good     Commit   Bad     Commit    Then    bisect would  select  the  commit  between  the   last  known  good  commit  and  the  last  bad  bisect   Bad     Commit   Can  ignore   these  Commits   Bug  inserted  Within     These  2  Commits   Can  ignore   these  Commits   Good     Commit   bisect     Next       Commit  
  • 14. cbell@CamilleBellConsul/ng.com              14   If  the  3rd  test  on  bisect failed.   !"!"!" !"!"!" Good     Commit   Bad     Commit    Then  that  commit  is  where  the  bug  was  inserted.     Bad     Commit   Can  ignore   these  Commits   Bug  inserted  Within     These  2  Commits   Can  ignore   these  Commits   Good     Commit   Final   Commit       Failed   Test  
  • 15. cbell@CamilleBellConsul/ng.com              15   If  the  3rd  test  on  bisect passed.   !"!"!"!"!" Good     Commit   Bad     Commit    Then  the  next  commit  is  where  the  bug  was  inserted.     Bad     Commit   Can  ignore   these  Commits   Bug  inserted  Within     These  2  Commits   Can  ignore   these  Commits   Good     Commit   Final   Commit       Passed   Test  
  • 16. cbell@CamilleBellConsul/ng.com              16   Example  Test   require_rela9ve  'account'   describe  Account  do      before  do          @star9ng_balance_in_pennies  =  100          @account  =  Account.new(@star9ng_balance_in_pennies)              end      context  "deposi9ng  to  account  produces  the  correct  balance"  do          it  "when  9  dollars  is  deposited  the  balance  is  10  dollars"  do                  deposit_amount_in_pennies  =  900              @account.deposit(deposit_amount_in_pennies)              @account.balance.should  ==  1000          end      end   end  
  • 17. cbell@CamilleBellConsul/ng.com              17   Some9mes  the  Commit  Messages     from  git log Pinpoint  the  Bug   $ git log --pretty="%h - %s" 561bb3a - added withdrawal and deposit messages 6ca7ee1 - added error c546d1f - added to_s 1974592 - added withdrawal 7a8c508 - Initial commit But  usually  the  log  only  provides  a  range   Known   Good   Commit   Known   Bad   Commit  
  • 18. cbell@CamilleBellConsul/ng.com              18   Star9ng  up  git bisect with   Test  on  the  Middle  git Commit   $ git bisect start Already on 'master’ $ git bisect bad $ git bisect good 7a8c508 Bisecting: 1 revision left to test after this (roughly 1 step) [c546d1f89b5b0c14ab160e227fc83d62fb780e6f] added to_s $ rspec . --color .. Finished in 0.00071 seconds 2 examples, 0 failures $ git bisect good Bisecting: 0 revisions left to test after this (roughly 0 steps) [6ca7ee1909bf0b3f7344feee25a5b44a97602e2c] added error Known  Good  Commit   Known  Bad  Commit   If  the  tests  pass,     Tell    git bisect good Otherwise  git bisect bad C   O   M   M   I   T  
  • 19. cbell@CamilleBellConsul/ng.com              19   Test  on  the  final  git commit   $ rspec . --color F. Failures: 1) Account depositing to account produces the correct balance when 9 dollars is deposited the balance is 10 dollars Failure/Error: @account.balance.should == 1000 expected: 1000 got: 999.9999 (using ==) # ./account_spec.rb:15:in `block (3 levels) in <top (required)>' Finished in 0.00053 seconds 2 examples, 1 failure Failed examples: rspec ./account_spec.rb:12 # Account depositing to account produces the correct balance when 9 dollars is deposited the balance is 10 dollars $
  • 20. cbell@CamilleBellConsul/ng.com              20   $ git diff c546d1f 6ca7ee1 diff --git a/account.rb b/account.rb index a979e55..0a572ef 100644 --- a/account.rb +++ b/account.rb @@ -5,7 +5,7 @@ class Account end def deposit(new_deposit) - @balance += new_deposit + @balance += (new_deposit - 0.0001) end def withdrawl(new_withdrawl) $ git diff Targets  the  Bug  Even  More   Good  Commit   Just  Before  Bug   Commit  Where   Bug  First  Appeared   Bug  inserted  in  one  or   more  of  the  +  lines.  
  • 21. cbell@CamilleBellConsul/ng.com              21   Thank You for Listening   Camille  Bell   Agile  Coach  /  Rails  Developer   cbell@CamilleBellConsul9ng.com   Twi6er  @agilecamille   h;p://www.slideshare.net/Camille_Bell/