SlideShare a Scribd company logo
1 of 125
Download to read offline
TDD
on Android
Danny Preussler, Øredev 2018
@PreusslerBerlin
about:me
• Switched to Java in 2003
• Talking about testing on mobile since 2008
• Worked for eBay, Groupon, Viacom
@PreusslerBerlin
Let’s
talk about
tests
@PreusslerBerlin
“Code without tests is bad code.”
“any code without test is a legacy code.”
(Michael C. Feathers)
@PreusslerBerlin
“Code without tests is bad code.”
“any code without test is legacy code.”
(Michael C. Feathers)
@PreusslerBerlin
Tests give confidence
“how do you know something works when you
don’t have test for it?”
(Robert ‘Uncle Bob’ Martin)
@PreusslerBerlin
Tests allow refactoring
“Refactoring without good test coverage
is changing shit”
(Martin Fowler)
@PreusslerBerlin
TDD
@PreusslerBerlin
History
• Started with test first from XP in 1999 by Kent
Beck
• Just a rediscovery:
test first was normal in early days of
programming
• Famous as TDD since Kent Becks book in 2003
@PreusslerBerlin
History
• Started with test first from XP in 1999 by Kent
Beck
• Just a rediscovery:
test first was normal in early days of
programming
• Famous as TDD since Kent Becks book in 2003
@PreusslerBerlin
History
• Started with test first from XP in 1999 by Kent
Beck
• Just a rediscovery:
test first was normal in early days of
programming
• Famous as TDD since Kent Becks book in 2003
@PreusslerBerlin
How does
it work?
@PreusslerBerlin
The 3 rules of TDD
• You must write a failing test before you
write any production code.
• You must not write more of a test than is
sufficient to fail, or fail to compile.
• You must not write more production
code than is sufficient to make the
currently failing test pass.
nano-cycle (seconds)
@PreusslerBerlin
The 3 rules of TDD
• You must write a failing test before you
write any production code.
• You must not write more of a test than is
sufficient to fail, or fail to compile.
• You must not write more production
code than is sufficient to make the
currently failing test pass.
nano-cycle (seconds)
@PreusslerBerlin
The 3 rules of TDD
• You must write a failing test before you
write any production code.
• You must not write more of a test than is
sufficient to fail, or fail to compile.
• You must not write more production
code than is sufficient to make the
currently failing test pass.
nano-cycle (seconds)
@PreusslerBerlin
Red Green Refactor
• Make it fail
• Make it work
• Make it right
micro-cycle (minutes)
@PreusslerBerlin
Red Green Refactor
• Create a unit tests that fails
• Write just enough production code
to makes that test pass.
• Clean up the mess you just made.
micro-cycle (minutes)
@PreusslerBerlin
Red Green Refactor
• Create a unit tests that fails
• Write just enough production code
to makes that test pass.
• Clean up the mess you just made.
micro-cycle (minutes)
@PreusslerBerlin
Red Green Refactor
• Create a unit tests that fails
• Write just enough production code
to makes that test pass.
• Clean up the mess you just made.
micro-cycle (minutes)
@PreusslerBerlin
WTF
https://www.flickr.com/photos/jantruter/12794187835
@PreusslerBerlin
Baby steps
Based: our limited minds are not capable of two
simultaneous goals:
1. Correct behavior.
2. Correct structure.
https://www.flickr.com/photos/21561428@N03/4616816371
@PreusslerBerlin
Red Green Refactor
• You need red:
• as no one tests the tests
• In green:
• Speed trumps design!
• Make it dirty!
@PreusslerBerlin
Red Green Refactor
• Always be one step away from green bar
@PreusslerBerlin
Red Green Refactor
• Always be one step away from green bar
• Think of new test-> write it down
@PreusslerBerlin
Red Green Refactor
• Always be one step away from green bar
• Think of new test-> write it down
• It’s getting ugly? -> write it down
@PreusslerBerlin
Why?
•YAGNI and KISS out of the box
•No more over engineering
•Test all business needs
•Eliminate debugging
•Minimize use of Android devices
@PreusslerBerlin
Why?
•It’s Gamification = fun
•Small Changes -> Small PRs
•Always know what’s next
@PreusslerBerlin
Why?
•Less stressful
•Go home any time
•Interrupt any time
•No need for “flow”
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Write the tests that
forces you
to write the code
you want to write
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Start somewhere
@PreusslerBerlin
Write the tests that
forces you
to write the code
you want to write
Tip: Create a list of tests on paper
@PreusslerBerlin
It is ok to delete tests!
@PreusslerBerlin
Isn’t that
slow?
https://pixabay.com/en/snail-illustration-drawing-yellow-1757756/
@PreusslerBerlin
Isn’t it slow?
Writing tests is slower than not writing tests.
You’ll write at least as much test code as
production code
@PreusslerBerlin
Isn’t it slow?
Writing tests is slower than not writing tests.
You’ll write at least as much test code as
production code
@PreusslerBerlin
Isn’t it slow?
Research shows that TDD:
adds 10%—30% on initial costs
= longer to complete their projects
@PreusslerBerlin
Isn’t it slow?
Research shows that TDD:
• Reduces defect density by 60-90 %
• Reduces production bug density by 40–80%
@PreusslerBerlin
Isn’t it slow?
Without TDD, you spend a few weeks writing
code which mostly works and spend the next
year "testing" and fixing many (but not all) of the
bugs
@PreusslerBerlin
Isn’t it slow?
With TDD, you spend a year writing code which
actually works. Then you do final integration
testing for a few weeks.
@PreusslerBerlin
Isn’t it slow?
• Single feature will take longer
• Bugfixing phase is shorter
• Debugging disappears
• Ci finds bugs before tester does
• Long term it’s much faster no more big rewrite
@PreusslerBerlin
Android
specifics
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
protected
@PreusslerBerlin
package android.app
fun Activity.onCreate(bundle: Bundle?)
= this.onCreate(bundle)
github.com/
dpreussler/android-tdd-utils
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
Does this work?
@PreusslerBerlin
Android SDK under test
• Android classes can be loaded on JVM:
build/generated/mockable-android-XX.jar
• Removes finals and ALL the code!
@PreusslerBerlin
Android SDK under test
• Empty methods with default return values
android {
…
testOptions {
unitTests.returnDefaultValues = true
}
-> no code will run
@PreusslerBerlin
The problem of v4… Activity
• mockable.jar not existing for libraries,
including support library L
-> real code will run
@PreusslerBerlin
The problem of v4… Activity
• Helper method
fun <T : FragmentActivity> T.prepareForTest(): T {
…
whenever(supportFragmentManager).thenReturn(mockSupportFragmentManager)
whenever(fragmentManager).thenReturn(mockFragmentManager)
whenever(layoutInflater).thenReturn(mockLayoutInflater)
}
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity().prepareForTest()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
@PreusslerBerlin
val binding = mock<ActivityPrivacyPolicyBinding>()
val tested = PrivacyPolicyActivity().prepareForTest()
@Nested
inner class `When created` {
@Test
fun `sets viewmodel`() {
tested.onCreate(null)
verify(binding).viewModel =
navigationViewModel
}
}
@PreusslerBerlin
@Nested
inner class `When started` {
@Test
fun `forwards lifecylce to viewmodel`() {
tested.onStart()
verify(viewModel).onStart() }
}
java.lang.NullPointerException
at
android.support.v17.leanback.app.PlaybackSupportFragment.setupChild
FragmentLayout(PlaybackSupportFragment.java:730)
at
android.support.v17.leanback.app.PlaybackSupportFragment.onStart(Pl
aybackSupportFragment.java:899)
@PreusslerBerlin
fun Fragment.safeStart() {
try {
onStart()
}catch (e: NullPointerException) {}
catch (e: IllegalStateException) {}
}
github.com/
dpreussler/android-tdd-utils
@PreusslerBerlin
Avoid
Activity/Fragment
code
@PreusslerBerlin
Avoid activity and fragment code
• Use life cycle aware components!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
observeLifecycleIn(viewModel)
}
@OnLifecycleEvent(ON_START)
fun onStart() {
….
}
@PreusslerBerlin
Avoid activity and fragment code
• Testing android view classes are hard
• So let’s make sure we don’t need to test them!
Use the power of data binding
@PreusslerBerlin
Data binding…
XML ViewModelbind
@PreusslerBerlin
Data binding…
who is the view?
• Solves the one big android question once
and for all
XML
@PreusslerBerlin
What’s left?
• Activities needs to be declared in manifest
• Permissions for older devices
@PreusslerBerlin
What’s left?
@PreusslerBerlin
What’s left?
• Manifest via lint
lintOptions {
check 'Registered'
warningsAsErrors true
}
* Has issues with Gradle Plugin 3.0 and Kotlin
@PreusslerBerlin
What’s left?
• Zero tolerance policy very valuable
@PreusslerBerlin
What’s left?
• Get access to merged manifest and resources:
testOptions {
unitTests.includeAndroidResources = true
}
com/android/tools/
test_config.properties
@PreusslerBerlin
Whats left?
• UI: text size, button text…
@PreusslerBerlin
What about
Espresso?
@PreusslerBerlin
What about Espresso
• need to be fast! fast feedback!
• need to run continuously!
Espresso can’t give any of those
@PreusslerBerlin
What about Espresso
• Test first? Yes!
• TDD? No!
@PreusslerBerlin
What about
Robolectric?
@PreusslerBerlin
Tired of issues like
java.lang.NullPointerException
at
org.robolectric.manifest.MetaData
.init(MetaData.java:55)
at
org.robolectric.manifest.AndroidM
anifest.initMetaData(AndroidManif
est.java:377)....
?
Sleepy by Tomas; flickr.com/photos/tma/2438467223; CC 2.0
Don’t spent more time
fixing your test setup
than fixing your app
Sleepy by Tomas; flickr.com/photos/tma/2438467223; CC 2.0
Still valid?
@PreusslerBerlin
Robolectric 4
@PreusslerBerlin
Robolectric 4
@PreusslerBerlin
Robolectric 4
@PreusslerBerlin
Robolectric 4
• Robolectric is just another “android device”
when using Espresso like API
• Not compatible with Junit5
• More stable now as of new API?!
• Still slower!?
@PreusslerBerlin
Robolectric 4
• Increases first test run by 6-8 sec
• With ActivityTestRule: 12-14 sec
@PreusslerBerlin
SPEED!
• Build speed is important
• Test new features in separate module!
@PreusslerBerlin
Limitations
• Custom view and animation code might get too
hard
@PreusslerBerlin
What
about
architecture
?
@PreusslerBerlin
What about architecture?
• TDD does not replace Architecture and Design
• Have a vision in your head
• NO big up front design
• Defer architecture decisions as long as possible
@PreusslerBerlin
What about architecture?
• TDD does not replace Architecture and Design
• Have a vision in your head
• NO big up front design
• Defer architecture decisions as long as possible
@PreusslerBerlin
What about architecture?
• TDD does not replace Architecture and Design
• Have a vision in your head
• No big up front design
• Defer architecture decisions as long as possible
@PreusslerBerlin
What about architecture?
• TDD does not replace Architecture and Design
• Have a vision in your head
• No big up front design
• Defer architecture decisions as long as possible
@PreusslerBerlin
What
about
code
coverage
?
@PreusslerBerlin
What about code coverage
In TDD
100% coverage
is a
side effect
not a goal!
@PreusslerBerlin
What
about
mocking
?
@PreusslerBerlin
What about mocking
• Mocks make our tests flaky
• Only mock your outside dependency
(think of modules not classes)
@PreusslerBerlin
What about mocking
• Mocks make our tests flaky
• Only mock your outside dependency
(think of modules not classes)
@PreusslerBerlin
What about mocking
• TDD changes the way your tests will be:
Test1 Test2
Class1 Class2 Class3
Test3
@PreusslerBerlin
What about mocking
• TDD changes the way your tests will be:
Test1
Class1 Class2 Class3
@PreusslerBerlin
What about mocking
• TDD changes the way your tests will be:
Test1
Class1
@PreusslerBerlin
What about mocking
• TDD changes the way your tests will be:
Test1
Class1 Class2 Class3
@PreusslerBerlin
What about mocking
• Tests will become more solid
Test1
ViewModel Repository API
@PreusslerBerlin
What about mocking
• Tests will become more solid
Test1
ViewModel
Repository API
Store Reducer
SideEffects
@PreusslerBerlin
What about mocking
• Tests will become more solid
Test1
ViewModel
Repository API
Store Reducer
SideEffects
@PreusslerBerlin
What about mocking
• Mock your outside dependency (modules)
Test1
ViewModel
Repository API
Store Reducer
SideEffects
@PreusslerBerlin
That’s not
a UNIT test!?
Test1
Class1 Class2 Class3
@PreusslerBerlin
TDD and tests
• Kent Beck spoke about behavior of the system
in his TDD book
• A “unit” does not mean every class/method!
Unit came from Blackbox!
• TDD tests behaviors not implementation details!
• What your software does, is stable!
How it does this, is unstable!
TDD what went wrong: https://www.youtube.com/watch?v=EZ05e7EMOLM
@PreusslerBerlin
TDD and tests
• Kent Beck spoke about behavior of the system
in his TDD book
• A “unit” does not mean every class/method!
Unit came from Blackbox!
• TDD tests behaviors not implementation details!
• What your software does, is stable!
How it does this, is unstable!
TDD what went wrong: https://www.youtube.com/watch?v=EZ05e7EMOLM
@PreusslerBerlin
TDD and tests
• Kent Beck spoke about behavior of the system
in his TDD book
• A “unit” does not mean every class/method!
Unit came from Blackbox!
• TDD tests behaviors not implementation details!
• What your software does, is stable!
How it does this, is unstable!
TDD what went wrong: https://www.youtube.com/watch?v=EZ05e7EMOLM
@PreusslerBerlin
TDD and tests
• Kent Beck spoke about behavior of the system
in his TDD book
• A “unit” does not mean every class/method!
Unit came from Blackbox!
• TDD tests behaviors not implementation details!
• What your software does, is stable!
How it does this, is unstable!
TDD what went wrong: https://www.youtube.com/watch?v=EZ05e7EMOLM
@PreusslerBerlin
What
about
protoypes
?
@PreusslerBerlin
What about Prototypes?
hacking is fine
but afterwards
start from scratch!
@PreusslerBerlin
What
about
MVP ?
@PreusslerBerlin
What about MVP?
MVP is a minimum feature
set but
no excuse for bad quality
@PreusslerBerlin
"Test only if you would
want it to work.”
Kent Beck
@PreusslerBerlin
If it's worth building,
it's worth testing
If it's not worth testing,
why are you wasting your time
working on it?
@PreusslerBerlin
If it's worth building,
it's worth testing
If it's not worth testing,
why are you wasting your time
working on it?
@PreusslerBerlin
TDD on Android?
• Its possible!
• Might feel extreme
• But it’s fun!
https://www.flickr.com/photos/chefranden/14838138493
More resources
• Test Driven Development by Example (Kent Beck)
• TDD what went wrong:
https://www.youtube.com/watch?v=EZ05e7EMOLM
• The three laws of TDD by Uncle Bob
https://www.youtube.com/watch?time_continue=1
7&v=AoIfc5NwRks
• https://cleancoders.com/videos
More resources
• https://online-training.jbrains.ca/p/wbitdd-01
• https://medium.com/androiddevelopers/write-
once-run-everywhere-tests-on-android-
88adb2ba20c5
• github.com/sporttotal-tv/android-tdd-
workshop
• github.com/dpreussler/android-tdd-utils
@PreusslerBerlin
sporttotal.tv
• We are streaming under-medialised sports
• Looking for
Backend/Frontend/iOS Developer Designer
(Cologne, Berlin)
TDD
on Android
@PreusslerBerlin

