SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
Scott Leberknight
6/28/2019
(Unit) Testing
Why Test?
Does your code work?
How do you know?
Tests provide some level of confidence
your code does what you think it does…
…which is not the same as saying
the code is correct
from a business perspective
Tests cannot and will not ever
catch or prevent all possible problems
You might have a passing test suite but
still have logic bugs…
e.g. due to poorly defined or
understood requirements, poor
design, etc.
“In the 737 Max, only one of the flight
management computers is active at a time -
either the pilot’s computer or the copilot’s
computer.And the active computer takes
inputs only from the sensors on its own side
of the aircraft.”
https://spectrum.ieee.org/aerospace/aviation/how-the-boeing-737-max-disaster-looks-to-a-software-developer
“When the two computers disagree, the
solution for the humans in the cockpit is 

to look across the control panel to see

what the other instruments are saying and
then sort it out. In the Boeing system, the
flight management computer does not “look 

across” at the other instruments. It 

believes only the instruments on its side.”
https://spectrum.ieee.org/aerospace/aviation/how-the-boeing-737-max-disaster-looks-to-a-software-developer
“This means that if a particular angle-of-
attack sensor goes haywire - which happens
all the time in a machine that alternates
from one extreme environment to another,
vibrating and shaking all the way - the flight
management computer just believes it.”
https://spectrum.ieee.org/aerospace/aviation/how-the-boeing-737-max-disaster-looks-to-a-software-developer
“The primary cause of this discrepancy was that one piece of ground
software supplied by Lockheed Martin produced results in a United
States customary unit, contrary to its Software Interface Specification
(SIS), while a second system, supplied by NASA, expected those
results to be in SI units, in accordance with the SIS. Specifically,
software that calculated the total impulse produced by thruster
firings produced results in pound-force seconds.The trajectory
calculation software then used these results – expected to be in
newton seconds – to update the predicted position of the
spacecraft.”
https://en.wikipedia.org/wiki/Mars_Climate_Orbiter#Cause_of_failure
The act of testing makes you consider more
than just the “happy path”
Many Flavors…
“Unit” Integration
Performance
Functional (QA)
Security
User interface
Other…?Exploratory
Good testing…
Automated
Repeatable
Continuous
(“ARC” testing)
Good unit testing…
Fast (a few milliseconds?)
Isolated (no “real” dependencies)
Consider success & failure modes
What is a “unit” test?
Not always clearly defined
A single class? A single function?
Can it touch external resources?
(e.g. a database, web service, or file system)
@Test
fun `contribution should be sum of salary & Roth deferrals`() {
assertThat(payroll.totalContribution)
.isEqualTo(payroll.salaryDeferral +
payroll.rothDeferral)
}
A simple unit test
Potential Benefits
Find regressions quickly
Confidence
Better design (*)
(*) probably…
You can go faster in the long run
Potential Pitfalls
False confidence
Tests can have bugs too…
(*) debatable, but not in my personal experience…
You might be slower in short run (*)
What to test?
“Business” logic…
Persistence logic…
User interfaces…
“Anything that can possibly break” ???
What to test?
Test your code…
…not your dependencies
What to test?
More generally you should assume
libraries, frameworks, operating systems,
etc. have been tested and work as
advertised…
(obviously there are caveats to the above)
How to test?
TDD (Test-Driven Development aka “test first”)
TAST (test at same time, commit only tested code)
Test after (avoid…or deal with the consequences)
…on “legacy code” this is your only option
“Legacy Code”
“To me, legacy code is simply
code without tests”
- Michael Feathers,
Working Effectively with Legacy Code
“TDD”
Test-driven development
Usually associated with “test first”
Write failing test, write simplest code
to make it pass, repeat…
“Red-Green-Refactor” cycle
“TDD”
Can you be test-driven without test first?
I think you can…
By letting tests drive the design…
And guide towards “testable” code…
Tests & Design
What does “testable” code mean?
* Loosely coupled, e.g. injecting dependencies
* Separation of concerns
* Single Responsibility Principle (SRP)
Tests & Design
What does “testable” code look like?
* Smaller classes in OO languages
* Smaller methods/functions (7-10 lines max? 20? 30?)
* Injected dependencies, e.g. via constructors or
function parameters
* More “pure” functions
Tests & Design
Why do these things make code testable?
* Facilitates “mocking” dependencies, e.g. a credit
card processing web service, or persistence to a
database
* A function that accepts input, has no side effects,
and produces a consistent output is much easier
to test
Testing Techniques
Prefer smaller, targeted tests (less coupling)
Mock objects (but don’t overdo it)
Perform assertions on return values
Verify behavior of mock objects
(correct methods called, expected arguments)
Testing Techniques
Property-based testing
Test “units” and mock dependencies
Generative testing
Measuring code “covered” by tests
Example test using a mock
@ExtendWith(DropwizardExtensionsSupport.class)
class RelationshipResourceTest {
private static final RelationshipService SERVICE = mock(RelationshipService.class);
private static final ResourceExtension RESOURCES = ResourceExtension.builder()
.addResource(new RelationshipResource(SERVICE))
.build();
@AfterEach
void tearDown() {
reset(SERVICE);
}
@Test
@DisplayName("given a valid event should attempt to save the event")
void testRecordEvent() {
ConnectionEvent event =
newConnectionEvent(A_SERVICE_NAME, Direction.OUTBOUND, "some-identifier");
Response response = RESOURCES.target(“/elucidate/event")
.request()
.post(Entity.json(event));
assertThat(response.getStatus()).isEqualTo(202);
verify(SERVICE).createEvent(eq(event));
}
// more tests...
}
Testing Async Code
No sleeps!
Mock the environment
“If we go by the book…hours could seem like days…”
Wait for conditions
(e.g. until a status value is changed)
Unit vs Integration Tests
* A unit test of a single HTTP endpoint accepts
HTTP requests, but uses mock dependencies, e.g.
objects to persist data, or process payments, or
send asynchronous messages
* An integration test of that single HTTP endpoint
accepts HTTP requests, but uses the actual
dependencies…
Code Coverage
How much is “enough”?
Should automated builds fail if
below a threshold? 70%? 80%?
Can/should you test all exceptional
conditions?
Code Coverage
By definition, decoupled, “testable” code
is easier to achieve higher coverage
The goal should not be a number (80%)
The goal is ensuring correct behavior,
output, etc.
Key Takeaways…
Gain confidence that code is “correct”
Automated, repeatable, continuous (ARC)
Tests cannot catch all problems
Better design through “testable code”
Build & change systems faster
(THE END)
Suggested Reading
Clean Code, Robert “Uncle Bob” Martin
Working Effectively with Legacy Code, Michael Feathers
Pragmatic Programmer, Dave Thomas & Andy Hunt
(20th anniversary edition in beta at
https://pragprog.com/book/tpp20/the-pragmatic-programmer-20th-anniversary-edition)
Suggested Websites
JUnit, de-factor Java unit testing framework, https://junit.org/junit5/
Mockito, mocking library, https://site.mockito.org
AssertJ, fluent assertion library, https://joel-costigliola.github.io/assertj/
Awaitility, async testing library, https://github.com/awaitility/awaitility
Jacoco, code coverage, https://www.jacoco.org/jacoco/
Boeing 737 MAX
https://commons.wikimedia.org/wiki/File:WS_YYC_737_MAX_1.jpg
https://creativecommons.org/licenses/by-sa/4.0/deed.en
No changes made
Photos & Images
(All other images were purchased from iStock)
66MHz Pentium Chip with FDIV flaw
https://en.wikipedia.org/wiki/Pentium_FDIV_bug#/media/
File:KL_Intel_Pentium_A80501.jpg
Konstantin Lanzet
[CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)]
No changes made
Mars Climate Orbiter
https://en.wikipedia.org/wiki/Mars_Climate_Orbiter#/media/
File:Mars_Climate_Orbiter_2.jpg
Public domain
Photos & Images
(All other images were purchased from iStock)
My Info
sleberknight at
fortitudetec.com
www.fortitudetec.com
@sleberknight
scott.leberknight at
gmail

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Unit testing best practices
Unit testing best practicesUnit testing best practices
Unit testing best practices
 
Unit testing
Unit testingUnit testing
Unit testing
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Unit testing
Unit testingUnit testing
Unit testing
 
Unit and integration Testing
Unit and integration TestingUnit and integration Testing
Unit and integration Testing
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Software testing methods, levels and types
Software testing methods, levels and typesSoftware testing methods, levels and types
Software testing methods, levels and types
 
Angular Unit Testing
Angular Unit TestingAngular Unit Testing
Angular Unit Testing
 
Junit
JunitJunit
Junit
 
Introduction to Automation Testing
Introduction to Automation TestingIntroduction to Automation Testing
Introduction to Automation Testing
 
Automation Testing by Selenium Web Driver
Automation Testing by Selenium Web DriverAutomation Testing by Selenium Web Driver
Automation Testing by Selenium Web Driver
 
Using Mockito
Using MockitoUsing Mockito
Using Mockito
 
Building a Test Automation Strategy for Success
Building a Test Automation Strategy for SuccessBuilding a Test Automation Strategy for Success
Building a Test Automation Strategy for Success
 
Junit
JunitJunit
Junit
 
Test automation proposal
Test automation proposalTest automation proposal
Test automation proposal
 
Unit Testing (C#)
Unit Testing (C#)Unit Testing (C#)
Unit Testing (C#)
 
Web automation using selenium.ppt
Web automation using selenium.pptWeb automation using selenium.ppt
Web automation using selenium.ppt
 
Automated Testing vs Manual Testing
Automated Testing vs Manual TestingAutomated Testing vs Manual Testing
Automated Testing vs Manual Testing
 
Manual testing ppt
Manual testing pptManual testing ppt
Manual testing ppt
 
Workshop unit test
Workshop   unit testWorkshop   unit test
Workshop unit test
 

Ähnlich wie Unit Testing

SELJE_Database_Unit_Testing.pdf
SELJE_Database_Unit_Testing.pdfSELJE_Database_Unit_Testing.pdf
SELJE_Database_Unit_Testing.pdfEric Selje
 
Caleb Crandall - Testing Between the Buckets.pptx
Caleb Crandall - Testing Between the Buckets.pptxCaleb Crandall - Testing Between the Buckets.pptx
Caleb Crandall - Testing Between the Buckets.pptxQA or the Highway
 
SELJE_Database_Unit_Testing_Slides.pdf
SELJE_Database_Unit_Testing_Slides.pdfSELJE_Database_Unit_Testing_Slides.pdf
SELJE_Database_Unit_Testing_Slides.pdfEric Selje
 
Test-Driven Development
Test-Driven DevelopmentTest-Driven Development
Test-Driven DevelopmentJohn Blum
 
We continue checking Microsoft projects: analysis of PowerShell
We continue checking Microsoft projects: analysis of PowerShellWe continue checking Microsoft projects: analysis of PowerShell
We continue checking Microsoft projects: analysis of PowerShellPVS-Studio
 
Testing in a glance
Testing in a glanceTesting in a glance
Testing in a glanceRajesh Kumar
 
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...GlobalLogic Ukraine
 
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
assertYourself - Breaking the Theories and Assumptions of Unit Testing in FlexassertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flexmichael.labriola
 
How to write clean & testable code without losing your mind
How to write clean & testable code without losing your mindHow to write clean & testable code without losing your mind
How to write clean & testable code without losing your mindAndreas Czakaj
 
Test-Driven Development In Action
Test-Driven Development In ActionTest-Driven Development In Action
Test-Driven Development In ActionJon Kruger
 
Testing Ext JS and Sencha Touch
Testing Ext JS and Sencha TouchTesting Ext JS and Sencha Touch
Testing Ext JS and Sencha TouchMats Bryntse
 

Ähnlich wie Unit Testing (20)

Testing 101
Testing 101Testing 101
Testing 101
 
Coding Naked 2023
Coding Naked 2023Coding Naked 2023
Coding Naked 2023
 
AAA Automated Testing
AAA Automated TestingAAA Automated Testing
AAA Automated Testing
 
SELJE_Database_Unit_Testing.pdf
SELJE_Database_Unit_Testing.pdfSELJE_Database_Unit_Testing.pdf
SELJE_Database_Unit_Testing.pdf
 
Caleb Crandall - Testing Between the Buckets.pptx
Caleb Crandall - Testing Between the Buckets.pptxCaleb Crandall - Testing Between the Buckets.pptx
Caleb Crandall - Testing Between the Buckets.pptx
 
SELJE_Database_Unit_Testing_Slides.pdf
SELJE_Database_Unit_Testing_Slides.pdfSELJE_Database_Unit_Testing_Slides.pdf
SELJE_Database_Unit_Testing_Slides.pdf
 
Test-Driven Development
Test-Driven DevelopmentTest-Driven Development
Test-Driven Development
 
We continue checking Microsoft projects: analysis of PowerShell
We continue checking Microsoft projects: analysis of PowerShellWe continue checking Microsoft projects: analysis of PowerShell
We continue checking Microsoft projects: analysis of PowerShell
 
Testing in a glance
Testing in a glanceTesting in a glance
Testing in a glance
 
test
testtest
test
 
Coding Naked
Coding NakedCoding Naked
Coding Naked
 
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
 
test
testtest
test
 
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
assertYourself - Breaking the Theories and Assumptions of Unit Testing in FlexassertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
 
Ensuring code quality
Ensuring code qualityEnsuring code quality
Ensuring code quality
 
Design For Testability
Design For TestabilityDesign For Testability
Design For Testability
 
TDD Workshop UTN 2012
TDD Workshop UTN 2012TDD Workshop UTN 2012
TDD Workshop UTN 2012
 
How to write clean & testable code without losing your mind
How to write clean & testable code without losing your mindHow to write clean & testable code without losing your mind
How to write clean & testable code without losing your mind
 
Test-Driven Development In Action
Test-Driven Development In ActionTest-Driven Development In Action
Test-Driven Development In Action
 
Testing Ext JS and Sencha Touch
Testing Ext JS and Sencha TouchTesting Ext JS and Sencha Touch
Testing Ext JS and Sencha Touch
 

Mehr von Scott Leberknight (20)

JShell & ki
JShell & kiJShell & ki
JShell & ki
 
JUnit Pioneer
JUnit PioneerJUnit Pioneer
JUnit Pioneer
 
JDKs 10 to 14 (and beyond)
JDKs 10 to 14 (and beyond)JDKs 10 to 14 (and beyond)
JDKs 10 to 14 (and beyond)
 
SDKMAN!
SDKMAN!SDKMAN!
SDKMAN!
 
JUnit 5
JUnit 5JUnit 5
JUnit 5
 
AWS Lambda
AWS LambdaAWS Lambda
AWS Lambda
 
Dropwizard
DropwizardDropwizard
Dropwizard
 
RESTful Web Services with Jersey
RESTful Web Services with JerseyRESTful Web Services with Jersey
RESTful Web Services with Jersey
 
httpie
httpiehttpie
httpie
 
jps & jvmtop
jps & jvmtopjps & jvmtop
jps & jvmtop
 
Cloudera Impala, updated for v1.0
Cloudera Impala, updated for v1.0Cloudera Impala, updated for v1.0
Cloudera Impala, updated for v1.0
 
Java 8 Lambda Expressions
Java 8 Lambda ExpressionsJava 8 Lambda Expressions
Java 8 Lambda Expressions
 
Google Guava
Google GuavaGoogle Guava
Google Guava
 
Cloudera Impala
Cloudera ImpalaCloudera Impala
Cloudera Impala
 
iOS
iOSiOS
iOS
 
Apache ZooKeeper
Apache ZooKeeperApache ZooKeeper
Apache ZooKeeper
 
HBase Lightning Talk
HBase Lightning TalkHBase Lightning Talk
HBase Lightning Talk
 
Hadoop
HadoopHadoop
Hadoop
 
wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 

Kürzlich hochgeladen

2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
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
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
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
 
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
 
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
 
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
 
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
 
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
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
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
 
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
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
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
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 

Kürzlich hochgeladen (20)

2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
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
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
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
 
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...
 
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
 
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...
 
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
 
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...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
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
 
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
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
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?
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 

Unit Testing

  • 3.
  • 4. Does your code work? How do you know?
  • 5. Tests provide some level of confidence your code does what you think it does…
  • 6. …which is not the same as saying the code is correct from a business perspective
  • 7. Tests cannot and will not ever catch or prevent all possible problems
  • 8. You might have a passing test suite but still have logic bugs… e.g. due to poorly defined or understood requirements, poor design, etc.
  • 9.
  • 10. “In the 737 Max, only one of the flight management computers is active at a time - either the pilot’s computer or the copilot’s computer.And the active computer takes inputs only from the sensors on its own side of the aircraft.” https://spectrum.ieee.org/aerospace/aviation/how-the-boeing-737-max-disaster-looks-to-a-software-developer
  • 11. “When the two computers disagree, the solution for the humans in the cockpit is 
 to look across the control panel to see
 what the other instruments are saying and then sort it out. In the Boeing system, the flight management computer does not “look 
 across” at the other instruments. It 
 believes only the instruments on its side.” https://spectrum.ieee.org/aerospace/aviation/how-the-boeing-737-max-disaster-looks-to-a-software-developer
  • 12. “This means that if a particular angle-of- attack sensor goes haywire - which happens all the time in a machine that alternates from one extreme environment to another, vibrating and shaking all the way - the flight management computer just believes it.” https://spectrum.ieee.org/aerospace/aviation/how-the-boeing-737-max-disaster-looks-to-a-software-developer
  • 13.
  • 14. “The primary cause of this discrepancy was that one piece of ground software supplied by Lockheed Martin produced results in a United States customary unit, contrary to its Software Interface Specification (SIS), while a second system, supplied by NASA, expected those results to be in SI units, in accordance with the SIS. Specifically, software that calculated the total impulse produced by thruster firings produced results in pound-force seconds.The trajectory calculation software then used these results – expected to be in newton seconds – to update the predicted position of the spacecraft.” https://en.wikipedia.org/wiki/Mars_Climate_Orbiter#Cause_of_failure
  • 15. The act of testing makes you consider more than just the “happy path”
  • 16. Many Flavors… “Unit” Integration Performance Functional (QA) Security User interface Other…?Exploratory
  • 18. Good unit testing… Fast (a few milliseconds?) Isolated (no “real” dependencies) Consider success & failure modes
  • 19. What is a “unit” test? Not always clearly defined A single class? A single function? Can it touch external resources? (e.g. a database, web service, or file system)
  • 20. @Test fun `contribution should be sum of salary & Roth deferrals`() { assertThat(payroll.totalContribution) .isEqualTo(payroll.salaryDeferral + payroll.rothDeferral) } A simple unit test
  • 21. Potential Benefits Find regressions quickly Confidence Better design (*) (*) probably… You can go faster in the long run
  • 22. Potential Pitfalls False confidence Tests can have bugs too… (*) debatable, but not in my personal experience… You might be slower in short run (*)
  • 23. What to test? “Business” logic… Persistence logic… User interfaces… “Anything that can possibly break” ???
  • 24. What to test? Test your code… …not your dependencies
  • 25. What to test? More generally you should assume libraries, frameworks, operating systems, etc. have been tested and work as advertised… (obviously there are caveats to the above)
  • 26. How to test? TDD (Test-Driven Development aka “test first”) TAST (test at same time, commit only tested code) Test after (avoid…or deal with the consequences) …on “legacy code” this is your only option
  • 27. “Legacy Code” “To me, legacy code is simply code without tests” - Michael Feathers, Working Effectively with Legacy Code
  • 28. “TDD” Test-driven development Usually associated with “test first” Write failing test, write simplest code to make it pass, repeat… “Red-Green-Refactor” cycle
  • 29. “TDD” Can you be test-driven without test first? I think you can… By letting tests drive the design… And guide towards “testable” code…
  • 30. Tests & Design What does “testable” code mean? * Loosely coupled, e.g. injecting dependencies * Separation of concerns * Single Responsibility Principle (SRP)
  • 31. Tests & Design What does “testable” code look like? * Smaller classes in OO languages * Smaller methods/functions (7-10 lines max? 20? 30?) * Injected dependencies, e.g. via constructors or function parameters * More “pure” functions
  • 32. Tests & Design Why do these things make code testable? * Facilitates “mocking” dependencies, e.g. a credit card processing web service, or persistence to a database * A function that accepts input, has no side effects, and produces a consistent output is much easier to test
  • 33. Testing Techniques Prefer smaller, targeted tests (less coupling) Mock objects (but don’t overdo it) Perform assertions on return values Verify behavior of mock objects (correct methods called, expected arguments)
  • 34. Testing Techniques Property-based testing Test “units” and mock dependencies Generative testing Measuring code “covered” by tests
  • 36. @ExtendWith(DropwizardExtensionsSupport.class) class RelationshipResourceTest { private static final RelationshipService SERVICE = mock(RelationshipService.class); private static final ResourceExtension RESOURCES = ResourceExtension.builder() .addResource(new RelationshipResource(SERVICE)) .build(); @AfterEach void tearDown() { reset(SERVICE); } @Test @DisplayName("given a valid event should attempt to save the event") void testRecordEvent() { ConnectionEvent event = newConnectionEvent(A_SERVICE_NAME, Direction.OUTBOUND, "some-identifier"); Response response = RESOURCES.target(“/elucidate/event") .request() .post(Entity.json(event)); assertThat(response.getStatus()).isEqualTo(202); verify(SERVICE).createEvent(eq(event)); } // more tests... }
  • 37. Testing Async Code No sleeps! Mock the environment “If we go by the book…hours could seem like days…” Wait for conditions (e.g. until a status value is changed)
  • 38. Unit vs Integration Tests * A unit test of a single HTTP endpoint accepts HTTP requests, but uses mock dependencies, e.g. objects to persist data, or process payments, or send asynchronous messages * An integration test of that single HTTP endpoint accepts HTTP requests, but uses the actual dependencies…
  • 39. Code Coverage How much is “enough”? Should automated builds fail if below a threshold? 70%? 80%? Can/should you test all exceptional conditions?
  • 40. Code Coverage By definition, decoupled, “testable” code is easier to achieve higher coverage The goal should not be a number (80%) The goal is ensuring correct behavior, output, etc.
  • 42. Gain confidence that code is “correct” Automated, repeatable, continuous (ARC) Tests cannot catch all problems Better design through “testable code” Build & change systems faster
  • 44. Suggested Reading Clean Code, Robert “Uncle Bob” Martin Working Effectively with Legacy Code, Michael Feathers Pragmatic Programmer, Dave Thomas & Andy Hunt (20th anniversary edition in beta at https://pragprog.com/book/tpp20/the-pragmatic-programmer-20th-anniversary-edition)
  • 45. Suggested Websites JUnit, de-factor Java unit testing framework, https://junit.org/junit5/ Mockito, mocking library, https://site.mockito.org AssertJ, fluent assertion library, https://joel-costigliola.github.io/assertj/ Awaitility, async testing library, https://github.com/awaitility/awaitility Jacoco, code coverage, https://www.jacoco.org/jacoco/
  • 46. Boeing 737 MAX https://commons.wikimedia.org/wiki/File:WS_YYC_737_MAX_1.jpg https://creativecommons.org/licenses/by-sa/4.0/deed.en No changes made Photos & Images (All other images were purchased from iStock) 66MHz Pentium Chip with FDIV flaw https://en.wikipedia.org/wiki/Pentium_FDIV_bug#/media/ File:KL_Intel_Pentium_A80501.jpg Konstantin Lanzet [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)] No changes made