SlideShare a Scribd company logo
TEST-DRIVEN
SOFTWARE DEVELOPMENT
JOHN BLUM
2015 JUNE 17
AGENDA
 Misconceptions
 Why Test
 Types of Tests
 What & How to Test
 Using JUnit, Mockito and MultithreadedTC
 Best Practices
 Final Thoughts
 QA
“No amount of testing can prove a software right,
but a single test can prove a software wrong.”
– Amir Ghahrai
MISCONCEPTIONS
Testing is a Quality Engineer’s (QE/SDET) job
 Quality Assurance (QA) is everyone’s responsibility
MISCONCEPTIONS
Automated tests are unnecessary if I manually test and
debug my code
 Testing is not a replacement for debuggers and other
development tools either (e.g. Profilers, FindBugs, etc)
Not possible to automate all tests
 Difficult when the software architecture & design is flawed
Developer tests are “Unit Tests”
JUnit is a “Unit Test” framework
 JUnit is a framework facilitating the development and
execution of automated tests
 Used in Integration and Functional (Acceptance) testing
MISCONCEPTIONS
Software is correct when there is 100% test coverage and no
FindBugs (CheckStyle, PMD) errors
 A bug occurs when the software fails to function properly in a
prescribed manner
 A defect occurs after the software is used in a unintentional
way and behaves unexpectedly
MISCONCEPTIONS
"Not everything that can be counted counts and not
everything that counts can be counted."
- Albert Einstein
Why do software engineers write tests?
Or…
Why don’t software engineers write tests?
TO TEST OR NOT TO TEST?
Time Constraints
 Time-based vs. Functional-based releases
 Quantity (Scope) over Quality (Less is More)
(Cultural) Responsibility
Laziness, Ignorance, Fear
 Not detail-oriented
Verifies software is behaviorally correct and functionally
complete
 “Definition of Done” (DoD)
 No “works on my box” arguments (we don’t ship your box)
Ensures functional integration
 Your code plays nicely with others
Increases regression coverage
 Tests in a suite is money in the bank; ensure what worked
yesterday, works today and will work tomorrow
WHY TEST
WHY TEST
Functional/Releasable
Maintainable
Sustainable
TESTS
WHY TEST
Tests are a form of feedback
 Developers get immediate feedback on changes to code by
running the test(s) to ensure the “contract is upheld”
Tests are a form of documentation
 Demonstrates how the code (e.g. API) is properly used
WHY TEST
Focus on the problem that needs to be solved
 Tests are a “contract for deliverables”; avoid “scope creep”
 Tests limits “over-engineering” (future coders)
 TDD
Testing gives developers confidence in their changes
 And more importantly… to “refactor” and make changes
 To learn
Testing encourages smaller, more frequent commits
 And by extension, “releasable” code
WHY TEST
Testing identifies design flaws
 Hard to test code is flawed and a sure sign of technical debt
Untested code triggers a domino effect
 User becomes the Tester leading to undesirable, costly
“workarounds” leading to technical debt leading to other bugs
leading to more serious issues like data corruption and so on
“Don’t be that guy!”
(the guy who doesn’t test his code)
Why are there different types of tests?
TYPES OF TESTS
Different types of tests cover different “aspects” (concerns)
of the software under test…
 Different test types serve to “close the feedback loop” at
different intervals in the software development lifecycle…
TYPES OF TESTS
Unit Tests
 Tests a single, contained “unit” of functionality
 Objects adhere to their contract (specified by the “interface”)
 Class invariants are upheld as object state changes
Integration Tests
 Tests interactions between “collaborators”
 Actual “dependencies” used
TYPES OF TESTS
Functional, Acceptance-based Tests (End-To-End)
 Tests user/software interaction based on predefined workflows
(Use Cases) and Functional Requirements
 Acceptance Tests are defined by Acceptance Criteria (based
on Functional Requirements)
 Usability Testing (UAT)
Performance-based Tests
 load/stress testing
TYPES OF TESTS
http://googletesting.blogspot.com/2015/04/just-say-no-to-more-end-to-end-tests.html
“What” and “How” do you test?
WHAT TO TEST
Test everything (or as much as you can)!
 Constructors, methods, input, output, Exception conditions, all
code paths, invariants/object state, thread safety…
 Test the unexpected
Don’t make assumptions; verify with tests
 “It is not only what you don’t know that gets you in trouble, it is