More Related Content

What's hot

Continuous integration meetup
Continuous integration meetupContinuous integration meetup
Continuous integration meetupDrew Stephens
 
MongoDB World 2018: Tutorial - MongoDB Meets Chaos Monkey
MongoDB World 2018: Tutorial - MongoDB Meets Chaos MonkeyMongoDB World 2018: Tutorial - MongoDB Meets Chaos Monkey
MongoDB World 2018: Tutorial - MongoDB Meets Chaos MonkeyMongoDB
 
Introduction to jest
Introduction to jestIntroduction to jest
Introduction to jestpksjce
 
ScreenPlay Design Patterns for QA Automation
ScreenPlay Design Patterns for QA AutomationScreenPlay Design Patterns for QA Automation
ScreenPlay Design Patterns for QA AutomationCOMAQA.BY
 
Remote research uxpa talk
Remote research uxpa talkRemote research uxpa talk
Remote research uxpa talkGavin Fung
 

What's hot (7)

Continuous integration meetup
Continuous integration meetupContinuous integration meetup
Continuous integration meetup
 
Code smells in PHP
Code smells in PHPCode smells in PHP
Code smells in PHP
 
Reliable acceptance testing
Reliable acceptance testingReliable acceptance testing
Reliable acceptance testing
 
MongoDB World 2018: Tutorial - MongoDB Meets Chaos Monkey
MongoDB World 2018: Tutorial - MongoDB Meets Chaos MonkeyMongoDB World 2018: Tutorial - MongoDB Meets Chaos Monkey
MongoDB World 2018: Tutorial - MongoDB Meets Chaos Monkey
 
