embracing the red bar: a technique for safely refactoring your test suite
TRANSCRIPT
EMBRACING THE RED BARA TECHNIQUE FOR SAFELY
REFACTORING YOUR TEST CODEM. Scott Ford (@mscottford) | Chief Code Whisperer and CTO | Corgibytes (@corgibytes)
CREDITSLIZ KEOGH ( ) -
MICHAEL FEATHERS ( ) -
@LUNIVORE ORIGINAL ARTICLE
@MFEATHERS ORIGINAL ARTICLE
JARGON ALERTWHAT'S A RED BAR?
GREEN BAR: ALL TESTS PASSING
RED BAR: SOME TESTS FAILING
BEWARE OF OVERCONFIDENCE
A CAUTIONARY TALE
TEST CODE VS PRODUCTION CODE
KEEP YOUR TEST CODE CLEAN
NORMAL TDD CYCLE
ENSURES THAT YOUR TESTS WILL FAIL IF YOUR PRODUCTION CODE BREAKS
ALLOWS YOU TO REFACTOR YOUR PRODUCTION CODE WITH IMPUNITY
RED-BAR CYCLE
RED, REFACTOR, GREENENSURES THAT YOUR TEST CODE CONTINUES TO DETECT THE FAILURE CONDITION WHILE
REFACTORING THE TEST CODE
REDMUTATE THE PRODUCTION CODE
Produces a red barEnsures that your test can fail
REFACTOR
REFACTOR YOUR TESTS
Continue to see the red barEnsures that your tests are still failing
GREENREVERSE THE PRODUCTION CODE MUTATION
Bar should switch to greenYour test should now pass
THINGS THAT CAN GO WRONG
REDI want to refactor a test, but I can't make it fail
REFACTOR
I'm refactoring a test, and it's started passing
GREENI reverted my production change, and my tests are still failing
CALCULATOR EXAMPLE
STARTING POINT
class Calculator def add(left, right) end end
FAILING TEST
describe 'additon' do specify 'adding two numbers that result in 4' do calculator = Calculator.new result = calculator.add(2, 2) expect(result).to eq(4) end end
WATCH IT FAIL
WATCH IT FAIL
MAKING IT PASS
class Calculator def add(left, right) return 4 end end
WATCH IT PASS
WATCH IT PASS
MAKE THE TESTS BETTER
describe 'additon' do specify 'adding two numbers that result in 4' do calculator = Calculator.new result = calculator.add(2, 2) expect(result).to eq(4) end
specify 'adding two numbers that result in 5' do calculator = Calculator.new result = calculator.add(2, 3) expect(result).to eq(5) end end
WATCH THEM FAIL
WATCH THEM FAIL
MAKE THEM PASS
class Calculator def add(left, right) return left + right end end
WATCH THEM PASS
WATCH THEM PASS
LET'S REFACTOR OUR TESTS
BREAK THE PRODUCTION CODEclass Calculator def add(left, right) return 0 # was: left + right end end
WATCH THE TESTS FAIL
WATCH THE TESTS FAIL
APPLY THE REFACTORINGdescribe 'additon' do let(:calculator) { Calculator.new }
specify 'adding two numbers that result in 4' do result = calculator.add(2, 2) expect(result).to eq(4) end
specify 'adding two numbers that result in 5' do result = calculator.add(2, 3) expect(result).to eq(5) end end
VERIFY THAT THE TESTS STILL FAIL
VERIFY THAT THE TESTS STILL FAIL
RESTORE PRODUCTION CODEclass Calculator def add(left, right) return left + right end end
WATCH THE TESTS PASS
WATCH THE TESTS PASS
QUESTIONS?
CONTACT INFO
M. Scott FordTwitter: @mscottfordBlog: http://corgibytes.com/blog