what you thought you knew that just isn’t so!”
ANATOMY OF A TEST
Arrange
Act
Assert (Verify)
How-To Unit Test Demonstration
JUnit
JUNIT - ASSERTIONS
With assertThat(..)
 More Readable (natural/DSL) and Strongly-typed
 Assert subject (actual), verb, object (expected)
Example
assertThat(x is(3)); // assert “x is 3” or “x == 3”
vs...
assertEquals(3, x); // assert “equals 3 x” or “== 3 x”
Examples…
JUNIT - ASSUMPTIONS
Useful to make test dependencies (pre-conditions) explicit
 Examples: Environment Configuration, Resource Availability
With assumeTrue(..) (JUnit) or the DSL-friendly
assumeThat(..) (Hamcrest)
Examples…
JUNIT - EXCEPTIONS
With Try/Catch Idiom (JUnit 3.x)
With @Test(expected = Class<? extends Throwable>)
With ExpectedException Rule (JUnit 4)
Examples…
JUNIT - PARAMETERIZED
Parameterized test class instances created for the cross-product of test case
methods and test data elements.
 Useful for large volume of data
Run test class with the Parameterized Test Runner.
@RunWith(Parameterized.class)
public class ParameterizedTest {
@Parameters
public Iterable<Object[]> data = …;
public ParameterizedTest(..) {
}
}
Example…
JUNIT - RULES
ErrorCollector – allows execution of test to continue after the first problem is
encountered (Fail-Fast!)
ExpectedException – specify expected error conditions in test
ExternalResource – setup external resource (File, Socket, Database Connection, …)
TemporaryFolder – creation of files and folders that are deleted after test case
(method) finishes
TestName – captures the name of a test inside test methods
Timeout – applies same timeout to all test case methods in test class
Example…
JUNIT - TIMEOUTS
With @Test(timeout = ms)
@Test(timeout = 500)
public void testWithTimeout() {
}
With Timeout Rule…
public class TestsWithGlobalTimeout {
@Rule
public Timeout globalTimeout = Timeout.seconds(20);
}
Example…
JUNIT – FIXTURES
With @BeforeClass, @Before, @AfterClass, @After
With (optionally) @ClassRule and ExternalResource Rule
Examples…
JUNIT – EXECUTION ORDER
By design, JUnit does not specify test execution order
 Test case method invocation determined by Reflection API
 JDK 7 is more or less random
Use MethodSorters and @FixMethodOrder annotation
 E.g. @FixMethodOrder(MethodSorters.NAME_ASCENDING)
Example…
JUNIT – AGGREGATION
Enables suites of tests to be grouped and built from existing
test classes using…
@RunWith(Suite.class)
@Suite.SuiteClasses({
ClientCommandsTest.class,
DiskStoreCommandsTest.class,
FunctionCommandsTest.class,
IndexCommandsTest.class,
MemberCommandsTest.class,
QueueCommandsTest.class,
…
})
public class GfshTestSuite {
}
JUNIT – ADDITIONAL FEATURES
 Test Runners (e.g. Categories, Parameterized,
MockitoJUnitRunner, SpringJUnit4ClassRunner)
 Categories (e.g. UnitTests, IntegrationTests,
AcceptanceTests)
 Theories – more flexible/expressive assertions combined with ability
to state assumptions
 Rule Chaining – with RuleChain to control test rule ordering
 Multithreaded Code and Concurrency (support)
 Eh, MultithreadedTC is better!
JUNIT – EXTENSIONS
HttpUnit - http://httpunit.sourceforge.net/
HtmlUnit - http://htmlunit.sourceforge.net/
Selenium - http://www.seleniumhq.org/
JUext - http://junitext.sourceforge.net/
http://www.tutorialspoint.com/junit/junit_extensions.htm
Unit Testing with Mocks
using Mockito
Why use Mocks in testing?
UNIT TESTING WITH MOCKS
Because… “If you can’t make it, fake it”
Mocks ensure focus is on the Subject (“unit”) of the test by
mocking interactions with Collaborators to verify appropriate
behavior of the Subject, not the Collaborator(s)
 Mocked Collaborators are “expected to behave” according to
