SlideShare a Scribd company logo
1 of 84
Download to read offline
@giorgionatili #mobiletea 1
The Little Shop of TDD
Horrors
a story from Giorgio Natili
(the mobile & tdd dude)
@giorgionatili #mobiletea 2
Italian Accent Crash Course
@giorgionatili #mobiletea 3
A few words about me…
@giorgionatili #mobiletea 4
Lead Mobile Engineer 

(McGraw Hill Education)
@giorgionatili
@giorgionatili #mobiletea 5
Mobile Tea
@giorgionatili #mobiletea 6
www.meetup.com/pro/mobiletea
@giorgionatili #mobiletea 7
!
Setup and Teardown
Tests clarity and readability
Mocking data
Contract tests
Behaviors driven development
End to end testing
The goals of testing
What we’ll talk about
“We are going to cycle in good and bad practices highlighting
potential solutions…”
How we’ll talk about this
@giorgionatili #mobiletea 9
Everything Started with a Red Sign…
@giorgionatili #mobiletea 10
And from a bunch of notes
@giorgionatili #mobiletea 11
What’s TDD
@giorgionatili #mobiletea 12
Test Driven Development
@giorgionatili #mobiletea 13
Development life cycle
It’s all about writing enough code to satisfy specific
conditions and a continuous refactoring of the code
@giorgionatili #mobiletea 14
Analysis tool
Decouple requirements in independent, negotiable,
valuable, estimable, small testable pieces of code
@giorgionatili #mobiletea 15
With TDD you are not lost anymore!
@giorgionatili #mobiletea 16
Set up and tear down
@giorgionatili #mobiletea 17
Easy setup and teardown
Understandable setups keep the test clean and
easily comprehensible for everybody
@giorgionatili #mobiletea 18
beforeEach(function() {
provider.init(["course:read:*", "group:read:*", "settings:read:*", "settings:update:*", "activity:read:*",
"log:*:*", "node:create:*", "settings:create:*", "system:update:*",
"system:read:*", "system:delete:*", "system:create:*", "unit:create:*", "unit:read:*", "node:update:*",
"node:read:*", "node:delete:*", "splash:read:*", "path:read:*",
"master:update:*", "snapshot:read:*", "lti:grade:*", "master:read:*", "snapshot:update:*",
"history:read:*", "lti:appLaunch:*", "lti:contentItemReturn:*",
"appAction:annotationBundle.js:*", "appAction:apps:*", "appAction:annotation.js:*", "openId:read:*",
"app:read:*", "activityOutcome:activitySubmission:*",
"search:read:*", "userOrgProfile:read:*", "lti:contentItemSelectionReturn:*", "history:create:*",
"eula:read:*", "lti:editActivity:*", "userAppCategoryPref:update:*",
"platformArtifacts:read:*", "userAppCategoryPref:read:*", "userAppCategoryPref:delete:*",
"userAppCategoryPref:create:*", "appCategory:read:*",
"appActivity:update:3,4,16,48,49", "appActivity:findAddible:16,48,49", "nextbook:read:*",
"appActivity:read:*", "lti:addActivity:*",
"activityOutcome:create:*", "activityOutcome:read:*", "activityOutcome:update:*"
]);
});
Overcomplicated setup is a symptom of poor (test(s))
organization!
@giorgionatili #mobiletea 19
Eventually decouple setups
Just in case you really need complicated setups
decouple them from tests and include them in the
setup…
@giorgionatili #mobiletea 20
Essentials Tests
@giorgionatili #mobiletea 21
Test the fundamentals
If you are not 100% test covered you are not a bad
person!
@giorgionatili #mobiletea 22
describe( 'AppCtrl', function() {
describe( 'isCurrentUrl', function() {
var AppCtrl, $location, $scope;
beforeEach( module( 'ngBoilerplate' ) );
beforeEach( inject( function( $controller, _$location_, $rootScope ) {
$location = _$location_;
$scope = $rootScope.$new();
AppCtrl = $controller( 'AppCtrl', { $location: $location, $scope: $scope });
}));
it( 'should pass a dummy test', inject( function() {
expect( AppCtrl ).toBeTruthy();
}));
});
});
Don’t take advantage from this!
@giorgionatili #mobiletea 23
Test, design and code quality
@giorgionatili #mobiletea 24
Big up front design is not TDD
It’s not based on cycles and it’s not how you would
design a component…
@giorgionatili #mobiletea 25
Big projects should still follow best practices…
@giorgionatili #mobiletea 26
Tests are code, treat them well
Write small, readable and decoupled tests. Tests are
part of your code base, don’t write garbage code!
@giorgionatili #mobiletea 27
Treat your tests as a welcome guests
@giorgionatili #mobiletea 28
Refactor on green
Don’t refactor code or tests until the tests are not
green…
@giorgionatili #mobiletea 29
Readability
@giorgionatili #mobiletea 30
Readable
Never write tests that nobody wants or is able to
read, you’ll stop to read them too
@giorgionatili #mobiletea 31
@implementation CardTests
- (void)testFlag {
[self login];
NSManagedObjectContext *context = [CoreDataManager sharedManager].operationContext;
Section *testSection = [Section sectionForUpsertWithSectionId:@(1) forUserId:self.testUserId
inContext:context];

// Completed activities should not show a due soon indicator even when due soon.
Activity *activityNotStarted = [Activity activityForUpsertWithActivityId:@(2)
forSection:testSection inContext:context];
activityNotStarted.progressStatus = ActivityProgressStatusNotYetStarted;
activityNotStarted.due = [NSDate distantFuture];
Card *cardForActivityNotStarted = [Card cardForUpsertWithActivityDue:activityNotStarted];
XCTAssertEqualObjects(SCLocStr(@"ACTIVITY_FLAG_NOT_STARTED"),
cardForActivityNotStarted.flag);

// Repeated for 6 different scenarios…

@end
Boring and not useful
@giorgionatili #mobiletea 32
Do you like to read like this?
@giorgionatili #mobiletea 33
Time box writing tests
You should be driven away from writing long tests
and large amounts of code to satisfy them
@giorgionatili #mobiletea 34
Privacy
@giorgionatili #mobiletea 35
Respect the privacy
Don’t expose methods just because you have to test
it: well-designed public methods should use them in
such a way they don’t need be directly tested
@giorgionatili #mobiletea 36
Reflection + methods swizzling
Don’t expose private methods - even temporarily -
you are terrorizing your own design
@giorgionatili #mobiletea 37
Repetitive Cases
@giorgionatili #mobiletea 38
Automate repetitive cases
Use generative tests framework to mock repetitive
cases in your tests
@giorgionatili #mobiletea 39
describe('pow', function() {
it('works for simple cases', function() {
assert.equal(pow(2, 1), 2);
assert.equal(pow(2, 2), 4);
assert.equal(pow(2, 5), 32);
assert.equal(pow(2, 8), 256);
assert.equal(pow(3, 2), 9);
assert.equal(pow(10, 4), 10000);
assert.equal(pow(1, 99), 1);
});
});
From this mess…
@giorgionatili #mobiletea 40
forAll([gentest.types.int, gentest.types.int],
'pow works like builtin',
function(base, exponent) {
var builtinPow = Math.pow(base, exponent);
var ourPow = pow(base, exponent);
return (builtinPow === ourPow ||
relativeErrorWithin(0.000000001, builtinPow, ourPow));
});
To a better code!
@giorgionatili #mobiletea 41
You feel better!
@giorgionatili #mobiletea 42
Clarity
@giorgionatili #mobiletea 43
Clarity
The clarity of expectations and assertions is the key
for effective TDD
@giorgionatili #mobiletea 44
Naming
Don’t be worried about the length of the names, a
right name is the key to be understood by the others
@giorgionatili #mobiletea 45
Poor descriptions
Tests descriptions are one of the best sources of
documentation, never ignore the importance of
providing a good description
@giorgionatili #mobiletea 46
Respect laziness
Never force a stakeholder to read the code
contained in a test to understand its purpose
@giorgionatili #mobiletea 47
Arrange, Act, Assert (AAA)
Separate what is going to be tested from the setups
and keep the verification steps clearly identified
@giorgionatili #mobiletea 48
Conditional Behaviors
@giorgionatili #mobiletea 49
Avoid conditional behaviors
If you start to add conditionals to determine if your
code is executed by the tests suites, it means that
you are in danger
@giorgionatili #mobiletea 50
Ambiguous behaviors are dangerous!
@giorgionatili #mobiletea 51
“TDD is not about preventing
bugs, it’s about proving the
exactness of behaviors”
@giorgionatili #mobiletea 52
There are unpredictable conditions!
@giorgionatili #mobiletea 53
but you can still mitigate them…
@giorgionatili #mobiletea 54
Network Responses and API
@giorgionatili #mobiletea 55
Network Responses
Applications rely on external data sources, it’s
important to have clear expectations about external
APIs responses
@giorgionatili #mobiletea 56
Performance
Tests are code: Never ignore performance issues
and bottlenecks
@giorgionatili #mobiletea 57
Mock Data
Mock only the data you are testing. A mock should
be small and understandable
@giorgionatili #mobiletea 58
Contract Tests
Create tests in a separate environment that checks
the sanity of the external API you rely on
@giorgionatili #mobiletea 59
'use strict';
var supertest = require('supertest-as-promised');
var request = supertest('https://ngcourse.herokuapp.com');
var assert = require('chai').assert;
describe('Backend API', function() {
it ('should return the list of users', function() {
return request.get('/api/v1/users')
.expect(200);
});
});
Contract Tests in Practice
@giorgionatili #mobiletea 60
Behaviors
@giorgionatili #mobiletea 61
Behaviors
Focus on testing software behaviors rather then
single units of code
@giorgionatili #mobiletea 62
Organize behaviors
Group tests and behaviors that are tied to specific,
testable functionality of your software
@giorgionatili #mobiletea 63
Connect behaviors
Create a connection between behaviors and
scenarios with a format like given/then/when
@giorgionatili #mobiletea 64
Divide tests logically
Never violate the Single Responsibility Principle
neither when writing tests, keep the ordered and in a
good shape is the key to get the more value from
them…
@giorgionatili #mobiletea 65
Measure complexity
If you are not able to organize your tests in such a
way it means that you are dealing with confusing
(and poor!) requirements
@giorgionatili #mobiletea 66
Scenarios -> Use Cases -> Behaviors
This connection is the key to defining tests that
clearly describe a feature and its acceptance criteria
@giorgionatili #mobiletea 67
End 2 End Testing
@giorgionatili #mobiletea 68
Test for pixels
Don’t use e2e tests for testing layout
implementations, automate (eventually) screenshots
and then examine them
@giorgionatili #mobiletea 69
Counting elements
Don’t use e2e testing to count UI elements, use
them to describe how the UI *should change* with a
specific behavior
@giorgionatili #mobiletea 70
Writing E2E tests
Never wait too much, start to write end user tests as
soon as the requirements are ready, the lack of
automation can bring to not reliable outputs
@giorgionatili #mobiletea 71
The Goals of Testing
@giorgionatili #mobiletea 72
Do you ever asked to yourself?
@giorgionatili #mobiletea 73
Profitable
Tests should always support the end goal of making
profit from a software
@giorgionatili #mobiletea 74
Maintainability
Tests are a means to increase maintainability of a
software
@giorgionatili #mobiletea 75
Common understanding
Don’t separate developers and testers! Keeping
them together allows you to have testers that
understand the app internals
@giorgionatili #mobiletea 76
Interchangeability
Having pairing working alternatively on code and
tests is the key to having different perspectives and
to improve interchangeability in your team
@giorgionatili #mobiletea 77
Conclusions
@giorgionatili #mobiletea 78
Preconditions
If you cannot define preconditions you cannot write
tests of good quality, potentially there is a big
misunderstanding about requirements
@giorgionatili #mobiletea 79
Quality
The quality of a test can be highly opinionated; let’s
find a metric that is valuable for your organization
@giorgionatili #mobiletea 80
Validate
Write tests to validate the understanding of the
behaviors a software should implement not to
validate the code
@giorgionatili #mobiletea 81
Estimate
Writing tests take time. Count it in your estimates
but keep always in mind the time that is then saved
during the maintaining phase
@giorgionatili #mobiletea 82
Questions
@giorgionatili #mobiletea 83
Special thanks to:
•Shawn Pucknell
•Jacqueline Poole
•Rafael Fernandes
• Jonathan Barton
@giorgionatili #mobiletea 84
THANK YOU

More Related Content

Viewers also liked

When Clients Bare it All with David Allen
When Clients Bare it All with David AllenWhen Clients Bare it All with David Allen
When Clients Bare it All with David AllenFITC
 
The Power of Play in Experimental Design with Claudia Chagüi De León
The Power of Play in Experimental Design with Claudia Chagüi De LeónThe Power of Play in Experimental Design with Claudia Chagüi De León
The Power of Play in Experimental Design with Claudia Chagüi De LeónFITC
 
Unleashing the Power of 3D with WebJS
Unleashing the Power of 3D with WebJSUnleashing the Power of 3D with WebJS
Unleashing the Power of 3D with WebJSFITC
 
Getting to Know Grunt By Writing Your Own Plugin
Getting to Know Grunt By Writing Your Own PluginGetting to Know Grunt By Writing Your Own Plugin
Getting to Know Grunt By Writing Your Own PluginFITC
 
Squishy pixels
Squishy pixelsSquishy pixels
Squishy pixelsFITC
 
Kickstarting Your Stupid Magazine
Kickstarting Your Stupid MagazineKickstarting Your Stupid Magazine
Kickstarting Your Stupid MagazineFITC
 
Designing True Cross-Platform Apps
Designing True Cross-Platform AppsDesigning True Cross-Platform Apps
Designing True Cross-Platform AppsFITC
 
How to SURVIVE the Creative Industry
How to SURVIVE the Creative IndustryHow to SURVIVE the Creative Industry
How to SURVIVE the Creative IndustryFITC
 
21st Century Crystal Ball
21st Century Crystal Ball21st Century Crystal Ball
21st Century Crystal BallFITC
 
Ryan Christiani I Heard React Was Good
Ryan Christiani I Heard React Was GoodRyan Christiani I Heard React Was Good
Ryan Christiani I Heard React Was GoodFITC
 
Everydays
EverydaysEverydays
EverydaysFITC
 
My Type of Life
My Type of LifeMy Type of Life
My Type of LifeFITC
 
The Working Dead
The Working DeadThe Working Dead
The Working DeadFITC
 
Learning from Science Fiction with Greg Borenstein
Learning from Science Fiction with Greg BorensteinLearning from Science Fiction with Greg Borenstein
Learning from Science Fiction with Greg BorensteinFITC
 
Jedi Mind Trick: Networking, Selling and Pitching
Jedi Mind Trick: Networking, Selling and PitchingJedi Mind Trick: Networking, Selling and Pitching
Jedi Mind Trick: Networking, Selling and PitchingFITC
 
Managing Responsive Design Projects
Managing Responsive Design ProjectsManaging Responsive Design Projects
Managing Responsive Design ProjectsFITC
 
Creating Content that Captivates
Creating Content that CaptivatesCreating Content that Captivates
Creating Content that CaptivatesFITC
 
The Future is in Pieces
The Future is in PiecesThe Future is in Pieces
The Future is in PiecesFITC
 

Viewers also liked (18)

When Clients Bare it All with David Allen
When Clients Bare it All with David AllenWhen Clients Bare it All with David Allen
When Clients Bare it All with David Allen
 
The Power of Play in Experimental Design with Claudia Chagüi De León
The Power of Play in Experimental Design with Claudia Chagüi De LeónThe Power of Play in Experimental Design with Claudia Chagüi De León
The Power of Play in Experimental Design with Claudia Chagüi De León
 
Unleashing the Power of 3D with WebJS
Unleashing the Power of 3D with WebJSUnleashing the Power of 3D with WebJS
Unleashing the Power of 3D with WebJS
 
Getting to Know Grunt By Writing Your Own Plugin
Getting to Know Grunt By Writing Your Own PluginGetting to Know Grunt By Writing Your Own Plugin
Getting to Know Grunt By Writing Your Own Plugin
 
Squishy pixels
Squishy pixelsSquishy pixels
Squishy pixels
 
Kickstarting Your Stupid Magazine
Kickstarting Your Stupid MagazineKickstarting Your Stupid Magazine
Kickstarting Your Stupid Magazine
 
Designing True Cross-Platform Apps
Designing True Cross-Platform AppsDesigning True Cross-Platform Apps
Designing True Cross-Platform Apps
 
How to SURVIVE the Creative Industry
How to SURVIVE the Creative IndustryHow to SURVIVE the Creative Industry
How to SURVIVE the Creative Industry
 
21st Century Crystal Ball
21st Century Crystal Ball21st Century Crystal Ball
21st Century Crystal Ball
 
Ryan Christiani I Heard React Was Good
Ryan Christiani I Heard React Was GoodRyan Christiani I Heard React Was Good
Ryan Christiani I Heard React Was Good
 
Everydays
EverydaysEverydays
Everydays
 
My Type of Life
My Type of LifeMy Type of Life
My Type of Life
 
The Working Dead
The Working DeadThe Working Dead
The Working Dead
 
Learning from Science Fiction with Greg Borenstein
Learning from Science Fiction with Greg BorensteinLearning from Science Fiction with Greg Borenstein
Learning from Science Fiction with Greg Borenstein
 
Jedi Mind Trick: Networking, Selling and Pitching
Jedi Mind Trick: Networking, Selling and PitchingJedi Mind Trick: Networking, Selling and Pitching
Jedi Mind Trick: Networking, Selling and Pitching
 
Managing Responsive Design Projects
Managing Responsive Design ProjectsManaging Responsive Design Projects
Managing Responsive Design Projects
 
Creating Content that Captivates
Creating Content that CaptivatesCreating Content that Captivates
Creating Content that Captivates
 
The Future is in Pieces
The Future is in PiecesThe Future is in Pieces
The Future is in Pieces
 

Similar to The Little Shop of TDD Horrors

Giorgio Natili - The Little Shop of TDD Horrors
 Giorgio Natili - The Little Shop of TDD Horrors Giorgio Natili - The Little Shop of TDD Horrors
Giorgio Natili - The Little Shop of TDD HorrorsCodemotion
 
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
 
A la découverte des google/mock (aka gmock)
A la découverte des google/mock (aka gmock)A la découverte des google/mock (aka gmock)
A la découverte des google/mock (aka gmock)Thierry Gayet
 
Break up the Monolith: Testing Microservices
Break up the Monolith: Testing MicroservicesBreak up the Monolith: Testing Microservices
Break up the Monolith: Testing MicroservicesMarcus Merrell
 
Mockito vs JMockit, battle of the mocking frameworks
Mockito vs JMockit, battle of the mocking frameworksMockito vs JMockit, battle of the mocking frameworks
Mockito vs JMockit, battle of the mocking frameworksEndranNL
 
Testing, Learning and Professionalism — 20171214
Testing, Learning and Professionalism — 20171214Testing, Learning and Professionalism — 20171214
Testing, Learning and Professionalism — 20171214David Rodenas
 
Automating Tactically vs Strategically SauceCon 2020
Automating Tactically vs Strategically SauceCon 2020Automating Tactically vs Strategically SauceCon 2020
Automating Tactically vs Strategically SauceCon 2020Alan Richardson
 
Collaborating with Developers: How-to Guide for Test Engineers - By Gil Tayar
Collaborating with Developers: How-to Guide for Test Engineers - By Gil Tayar Collaborating with Developers: How-to Guide for Test Engineers - By Gil Tayar
Collaborating with Developers: How-to Guide for Test Engineers - By Gil Tayar Applitools
 
What NOT to test in your project
What NOT to test in your projectWhat NOT to test in your project
What NOT to test in your projectalexandre freire
 
How to apply AI to Testing
How to apply AI to TestingHow to apply AI to Testing
How to apply AI to TestingSAP SE
 
Java Puzzlers NG S03 a DevNexus 2018
Java Puzzlers NG S03 a DevNexus 2018Java Puzzlers NG S03 a DevNexus 2018
Java Puzzlers NG S03 a DevNexus 2018Baruch Sadogursky
 
EuroSTAR 2018 tutorial Rik Marselis Testing Intelligent Machines
EuroSTAR 2018 tutorial Rik Marselis Testing Intelligent MachinesEuroSTAR 2018 tutorial Rik Marselis Testing Intelligent Machines
EuroSTAR 2018 tutorial Rik Marselis Testing Intelligent MachinesRik Marselis
 
Odinstar 2017 - Real World Automating to Support Testing
Odinstar 2017 - Real World Automating to Support TestingOdinstar 2017 - Real World Automating to Support Testing
Odinstar 2017 - Real World Automating to Support TestingAlan Richardson
 
How ANDROID TESTING changed how we think about Death
How ANDROID TESTING changed how we think about DeathHow ANDROID TESTING changed how we think about Death
How ANDROID TESTING changed how we think about DeathFernando Cejas
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - GreachHamletDRC
 
Open Source Power Tools - Opensouthcode 2018-06-02
Open Source Power Tools - Opensouthcode 2018-06-02Open Source Power Tools - Opensouthcode 2018-06-02
Open Source Power Tools - Opensouthcode 2018-06-02Jorge Hidalgo
 

Similar to The Little Shop of TDD Horrors (20)

Giorgio Natili - The Little Shop of TDD Horrors
 Giorgio Natili - The Little Shop of TDD Horrors Giorgio Natili - The Little Shop of TDD Horrors
Giorgio Natili - The Little Shop of TDD Horrors
 
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
 
A la découverte des google/mock (aka gmock)
A la découverte des google/mock (aka gmock)A la découverte des google/mock (aka gmock)
A la découverte des google/mock (aka gmock)
 
Break up the Monolith: Testing Microservices
Break up the Monolith: Testing MicroservicesBreak up the Monolith: Testing Microservices
Break up the Monolith: Testing Microservices
 
Mockito vs JMockit, battle of the mocking frameworks
Mockito vs JMockit, battle of the mocking frameworksMockito vs JMockit, battle of the mocking frameworks
Mockito vs JMockit, battle of the mocking frameworks
 
Testing, Learning and Professionalism — 20171214
Testing, Learning and Professionalism — 20171214Testing, Learning and Professionalism — 20171214
Testing, Learning and Professionalism — 20171214
 
des mutants dans le code.pdf
des mutants dans le code.pdfdes mutants dans le code.pdf
des mutants dans le code.pdf
 
Automating Tactically vs Strategically SauceCon 2020
Automating Tactically vs Strategically SauceCon 2020Automating Tactically vs Strategically SauceCon 2020
Automating Tactically vs Strategically SauceCon 2020
 
Collaborating with Developers: How-to Guide for Test Engineers - By Gil Tayar
Collaborating with Developers: How-to Guide for Test Engineers - By Gil Tayar Collaborating with Developers: How-to Guide for Test Engineers - By Gil Tayar
Collaborating with Developers: How-to Guide for Test Engineers - By Gil Tayar
 
What NOT to test in your project
What NOT to test in your projectWhat NOT to test in your project
What NOT to test in your project
 
unit_tests_tutorial
unit_tests_tutorialunit_tests_tutorial
unit_tests_tutorial
 
How to apply AI to Testing
How to apply AI to TestingHow to apply AI to Testing
How to apply AI to Testing
 
Java Puzzlers NG S03 a DevNexus 2018
Java Puzzlers NG S03 a DevNexus 2018Java Puzzlers NG S03 a DevNexus 2018
Java Puzzlers NG S03 a DevNexus 2018
 
Understanding Mocks
Understanding MocksUnderstanding Mocks
Understanding Mocks
 
EuroSTAR 2018 tutorial Rik Marselis Testing Intelligent Machines
EuroSTAR 2018 tutorial Rik Marselis Testing Intelligent MachinesEuroSTAR 2018 tutorial Rik Marselis Testing Intelligent Machines
EuroSTAR 2018 tutorial Rik Marselis Testing Intelligent Machines
 
Odinstar 2017 - Real World Automating to Support Testing
Odinstar 2017 - Real World Automating to Support TestingOdinstar 2017 - Real World Automating to Support Testing
Odinstar 2017 - Real World Automating to Support Testing
 
How ANDROID TESTING changed how we think about Death
How ANDROID TESTING changed how we think about DeathHow ANDROID TESTING changed how we think about Death
How ANDROID TESTING changed how we think about Death
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - Greach
 
Unit testing basic
Unit testing basicUnit testing basic
Unit testing basic
 
Open Source Power Tools - Opensouthcode 2018-06-02
Open Source Power Tools - Opensouthcode 2018-06-02Open Source Power Tools - Opensouthcode 2018-06-02
Open Source Power Tools - Opensouthcode 2018-06-02
 

More from FITC

Cut it up
Cut it upCut it up
Cut it upFITC
 
Designing for Digital Health
Designing for Digital HealthDesigning for Digital Health
Designing for Digital HealthFITC
 
Profiling JavaScript Performance
Profiling JavaScript PerformanceProfiling JavaScript Performance
Profiling JavaScript PerformanceFITC
 
Surviving Your Tech Stack
Surviving Your Tech StackSurviving Your Tech Stack
Surviving Your Tech StackFITC
 
How to Pitch Your First AR Project
How to Pitch Your First AR ProjectHow to Pitch Your First AR Project
How to Pitch Your First AR ProjectFITC
 
Start by Understanding the Problem, Not by Delivering the Answer
Start by Understanding the Problem, Not by Delivering the AnswerStart by Understanding the Problem, Not by Delivering the Answer
Start by Understanding the Problem, Not by Delivering the AnswerFITC
 
Cocaine to Carrots: The Art of Telling Someone Else’s Story
Cocaine to Carrots: The Art of Telling Someone Else’s StoryCocaine to Carrots: The Art of Telling Someone Else’s Story
Cocaine to Carrots: The Art of Telling Someone Else’s StoryFITC
 
Everyday Innovation
Everyday InnovationEveryday Innovation
Everyday InnovationFITC
 
HyperLight Websites
HyperLight WebsitesHyperLight Websites
HyperLight WebsitesFITC
 
Everything is Terrifying
Everything is TerrifyingEverything is Terrifying
Everything is TerrifyingFITC
 
Post-Earth Visions: Designing for Space and the Future Human
Post-Earth Visions: Designing for Space and the Future HumanPost-Earth Visions: Designing for Space and the Future Human
Post-Earth Visions: Designing for Space and the Future HumanFITC
 
The Rise of the Creative Social Influencer (and How to Become One)
The Rise of the Creative Social Influencer (and How to Become One)The Rise of the Creative Social Influencer (and How to Become One)
The Rise of the Creative Social Influencer (and How to Become One)FITC
 
East of the Rockies: Developing an AR Game
East of the Rockies: Developing an AR GameEast of the Rockies: Developing an AR Game
East of the Rockies: Developing an AR GameFITC
 
Creating a Proactive Healthcare System
Creating a Proactive Healthcare SystemCreating a Proactive Healthcare System
Creating a Proactive Healthcare SystemFITC
 
World Transformation: The Secret Agenda of Product Design
World Transformation: The Secret Agenda of Product DesignWorld Transformation: The Secret Agenda of Product Design
World Transformation: The Secret Agenda of Product DesignFITC
 
The Power of Now
The Power of NowThe Power of Now
The Power of NowFITC
 
High Performance PWAs
High Performance PWAsHigh Performance PWAs
High Performance PWAsFITC
 
Rise of the JAMstack
Rise of the JAMstackRise of the JAMstack
Rise of the JAMstackFITC
 
From Closed to Open: A Journey of Self Discovery
From Closed to Open: A Journey of Self DiscoveryFrom Closed to Open: A Journey of Self Discovery
From Closed to Open: A Journey of Self DiscoveryFITC
 
Projects Ain’t Nobody Got Time For
Projects Ain’t Nobody Got Time ForProjects Ain’t Nobody Got Time For
Projects Ain’t Nobody Got Time ForFITC
 

More from FITC (20)

Cut it up
Cut it upCut it up
Cut it up
 
Designing for Digital Health
Designing for Digital HealthDesigning for Digital Health
Designing for Digital Health
 
Profiling JavaScript Performance
Profiling JavaScript PerformanceProfiling JavaScript Performance
Profiling JavaScript Performance
 
Surviving Your Tech Stack
Surviving Your Tech StackSurviving Your Tech Stack
Surviving Your Tech Stack
 
How to Pitch Your First AR Project
How to Pitch Your First AR ProjectHow to Pitch Your First AR Project
How to Pitch Your First AR Project
 
Start by Understanding the Problem, Not by Delivering the Answer
Start by Understanding the Problem, Not by Delivering the AnswerStart by Understanding the Problem, Not by Delivering the Answer
Start by Understanding the Problem, Not by Delivering the Answer
 
Cocaine to Carrots: The Art of Telling Someone Else’s Story
Cocaine to Carrots: The Art of Telling Someone Else’s StoryCocaine to Carrots: The Art of Telling Someone Else’s Story
Cocaine to Carrots: The Art of Telling Someone Else’s Story
 
Everyday Innovation
Everyday InnovationEveryday Innovation
Everyday Innovation
 
HyperLight Websites
HyperLight WebsitesHyperLight Websites
HyperLight Websites
 
Everything is Terrifying
Everything is TerrifyingEverything is Terrifying
Everything is Terrifying
 
Post-Earth Visions: Designing for Space and the Future Human
Post-Earth Visions: Designing for Space and the Future HumanPost-Earth Visions: Designing for Space and the Future Human
Post-Earth Visions: Designing for Space and the Future Human
 
The Rise of the Creative Social Influencer (and How to Become One)
The Rise of the Creative Social Influencer (and How to Become One)The Rise of the Creative Social Influencer (and How to Become One)
The Rise of the Creative Social Influencer (and How to Become One)
 
East of the Rockies: Developing an AR Game
East of the Rockies: Developing an AR GameEast of the Rockies: Developing an AR Game
East of the Rockies: Developing an AR Game
 
Creating a Proactive Healthcare System
Creating a Proactive Healthcare SystemCreating a Proactive Healthcare System
Creating a Proactive Healthcare System
 
World Transformation: The Secret Agenda of Product Design
World Transformation: The Secret Agenda of Product DesignWorld Transformation: The Secret Agenda of Product Design
World Transformation: The Secret Agenda of Product Design
 
The Power of Now
The Power of NowThe Power of Now
The Power of Now
 
High Performance PWAs
High Performance PWAsHigh Performance PWAs
High Performance PWAs
 
Rise of the JAMstack
Rise of the JAMstackRise of the JAMstack
Rise of the JAMstack
 
From Closed to Open: A Journey of Self Discovery
From Closed to Open: A Journey of Self DiscoveryFrom Closed to Open: A Journey of Self Discovery
From Closed to Open: A Journey of Self Discovery
 
Projects Ain’t Nobody Got Time For
Projects Ain’t Nobody Got Time ForProjects Ain’t Nobody Got Time For
Projects Ain’t Nobody Got Time For
 

Recently uploaded

Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...sonatiwari757
 
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort ServiceEnjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort ServiceDelhi Call girls
 
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call GirlVIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girladitipandeya
 
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607dollysharma2066
 
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...APNIC
 
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...aditipandeya
 
On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024APNIC
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Servicesexy call girls service in goa
 
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...SofiyaSharma5
 
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445ruhi
 
Challengers I Told Ya ShirtChallengers I Told Ya Shirt
Challengers I Told Ya ShirtChallengers I Told Ya ShirtChallengers I Told Ya ShirtChallengers I Told Ya Shirt
Challengers I Told Ya ShirtChallengers I Told Ya Shirtrahman018755
 
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...tanu pandey
 
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersMoving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersDamian Radcliffe
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLimonikaupta
 
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...Diya Sharma
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxellan12
 
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.soniya singh
 

Recently uploaded (20)

Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
 
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort ServiceEnjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
 
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call GirlVIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
 
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
 
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
 
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
 
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
 
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
 
On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
 
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida ✔️☆9289244007✔️☆ Female E...
 
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
 
Challengers I Told Ya ShirtChallengers I Told Ya Shirt
Challengers I Told Ya ShirtChallengers I Told Ya ShirtChallengers I Told Ya ShirtChallengers I Told Ya Shirt
Challengers I Told Ya ShirtChallengers I Told Ya Shirt
 
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
 
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Pratap Nagar Delhi 💯Call Us 🔝8264348440🔝
 
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersMoving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
 
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
 
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
 

The Little Shop of TDD Horrors