Introduction to jest
Introduction to jestIntroduction to jest
Introduction to jest
 
ScreenPlay Design Patterns for QA Automation
ScreenPlay Design Patterns for QA AutomationScreenPlay Design Patterns for QA Automation
ScreenPlay Design Patterns for QA Automation
 
Remote research uxpa talk
Remote research uxpa talkRemote research uxpa talk
Remote research uxpa talk
 

Similar to TDD on Android (Øredev 2018)

TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)Danny Preussler
 
Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Danny Preussler
 
Testing without assertions - #HUSTEF2019
Testing without assertions - #HUSTEF2019Testing without assertions - #HUSTEF2019
Testing without assertions - #HUSTEF2019SAP SE
 
Junit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behindJunit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behindDanny Preussler
 
Driving application development through behavior driven development
Driving application development through behavior driven developmentDriving application development through behavior driven development
Driving application development through behavior driven developmentEinar Ingebrigtsen
 
Agile experiments in Machine Learning with F#
Agile experiments in Machine Learning with F#Agile experiments in Machine Learning with F#
Agile experiments in Machine Learning with F#J On The Beach
 
Agile Experiments in Machine Learning
Agile Experiments in Machine LearningAgile Experiments in Machine Learning
Agile Experiments in Machine Learningmathias-brandewinder
 
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...FalafelSoftware
 
