Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intro to Android Testing

Chuck Greb
December 01, 2018

Intro to Android Testing

Originally presented at DevFest Conakry 2018 in Guinea, West Africa.

https://www.meetup.com/Meetup-GDG-Conakry/events/253639851/

In this talk we'll cover why it's important to test your app, and the different types of testing frameworks available for Android including local unit tests, instrumentation tests, and Espresso.

Chuck Greb

December 01, 2018
Tweet

More Decks by Chuck Greb

Other Decks in Technology

Transcript

  1. Intro to Android Testing
    Charles “Chuck” Greb
    @ecgreb
    DevFest Conakry
    December 1st, 2018

    View Slide

  2. View Slide

  3. View Slide

  4. • Software Engineer
    • Mobile applications since 2009
    • Mostly Android
    • Button
    About me

    View Slide

  5. Why test?

    View Slide

  6. • Verify code is correct
    • Prevent regressions
    • Documentation
    Why test?

    View Slide

  7. Testing Strategies

    View Slide

  8. • Don’t test
    • Manual
    • Automation
    Testing Strategies

    View Slide

  9. Types of Automated Tests

    View Slide

  10. • Unit
    • Integration
    • User Interface (UI)
    Types of Automated Tests

    View Slide

  11. Testing Pyramid
    https://martinfowler.com/bliki/TestPyramid.html

    View Slide

  12. Android Testing Pyramid

    View Slide

  13. View Slide

  14. View Slide

  15. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  16. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  17. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  18. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }
    }
    }

    View Slide

  19. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  20. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  21. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  22. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  23. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  24. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  25. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  26. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  27. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  28. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  29. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  30. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  31. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  32. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  33. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }_
    }+
    }+

    View Slide

  34. class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    val counter = Counter()
    counter_view.text = counter.reset().toString()
    count_button.setOnClickListener {
    counter_view.text = counter.count().toString()
    }+
    reset_button.setOnClickListener {
    counter_view.text = counter.reset().toString()
    }+
    }+
    }+

    View Slide

  35. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }+
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  36. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }+
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  37. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }+
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  38. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }+
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  39. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }+
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  40. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }+
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  41. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }_
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  42. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }_
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  43. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }_
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  44. class Counter {
    private var count = 0
    fun count(): Int {
    count++
    return count
    }+
    fun reset(): Int {
    count = 0
    return count
    }+
    }

    View Slide

  45. View Slide

  46. MainActivity

    View Slide

  47. MainActivity Counter

    View Slide

  48. MainActivity Counter

    View Slide

  49. MainActivity Counter

    View Slide

  50. MainActivity Counter
    CounterTest
    JUnit

    View Slide

  51. MainActivity Counter
    MainActivityTest CounterTest
    JUnit
    Instrumentation

    View Slide

  52. MainActivity Counter
    MainActivityTest CounterTest
    MainActivityUiTest
    JUnit
    Instrumentation
    Espresso

    View Slide

  53. Unit Tests
    JUnit

    View Slide

  54. class CounterTest {
    @Test
    fun shouldNotBeNull() {
    val counter = Counter()
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  55. class CounterTest {
    @Test
    fun shouldNotBeNull() {
    val counter = Counter()
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  56. class CounterTest {
    @Test+
    fun shouldNotBeNull() {
    val counter = Counter()+
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  57. class CounterTest {
    @Test+
    fun shouldNotBeNull() {
    val counter = Counter()+
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  58. class CounterTest {
    @Test+
    fun shouldNotBeNull() {
    val counter = Counter()+
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  59. class CounterTest {
    @Test+
    fun shouldNotBeNull() {
    val counter = Counter()+
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  60. class CounterTest {
    @Test+
    fun shouldNotBeNull() {
    val counter = Counter()+
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  61. class CounterTest {
    @Test+
    fun shouldNotBeNull() {
    val counter = Counter()+
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  62. class CounterTest {
    @Test+
    fun shouldNotBeNull() {
    val counter = Counter()+
    assertNotNull(counter)
    }+
    @Test
    fun reset_shouldReturnZero() {
    val counter = Counter()
    assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())

    View Slide

  63. assertEquals(0, counter.reset())
    }a
    @Test
    fun count_shouldIncrementNumber() {
    val counter = Counter()
    assertEquals(1, counter.count())
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  64. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  65. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  66. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  67. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  68. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  69. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  70. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  71. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  72. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  73. assertEquals(0, counter.reset())
    }a
    @Testc
    fun count_shouldIncrementNumber() {
    val counter = Counter()c
    assertEquals(1, counter.count())c
    assertEquals(2, counter.count())
    assertEquals(3, counter.count())
    }b
    @Test
    fun reset_shouldResetCounter() {
    val counter = Counter()
    counter.count()
    counter.count()
    counter.count()
    counter.reset()
    assertEquals(1, counter.count())
    }c
    }d

    View Slide

  74. View Slide

  75. Integration Tests
    Instrumentation

    View Slide

  76. @RunWith(AndroidJUnit4::class)
    class MainActivityTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)

    View Slide

  77. @RunWith(AndroidJUnit4::class)
    class MainActivityTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)

    View Slide

  78. @RunWith(AndroidJUnit4::class)
    class MainActivityTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)

    View Slide

  79. @RunWith(AndroidJUnit4::class)
    class MainActivityTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)

    View Slide

  80. @RunWith(AndroidJUnit4::class)
    class MainActivityTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)

    View Slide

  81. @RunWith(AndroidJUnit4::class)
    class MainActivityTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)

    View Slide

  82. @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }

    View Slide

  83. @Test+
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }

    View Slide

  84. @Test+
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }

    View Slide

  85. @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+

    View Slide

  86. @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+

    View Slide

  87. @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+

    View Slide

  88. @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+

    View Slide

  89. @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+

    View Slide

  90. @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+

    View Slide

  91. @Test
    fun shouldNotBeNull() {
    assertNotNull(activityTestRule.activity)
    }b
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }c
    @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+

    View Slide

  92. @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+
    @Test @UiThreadTest
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.reset_button.performClick()
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }
    }

    View Slide

  93. @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+
    @Test @UiThreadTest
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.reset_button.performClick()
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }+
    }-

    View Slide

  94. @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+
    @Test @UiThreadTest
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.reset_button.performClick()
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }+
    }--

    View Slide

  95. @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+
    @Test @UiThreadTest
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.reset_button.performClick()
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }+
    }-

    View Slide

  96. @Test @UiThreadTest+
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    activityTestRule.activity.count_button.performClick()+
    assertEquals("1", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("2", activityTestRule.activity.counter_view.text)
    activityTestRule.activity.count_button.performClick()+
    assertEquals("3", activityTestRule.activity.counter_view.text)
    }+
    @Test @UiThreadTest
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.count_button.performClick()
    activityTestRule.activity.reset_button.performClick()
    assertEquals("0", activityTestRule.activity.counter_view.text)
    }+
    }-

    View Slide

  97. View Slide

  98. UI Tests
    Espresso

    View Slide

  99. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  100. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  101. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test+
    fun counterView_shouldDisplayZeroOnCreate() {
    +onView(withId(R.id.counter_view)).check(matches(withText(“0")))
    }b
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  102. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }b
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  103. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }b
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  104. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }b
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  105. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }b
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  106. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }b
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  107. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }b
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  108. @RunWith(AndroidJUnit4::class)
    class MainActivityUiTest {
    @get:Rule
    val activityTestRule: ActivityTestRule =
    ActivityTestRule(MainActivity::class.java, false, false)
    @Before
    fun setUp() {
    activityTestRule.launchActivity(Intent())
    }a
    @Test
    fun counterView_shouldDisplayZeroOnCreate() {
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }b
    @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())

    View Slide

  109. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  110. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  111. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  112. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())a
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())b
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())c
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  113. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())a
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  114. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())a
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  115. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())a
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  116. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())a
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  117. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.count_button)).perform(click())+
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  118. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  119. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  120. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }

    View Slide

  121. @Test
    fun counterView_shouldDisplayNewCountOnCountButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("1")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("2")))
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("3")))
    }a
    @Test
    fun counterView_shouldDisplayZeroOnResetButtonClick() {
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.count_button)).perform(click())
    onView(withId(R.id.reset_button)).perform(click())
    onView(withId(R.id.counter_view)).check(matches(withText("0")))
    }a
    }p

    View Slide

  122. View Slide

  123. Demo

    View Slide

  124. Conclusion
    Testing is fun!

    View Slide

  125. • Why test?
    • Types of tests
    • Unit Tests
    • Integration Tests
    • UI Tests
    • Continuous Integration (CI)
    • Test-Driven Development (TDD)
    • Tests == Quality
    Conclusion

    View Slide

  126. Tests == Quality

    View Slide

  127. Merci
    Charles “Chuck” Greb
    @ecgreb
    DevFest Conakry
    December 1st, 2018

    View Slide

  128. usebutton.com

    View Slide