their contract
Promotes programming to interfaces and delineation of
functional responsibility across teams
How-To Mock Demonstration
Mockito
MOCKITO - CALLBACKS
With…
when(mock.doSomething(..)).thenAnswer(new Answer<Object>() {
@Override public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
Integer intArg = invocation.getArgumentAt(0, Integer.class);
Object mock = invocation.getMock();
return …;
}
));
MOCKITO - STUBBING
Consecutive calls…
when(mock.getSomething(..)).thenReturn(“one”, “two”, “three”);
MOCKITO – ORDER
VERIFICATION
With…
InOrder inOrderVerifier = inOrder(firstMock, secondMock);
inOrderVerifier.verify(firstMock, times(2)).doSomething(..);
inOrderVerifier.verify(secondMock, atLeastOne()).doSomething(..);
MOCKITO - SPIES
Possible answer to… “Do not mock code you don’t own”
List<Object> list = new ArrayList<Object>();
List<?> spy = spy(list);
list.add(“one”);
verify(spy, times(1)).add(eq(“one”));
MOCKITO - LIMITATIONS
Cannot mock final (non-extensible) classes or final (non-
overridable) methods.
Cannot stub Spies in the usual way…
List<?> spy = spy(new ArrayList());
// Impossible – actual method is called so spy.get(0) throws
IndexOutOfBoundsException
when(spy.get(0).thenReturn(“TEST”);
// Use doReturn(..) to do stubbing
doReturn(“TEST”).when(spy).get(0);
??
MOCKITO - EXTENSIONS
PowerMock – enables mocking of static methods, constructors,
final classes and methods, private methods, removal of static
initializers plus more…
 Uses custom ClassLoader
 https://code.google.com/p/powermock/
MultithreadedTC
(sorry)
BEST PRACTICES
Test one thing at a time (per test case)
 Single code path; one interaction with a collaborator; one user
story, and so on…
 Prefer more test cases rather than bloated test cases
Tests should run quickly providing immediate feedback
* 10-minute build
Tests should fail-fast
Tests should be 100% reliable
BEST PRACTICES
Please do not ignore (@Ignore) or comment out failing tests!
 Understand test failures, take responsibility, fix the failures and
don’t commit until all tests pass
Write a test before fixing a bug
 Without a test it is problematic to verify the fix
BEST PRACTICES
Test cases should be independent and execution order
should not matter
Use meaningful test case (method) names
BEST PRACTICES
Ideally, interchanging Mocks with actual Collaborators does
not require any test changes
BEST PRACTICES
Follow the AAA Testing Pattern
 Arrange -> Act -> Assert
Follow the commit pattern…
1. Update, Create Topic Branch
2. Make Changes
3. Run Tests (if failure(s), goto 2)
4. Update (if changes, goto 3)
5. Merge & Commit
FINAL TESTING THOUGHT
Remember…
There is “good code” and then there is “tested code”.
REFERENCES
http://www.softwaretestinghelp.com/types-of-software-testing/
http://junit.org/
http://mockito.org/
http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html
https://code.google.com/p/powermock/
https://www.cs.umd.edu/projects/PL/multithreadedtc/overview.html
http://googletesting.blogspot.com/2015/04/just-say-no-to-more-end-to-end-tests.html
https://zeroturnaround.com/rebellabs/olegs-half-smart-hacks-put-a-timestamp-on-
ignore-with-java-8s-new-date-and-time-api/
http://www.codeaffine.com/2013/11/18/a-junit-rule-to-conditionally-ignore-tests/
REFERENCES
https://github.com/codeprimate-software/test-driven-development
Questions

More Related Content

PPTX
TDD - Agile
PPT
TDD (Test Driven Design)
PDF
Test Driven Development (TDD)
PDF
An Introduction to Test Driven Development
PDF
Unit testing best practices
PPTX
TDD - Test Driven Development
PPTX
Understanding Unit Testing
PDF
Bdd Introduction
TDD - Agile
TDD (Test Driven Design)
Test Driven Development (TDD)
An Introduction to Test Driven Development
Unit testing best practices
TDD - Test Driven Development
Understanding Unit Testing
Bdd Introduction

What's hot (20)

PDF
TDD Flow: The Mantra in Action
PPTX
Test automation
PPTX
Unit tests & TDD
PPS
Unit Testing
PDF
An introduction to Behavior-Driven Development (BDD)
PDF
Automated testing with Cypress
PPT
Automation testing
PPTX
Unit Testing in Java
PPTX
Unit Tests And Automated Testing
PPT
Test Automation Framework Designs
PPTX
Unit Testing And Mocking
PPTX
TestNG Session presented in PB
PPTX
UNIT TESTING PPT
PPTX
Test Automation Framework with BDD and Cucumber
PPTX
Automation - web testing with selenium
PPT
05 junit
PPTX
Unit Testing Concepts and Best Practices
PPTX
Unit Testing
ODP
Introduction to BDD
PDF
A Not-So-Serious Introduction to Test Driven Development (TDD)
TDD Flow: The Mantra in Action
Test automation
Unit tests & TDD
Unit Testing
An introduction to Behavior-Driven Development (BDD)
Automated testing with Cypress
Automation testing
Unit Testing in Java
Unit Tests And Automated Testing
Test Automation Framework Designs
Unit Testing And Mocking
TestNG Session presented in PB
UNIT TESTING PPT
Test Automation Framework with BDD and Cucumber
Automation - web testing with selenium
05 junit
Unit Testing Concepts and Best Practices
Unit Testing
Introduction to BDD
A Not-So-Serious Introduction to Test Driven Development (TDD)
Ad

Viewers also liked (20)

PDF
Behavior Driven Development with Cucumber
PDF
Java Exception Handling Best Practices - Improved Second Version
PDF
Introduction to JPA and Hibernate including examples
PPTX
Junit and cactus
PDF
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
PDF
Overview on TDD (Test Driven Development) & ATDD (Acceptance Test Driven Deve...
DOCX
MARIANITO CV
PDF
Sondeo exploratorio
PDF
Prospective clinical trial of traction device-assisted endoscopic submucosal ...
PDF
Connections
PPTX
Try hard until you suceed (1)
PDF
How To Choose Perfect Hair Color ?
DOCX
FEA - Simple Analysis example
PDF
Увеличение личных продаж от 3 раз и выше
PDF
Matthew Hartman cv.docx (1)
PPTX
Steps to the college process
PPTX
Epoca precolombina tema 1
PDF
M025128139
PDF
Jerry Resume
PDF
White Genocide In South Africa - Here Are The Names
Behavior Driven Development with Cucumber
Java Exception Handling Best Practices - Improved Second Version
Introduction to JPA and Hibernate including examples
Junit and cactus
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
Overview on TDD (Test Driven Development) & ATDD (Acceptance Test Driven Deve...
MARIANITO CV
Sondeo exploratorio
Prospective clinical trial of traction device-assisted endoscopic submucosal ...
Connections
Try hard until you suceed (1)
How To Choose Perfect Hair Color ?
FEA - Simple Analysis example
Увеличение личных продаж от 3 раз и выше
Matthew Hartman cv.docx (1)
Steps to the college process
Epoca precolombina tema 1
M025128139
Jerry Resume
White Genocide In South Africa - Here Are The Names
Ad

Similar to Test-Driven Development (20)

PDF
Unit testing basic
PDF
JUnit with_mocking
PDF
Android Test Driven Development & Android Unit Testing
PPTX
The Test way
PPTX
Java Unit Testing
PPTX
JUnit Test Case With Processminer modules.pptx
PDF
Introduction to test automation in java and php
ODP
Embrace Unit Testing
PPTX
Test driven development(tdd)
PDF
Unit testing - An introduction
PPTX
8-testing.pptx
PPTX
Skillwise Unit Testing
PDF
Testing and TDD - KoJUG
PPTX
TDD - Unit Testing
PDF
The Art of Unit Testing Feedback
PPTX
Unit testing
PPTX
Testing 101
PPTX
JUnit- A Unit Testing Framework
PPTX
Integration and Unit Testing in Java using Test Doubles like mocks and stubs
PDF
31b - JUnit and Mockito.pdf
Unit testing basic
JUnit with_mocking
Android Test Driven Development & Android Unit Testing
The Test way
Java Unit Testing
JUnit Test Case With Processminer modules.pptx
Introduction to test automation in java and php
Embrace Unit Testing
Test driven development(tdd)
Unit testing - An introduction
8-testing.pptx
Skillwise Unit Testing
Testing and TDD - KoJUG
TDD - Unit Testing
The Art of Unit Testing Feedback
Unit testing
Testing 101
JUnit- A Unit Testing Framework
Integration and Unit Testing in Java using Test Doubles like mocks and stubs
31b - JUnit and Mockito.pdf

More from John Blum (6)

PPTX
Getting Started with Apache Geode
PPTX
Spring Data and In-Memory Data Management in Action
PDF
Spring Data (GemFire) Overview
PPTX
Introducing Apache Geode and Spring Data GemFire
PPTX
Building Highly Scalable Spring Applications using In-Memory Data Grids
POTX
Building Effective Apache Geode Applications with Spring Data GemFire
Getting Started with Apache Geode
Spring Data and In-Memory Data Management in Action
Spring Data (GemFire) Overview
Introducing Apache Geode and Spring Data GemFire
Building Highly Scalable Spring Applications using In-Memory Data Grids
Building Effective Apache Geode Applications with Spring Data GemFire

Recently uploaded (20)

PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
CHAPTER 2 - PM Management and IT Context
PPTX
Computer Software and OS of computer science of grade 11.pptx
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
CCleaner Pro 6.38.11537 Crack Final Latest Version 2025
PPTX
L1 - Introduction to python Backend.pptx
PDF
Nekopoi APK 2025 free lastest update
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
DOCX
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
PDF
medical staffing services at VALiNTRY
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PPTX
Advanced SystemCare Ultimate Crack + Portable (2025)
PDF
Salesforce Agentforce AI Implementation.pdf
PDF
Designing Intelligence for the Shop Floor.pdf
PDF
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
PDF
Cost to Outsource Software Development in 2025
PDF
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
PDF
Download FL Studio Crack Latest version 2025 ?
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
CHAPTER 2 - PM Management and IT Context
Computer Software and OS of computer science of grade 11.pptx
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
CCleaner Pro 6.38.11537 Crack Final Latest Version 2025
L1 - Introduction to python Backend.pptx
Nekopoi APK 2025 free lastest update
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
medical staffing services at VALiNTRY
Odoo Companies in India – Driving Business Transformation.pdf
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Advanced SystemCare Ultimate Crack + Portable (2025)
Salesforce Agentforce AI Implementation.pdf
Designing Intelligence for the Shop Floor.pdf
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
Cost to Outsource Software Development in 2025
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
Download FL Studio Crack Latest version 2025 ?

Test-Driven Development

  • 2. AGENDA  Misconceptions  Why Test  Types of Tests  What & How to Test  Using JUnit, Mockito and MultithreadedTC  Best Practices  Final Thoughts  QA
  • 3. “No amount of testing can prove a software right, but a single test can prove a software wrong.” – Amir Ghahrai
  • 4. MISCONCEPTIONS Testing is a Quality Engineer’s (QE/SDET) job  Quality Assurance (QA) is everyone’s responsibility
  • 5. MISCONCEPTIONS Automated tests are unnecessary if I manually test and debug my code  Testing is not a replacement for debuggers and other development tools either (e.g. Profilers, FindBugs, etc) Not possible to automate all tests  Difficult when the software architecture & design is flawed
  • 6. Developer tests are “Unit Tests” JUnit is a “Unit Test” framework  JUnit is a framework facilitating the development and execution of automated tests  Used in Integration and Functional (Acceptance) testing MISCONCEPTIONS
  • 7. Software is correct when there is 100% test coverage and no FindBugs (CheckStyle, PMD) errors  A bug occurs when the software fails to function properly in a prescribed manner  A defect occurs after the software is used in a unintentional way and behaves unexpectedly MISCONCEPTIONS
  • 8. "Not everything that can be counted counts and not everything that counts can be counted." - Albert Einstein
  • 9. Why do software engineers write tests?
  • 10. Or… Why don’t software engineers write tests?
  • 11. TO TEST OR NOT TO TEST? Time Constraints  Time-based vs. Functional-based releases  Quantity (Scope) over Quality (Less is More) (Cultural) Responsibility Laziness, Ignorance, Fear  Not detail-oriented
  • 12. Verifies software is behaviorally correct and functionally complete  “Definition of Done” (DoD)  No “works on my box” arguments (we don’t ship your box) Ensures functional integration  Your code plays nicely with others Increases regression coverage  Tests in a suite is money in the bank; ensure what worked yesterday, works today and will work tomorrow WHY TEST
  • 14. WHY TEST Tests are a form of feedback  Developers get immediate feedback on changes to code by running the test(s) to ensure the “contract is upheld” Tests are a form of documentation  Demonstrates how the code (e.g. API) is properly used
  • 15. WHY TEST Focus on the problem that needs to be solved  Tests are a “contract for deliverables”; avoid “scope creep”  Tests limits “over-engineering” (future coders)  TDD Testing gives developers confidence in their changes  And more importantly… to “refactor” and make changes  To learn Testing encourages smaller, more frequent commits  And by extension, “releasable” code
  • 16. WHY TEST Testing identifies design flaws  Hard to test code is flawed and a sure sign of technical debt Untested code triggers a domino effect  User becomes the Tester leading to undesirable, costly “workarounds” leading to technical debt leading to other bugs leading to more serious issues like data corruption and so on
  • 17. “Don’t be that guy!” (the guy who doesn’t test his code)
  • 18. Why are there different types of tests?
  • 19. TYPES OF TESTS Different types of tests cover different “aspects” (concerns) of the software under test…  Different test types serve to “close the feedback loop” at different intervals in the software development lifecycle…
  • 20. TYPES OF TESTS Unit Tests  Tests a single, contained “unit” of functionality  Objects adhere to their contract (specified by the “interface”)  Class invariants are upheld as object state changes Integration Tests  Tests interactions between “collaborators”  Actual “dependencies” used
  • 21. TYPES OF TESTS Functional, Acceptance-based Tests (End-To-End)  Tests user/software interaction based on predefined workflows (Use Cases) and Functional Requirements  Acceptance Tests are defined by Acceptance Criteria (based on Functional Requirements)  Usability Testing (UAT) Performance-based Tests  load/stress testing
  • 23. “What” and “How” do you test?
  • 24. WHAT TO TEST Test everything (or as much as you can)!  Constructors, methods, input, output, Exception conditions, all code paths, invariants/object state, thread safety…  Test the unexpected Don’t make assumptions; verify with tests  “It is not only what you don’t know that gets you in trouble, it is what you thought you knew that just isn’t so!”
  • 25. ANATOMY OF A TEST Arrange Act Assert (Verify)
  • 26. How-To Unit Test Demonstration
  • 27. JUnit
  • 28. JUNIT - ASSERTIONS With assertThat(..)  More Readable (natural/DSL) and Strongly-typed  Assert subject (actual), verb, object (expected) Example assertThat(x is(3)); // assert “x is 3” or “x == 3” vs... assertEquals(3, x); // assert “equals 3 x” or “== 3 x” Examples…
  • 29. JUNIT - ASSUMPTIONS Useful to make test dependencies (pre-conditions) explicit  Examples: Environment Configuration, Resource Availability With assumeTrue(..) (JUnit) or the DSL-friendly assumeThat(..) (Hamcrest) Examples…
  • 30. JUNIT - EXCEPTIONS With Try/Catch Idiom (JUnit 3.x) With @Test(expected = Class<? extends Throwable>) With ExpectedException Rule (JUnit 4) Examples…
  • 31. JUNIT - PARAMETERIZED Parameterized test class instances created for the cross-product of test case methods and test data elements.  Useful for large volume of data Run test class with the Parameterized Test Runner. @RunWith(Parameterized.class) public class ParameterizedTest { @Parameters public Iterable<Object[]> data = …; public ParameterizedTest(..) { } } Example…
  • 32. JUNIT - RULES ErrorCollector – allows execution of test to continue after the first problem is encountered (Fail-Fast!) ExpectedException – specify expected error conditions in test ExternalResource – setup external resource (File, Socket, Database Connection, …) TemporaryFolder – creation of files and folders that are deleted after test case (method) finishes TestName – captures the name of a test inside test methods Timeout – applies same timeout to all test case methods in test class Example…
  • 33. JUNIT - TIMEOUTS With @Test(timeout = ms) @Test(timeout = 500) public void testWithTimeout() { } With Timeout Rule… public class TestsWithGlobalTimeout { @Rule public Timeout globalTimeout = Timeout.seconds(20); } Example…
  • 34. JUNIT – FIXTURES With @BeforeClass, @Before, @AfterClass, @After With (optionally) @ClassRule and ExternalResource Rule Examples…
  • 35. JUNIT – EXECUTION ORDER By design, JUnit does not specify test execution order  Test case method invocation determined by Reflection API  JDK 7 is more or less random Use MethodSorters and @FixMethodOrder annotation  E.g. @FixMethodOrder(MethodSorters.NAME_ASCENDING) Example…
  • 36. JUNIT – AGGREGATION Enables suites of tests to be grouped and built from existing test classes using… @RunWith(Suite.class) @Suite.SuiteClasses({ ClientCommandsTest.class, DiskStoreCommandsTest.class, FunctionCommandsTest.class, IndexCommandsTest.class, MemberCommandsTest.class, QueueCommandsTest.class, … }) public class GfshTestSuite { }
  • 37. JUNIT – ADDITIONAL FEATURES  Test Runners (e.g. Categories, Parameterized, MockitoJUnitRunner, SpringJUnit4ClassRunner)  Categories (e.g. UnitTests, IntegrationTests, AcceptanceTests)  Theories – more flexible/expressive assertions combined with ability to state assumptions  Rule Chaining – with RuleChain to control test rule ordering  Multithreaded Code and Concurrency (support)  Eh, MultithreadedTC is better!
  • 38. JUNIT – EXTENSIONS HttpUnit - http://httpunit.sourceforge.net/ HtmlUnit - http://htmlunit.sourceforge.net/ Selenium - http://www.seleniumhq.org/ JUext - http://junitext.sourceforge.net/ http://www.tutorialspoint.com/junit/junit_extensions.htm
  • 39. Unit Testing with Mocks using Mockito
  • 40. Why use Mocks in testing?
  • 41. UNIT TESTING WITH MOCKS Because… “If you can’t make it, fake it” Mocks ensure focus is on the Subject (“unit”) of the test by mocking interactions with Collaborators to verify appropriate behavior of the Subject, not the Collaborator(s)  Mocked Collaborators are “expected to behave” according to their contract Promotes programming to interfaces and delineation of functional responsibility across teams
  • 44. MOCKITO - CALLBACKS With… when(mock.doSomething(..)).thenAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); Integer intArg = invocation.getArgumentAt(0, Integer.class); Object mock = invocation.getMock(); return …; } ));
  • 45. MOCKITO - STUBBING Consecutive calls… when(mock.getSomething(..)).thenReturn(“one”, “two”, “three”);
  • 46. MOCKITO – ORDER VERIFICATION With… InOrder inOrderVerifier = inOrder(firstMock, secondMock); inOrderVerifier.verify(firstMock, times(2)).doSomething(..); inOrderVerifier.verify(secondMock, atLeastOne()).doSomething(..);
  • 47. MOCKITO - SPIES Possible answer to… “Do not mock code you don’t own” List<Object> list = new ArrayList<Object>(); List<?> spy = spy(list); list.add(“one”); verify(spy, times(1)).add(eq(“one”));
  • 48. MOCKITO - LIMITATIONS Cannot mock final (non-extensible) classes or final (non- overridable) methods. Cannot stub Spies in the usual way… List<?> spy = spy(new ArrayList()); // Impossible – actual method is called so spy.get(0) throws IndexOutOfBoundsException when(spy.get(0).thenReturn(“TEST”); // Use doReturn(..) to do stubbing doReturn(“TEST”).when(spy).get(0); ??
  • 49. MOCKITO - EXTENSIONS PowerMock – enables mocking of static methods, constructors, final classes and methods, private methods, removal of static initializers plus more…  Uses custom ClassLoader  https://code.google.com/p/powermock/
  • 51. BEST PRACTICES Test one thing at a time (per test case)  Single code path; one interaction with a collaborator; one user story, and so on…  Prefer more test cases rather than bloated test cases Tests should run quickly providing immediate feedback * 10-minute build Tests should fail-fast Tests should be 100% reliable
  • 52. BEST PRACTICES Please do not ignore (@Ignore) or comment out failing tests!  Understand test failures, take responsibility, fix the failures and don’t commit until all tests pass Write a test before fixing a bug  Without a test it is problematic to verify the fix
  • 53. BEST PRACTICES Test cases should be independent and execution order should not matter Use meaningful test case (method) names
  • 54. BEST PRACTICES Ideally, interchanging Mocks with actual Collaborators does not require any test changes
  • 55. BEST PRACTICES Follow the AAA Testing Pattern  Arrange -> Act -> Assert Follow the commit pattern… 1. Update, Create Topic Branch 2. Make Changes 3. Run Tests (if failure(s), goto 2) 4. Update (if changes, goto 3) 5. Merge & Commit
  • 56. FINAL TESTING THOUGHT Remember… There is “good code” and then there is “tested code”.