Continuous Integration, the minimum viable product
Continuous Integration, the minimum viable productContinuous Integration, the minimum viable product
Continuous Integration, the minimum viable productJulian Simpson
 
Test Automation without Assertions
Test Automation without AssertionsTest Automation without Assertions
Test Automation without AssertionsAll Things Open
 
Testing Without Assertions
Testing Without AssertionsTesting Without Assertions
Testing Without AssertionsSAP SE
 
TDD super mondays-june-2014
TDD super mondays-june-2014TDD super mondays-june-2014
TDD super mondays-june-2014Alex Kavanagh
 
Writing useful automated tests for the single page applications you build
Writing useful automated tests for the single page applications you buildWriting useful automated tests for the single page applications you build
Writing useful automated tests for the single page applications you buildAndrei Sebastian Cîmpean
 
MidwestJS Zero to Testing
MidwestJS Zero to TestingMidwestJS Zero to Testing
MidwestJS Zero to Testingpamselle
 
TDD & Effective Software Development
TDD & Effective Software DevelopmentTDD & Effective Software Development
TDD & Effective Software Developmentsamserpoosh
 
Data driven devops as presented at QCon London 2018
Data driven devops as presented at QCon London 2018Data driven devops as presented at QCon London 2018
Data driven devops as presented at QCon London 2018Baruch Sadogursky
 
Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...Niels Frydenholm
 
Learn To Test Like A Grumpy Programmer - 3 hour workshop
Learn To Test Like A Grumpy Programmer - 3 hour workshopLearn To Test Like A Grumpy Programmer - 3 hour workshop
Learn To Test Like A Grumpy Programmer - 3 hour workshopchartjes
 
An Introduction To Software Development - Test Driven Development
An Introduction To Software Development - Test Driven DevelopmentAn Introduction To Software Development - Test Driven Development
An Introduction To Software Development - Test Driven DevelopmentBlue Elephant Consulting
 
Building unit tests correctly
Building unit tests correctlyBuilding unit tests correctly
Building unit tests correctlyDror Helper
 

Similar to TDD on Android (Øredev 2018) (20)

TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)
 
Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)
 
Testing without assertions - #HUSTEF2019
Testing without assertions - #HUSTEF2019Testing without assertions - #HUSTEF2019
Testing without assertions - #HUSTEF2019
 
Junit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behindJunit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behind
 
Driving application development through behavior driven development
Driving application development through behavior driven developmentDriving application development through behavior driven development
Driving application development through behavior driven development
 
Agile experiments in Machine Learning with F#
Agile experiments in Machine Learning with F#Agile experiments in Machine Learning with F#
Agile experiments in Machine Learning with F#
 
Agile Experiments in Machine Learning
Agile Experiments in Machine LearningAgile Experiments in Machine Learning
Agile Experiments in Machine Learning
 
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
 
Continuous Integration, the minimum viable product
Continuous Integration, the minimum viable productContinuous Integration, the minimum viable product
Continuous Integration, the minimum viable product
 
Test Automation without Assertions
Test Automation without AssertionsTest Automation without Assertions
Test Automation without Assertions
 
Testing Without Assertions
Testing Without AssertionsTesting Without Assertions
Testing Without Assertions
 
TDD super mondays-june-2014
TDD super mondays-june-2014TDD super mondays-june-2014
TDD super mondays-june-2014
 
Writing useful automated tests for the single page applications you build
Writing useful automated tests for the single page applications you buildWriting useful automated tests for the single page applications you build
Writing useful automated tests for the single page applications you build
 
MidwestJS Zero to Testing
MidwestJS Zero to TestingMidwestJS Zero to Testing
MidwestJS Zero to Testing
 
TDD & Effective Software Development
TDD & Effective Software DevelopmentTDD & Effective Software Development
TDD & Effective Software Development
 
Data driven devops as presented at QCon London 2018
Data driven devops as presented at QCon London 2018Data driven devops as presented at QCon London 2018
Data driven devops as presented at QCon London 2018
 
Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...
 
Learn To Test Like A Grumpy Programmer - 3 hour workshop
Learn To Test Like A Grumpy Programmer - 3 hour workshopLearn To Test Like A Grumpy Programmer - 3 hour workshop
Learn To Test Like A Grumpy Programmer - 3 hour workshop
 
An Introduction To Software Development - Test Driven Development
An Introduction To Software Development - Test Driven DevelopmentAn Introduction To Software Development - Test Driven Development
An Introduction To Software Development - Test Driven Development
 
Building unit tests correctly
Building unit tests correctlyBuilding unit tests correctly
Building unit tests correctly
 

More from Danny Preussler

We aint got no time - Droidcon Nairobi
We aint got no time - Droidcon NairobiWe aint got no time - Droidcon Nairobi
We aint got no time - Droidcon NairobiDanny Preussler
 
Demystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDemystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDanny Preussler
 
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016Danny Preussler
 
Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Danny Preussler
 
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)Danny Preussler
 
All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...Danny Preussler
 
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016Danny Preussler
 
Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)Danny Preussler
 
Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Danny Preussler
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzlesDanny Preussler
 
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Danny Preussler
 
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, BerlinAbgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, BerlinDanny Preussler
 
Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Danny Preussler
 
Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Danny Preussler
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With RobolectricDanny Preussler
 

More from Danny Preussler (15)

We aint got no time - Droidcon Nairobi
We aint got no time - Droidcon NairobiWe aint got no time - Droidcon Nairobi
We aint got no time - Droidcon Nairobi
 
Demystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDemystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and Toothpick
 
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
 
Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016
 
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
15 tips to improve your unit tests (Droidcon Berlin 2016 Barcamp)
 
All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...
 
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
 
Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)
 
Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzles
 
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
 
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, BerlinAbgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
 
Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)
 
Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With Robolectric
 

Recently uploaded

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
 
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
 
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
 
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
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdfChristopherTHyatt
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
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
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
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
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
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
 

Recently uploaded (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...
 
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
 
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
 
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
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
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
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
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...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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...
 

TDD on Android (Øredev 2018)