Skip to content

Тестирование интернет-соединения и работа с классом Device

В этом уроке мы создадим тест, который проверяет работу экрана Internet Availability (WifiActivity)

Запускаем наше приложение tutorial и кликаем по кнопке Internet Availability.

Button Internet Availability

Ручное тестирование

Давайте сначала протестируем этот экран руками.

Изначально у нас есть кнопка CHECK WIFI STATUS, больше никакого текста на экране нет. На текущий момент Wifi на устройстве включен.

Launch Wifi Test Activity

Launch Wifi Test Activity

Кликаем на кнопку.

Wifi enabled

Эта кнопка кликабельна, после клика отображается корректный статус состояния Wifi - enabled. Отключаем Wifi.

Turn-off wifi

Кликаем на кнопку снова и проверяем статус Wifi сейчас:

Wifi disabled

Состояние определяется корректно. Последняя проверка - давайте перевернем устройство и убедимся, что текст на экране сохраняется.

Wifi disabled landscape

Текст сохраняется успешно, все тесты пройдены. Теперь нам необходимо добиться такого результата, чтобы все те же проверки выполнялись в автоматическом режиме.

Написание автотестов

Сейчас во время теста нужно будет автоматически включать и выключать интернет, а также менять ориентацию устройства на альбомную. Это выходит за рамки ответственности нашего приложения, а значит, для тестов нам придется использовать adb-команды. Для этого необходимо, чтобы был запущен ADB-сервер. Мы разбирали этот момент в предыдущем уроке. Если вдруг забыли, как это делается, пересмотрите его.

Сейчас в нашем тесте нужно будет на главном экране кликнуть по кнопке Internet Availability. А значит, необходимо доработать Page Object главного экрана, добавив туда еще одну кнопку:

package com.kaspersky.kaspresso.tutorial.screen

import com.kaspersky.kaspresso.screens.KScreen
import com.kaspersky.kaspresso.tutorial.R
import io.github.kakaocup.kakao.text.KButton

object MainScreen : KScreen<MainScreen>() {

    override val layoutId: Int? = null
    override val viewClass: Class<*>? = null

    val simpleActivityButton = KButton { withId(R.id.simple_activity_btn) }
    val wifiActivityButton = KButton { withId(R.id.wifi_activity_btn) }
}

Теперь можем добавлять новый тестовый класс. В том же пакете, где у нас лежат другие тесты, мы добавляем WifiSampleTest.

package com.kaspersky.kaspresso.tutorial

import com.kaspersky.kaspresso.testcases.api.testcase.TestCase

class WifiSampleTest: TestCase() {

}

Для проверки экрана с доступностью Internet на него нужно перейти. Для этого мы проделаем такие же шаги, как в уроке, в котором писали наш первый автотест:

  1. Добавим activityRule, чтобы при запуске теста у нас открывалась MainActivity
  2. Проверим, что кнопка для перехода на экран провеки Internet видима и кликабельна
  3. Кликнем по кнопке "Internet Availability"
package com.kaspersky.kaspresso.tutorial

import androidx.test.ext.junit.rules.activityScenarioRule
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import com.kaspersky.kaspresso.tutorial.screen.MainScreen
import org.junit.Rule
import org.junit.Test

class WifiSampleTest : TestCase() {

    @get:Rule
    val activityRule = activityScenarioRule<MainActivity>()

    @Test
    fun test() {
        MainScreen {
            wifiActivityButton {
                isVisible()
                isClickable()
                click()
            }
        }
    }
}

Запускаем. Тест пройден успешно и экран проверки Wifi запускается. Теперь можем тестировать его.

Для полноценного тестирования этого экрана нам понадобится менять состояние подключения к Wifi, а также менять ориентацию устройства. Для этого в классе BaseTestCase (от которого унаследован наш класс WifiSampleTest) есть экземпляр класса Device, который так и называется device. Мы уже сталкивались с ним в предыдущем уроке, когда получали packageName нашего приложения.

У этого объекта есть множество полезных методов, подробно про которые вы можете почитать тут.

Первым делом нас интересует метод, который включает/отключает интернет. За работу с сетью отвечает объект network, который есть в классе Device.

Если мы хотим изменить состояние Wifi, то можем это сделать следующим образом:

/**
* В качестве параметра передаем тип boolean, false если хотим выключить Wifi, true - если хотим включить
*/
device.network.toggleWiFi(false)

Кроме Wifi мы можем также управлять мобильной сетью, а также интернет-подключением на устройстве в целом (Wifi + мобильная сеть). Для того чтобы посмотреть все доступные методы, можно перейти в документацию, указанную выше, но есть способ проще - после названия объекта поставить точку и посмотреть, какие методы можно вызвать у этого объекта. По их названию обычно понятно, что они делают.

Available methods

Давайте напишем тест, который выполнит все необходимые проверки, кроме переворота устройства - переворотом мы займемся чуть позже. Первым делом нужно создать Page Object экрана проверки интернет-подключения WifiScreen. Добавляем его в пакете com.kaspersky.kaspresso.tutorial.screen.

package com.kaspersky.kaspresso.tutorial.screen

import com.kaspersky.kaspresso.screens.KScreen
import com.kaspersky.kaspresso.tutorial.R
import io.github.kakaocup.kakao.text.KButton
import io.github.kakaocup.kakao.text.KTextView

object WifiScreen : KScreen<WifiScreen>() {

    override val layoutId: Int? = null
    override val viewClass: Class<*>? = null

    val checkWifiButton = KButton { withId(R.id.check_wifi_btn) }
    val wifiStatus = KTextView { withId(R.id.wifi_status) }
}

Теперь добавляем шаги:

  1. Проверяем, что кнопка видима и кликабельна
  2. Проверяем, что заголовок не содержит текст
  3. Кликаем по кнопке
  4. Проверяем, что текст в заголовке стал "enabled"
  5. Отключаем Wifi
  6. Кликаем по кнопке
  7. Проверяем, что текст в заголовке стал "disabled"
package com.kaspersky.kaspresso.tutorial

import androidx.test.ext.junit.rules.activityScenarioRule
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import com.kaspersky.kaspresso.tutorial.screen.MainScreen
import com.kaspersky.kaspresso.tutorial.screen.WifiScreen
import org.junit.Rule
import org.junit.Test

class WifiSampleTest : TestCase() {

    @get:Rule
    val activityRule = activityScenarioRule<MainActivity>()

    @Test
    fun test() {
        MainScreen {
            wifiActivityButton {
                isVisible()
                isClickable()
                click()
            }
        }
        WifiScreen {
            checkWifiButton.isVisible()
            checkWifiButton.isClickable()
            wifiStatus.hasEmptyText()
            device.network.toggleWiFi(true)
            checkWifiButton.click()
            wifiStatus.hasText("enabled")
            device.network.toggleWiFi(false)
            checkWifiButton.click()
            wifiStatus.hasText("disabled")
        }
    }
}

Вспоминаем, что использовать захардкоженные строки не стоит, лучше вместо них использовать строковые ресурсы.

package com.kaspersky.kaspresso.tutorial

import androidx.test.ext.junit.rules.activityScenarioRule
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import com.kaspersky.kaspresso.tutorial.screen.MainScreen
import com.kaspersky.kaspresso.tutorial.screen.WifiScreen
import org.junit.Rule
import org.junit.Test

class WifiSampleTest : TestCase() {

    @get:Rule
    val activityRule = activityScenarioRule<MainActivity>()

    @Test
    fun test() {
        MainScreen {
            wifiActivityButton {
                isVisible()
                isClickable()
                click()
            }
        }
        WifiScreen {
            checkWifiButton.isVisible()
            checkWifiButton.isClickable()
            wifiStatus.hasEmptyText()
            checkWifiButton.click()
            wifiStatus.hasText(R.string.enabled_status)
            device.network.toggleWiFi(false)
            checkWifiButton.click()
            wifiStatus.hasText(R.string.disabled_status)
        }
    }
}

Info

Не забывайте перед запуском теста включить Wifi на устройстве, т.к. после каждого запуска он у вас будет выключен и при втором прогоне тест не пройдет.

Теперь нам нужно научиться переворачивать устройство, чтобы выполнить остальные проверки. За переворот устройства отвечает объект exploit из класса Device, про который вы также можете подробнее почитать в документации

Весь процесс теста теперь будет выглядеть следующим образом:

  1. Устанавливаем на устройстве книжную ориентацию
  2. Проверяем, что кнопка видима и кликабельна
  3. Проверяем, что заголовок не содержит текст
  4. Кликаем по кнопке
  5. Проверяем, что текст в заголовке стал "enabled"
  6. Отключаем Wifi
  7. Кликаем по кнопке
  8. Проверяем, что текст в заголовке стал "disabled"
  9. Переворачиваем устройство
  10. Проверяем, что текст в заголовке сохранился "disabled"

package com.kaspersky.kaspresso.tutorial

import androidx.test.ext.junit.rules.activityScenarioRule
import com.kaspersky.kaspresso.device.exploit.Exploit
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import com.kaspersky.kaspresso.tutorial.screen.MainScreen
import com.kaspersky.kaspresso.tutorial.screen.WifiScreen
import org.junit.Rule
import org.junit.Test

class WifiSampleTest : TestCase() {

    @get:Rule
    val activityRule = activityScenarioRule<MainActivity>()

    @Test
    fun test() {
        MainScreen {
            wifiActivityButton {
                isVisible()
                isClickable()
                click()
            }
        }
        WifiScreen {
            device.exploit.setOrientation(Exploit.DeviceOrientation.Portrait)
            checkWifiButton.isVisible()
            checkWifiButton.isClickable()
            wifiStatus.hasEmptyText()
            checkWifiButton.click()
            wifiStatus.hasText(R.string.enabled_status)
            device.network.toggleWiFi(false)
            checkWifiButton.click()
            wifiStatus.hasText(R.string.disabled_status)
            device.exploit.rotate()
            wifiStatus.hasText(R.string.disabled_status)
        }
    }
}
Запускаем. Тест пройден успешно.

Итог

Итак, в этом уроке мы попрактиковались с объектом device, научились менять статус интернет-соединения и ориентацию экрана из тестового класса. При этом тест запускается, все проверки завершаются успешно, но в нашем коде есть несколько серьезных проблем:

  • Тест не разбит на шаги. В итоге мы имеем большое полотно кода, в котором достаточно сложно разобраться
  • Тест выполняется успешно только в том случае, если мы предварительно включили интернет на устройстве. При этом, при каждом следующем запуске тест будет падать из-за того, что внутри него Wifi отключается

В следующих уроках мы узнаем, как можно улучшить этот код и решить возникшие проблемы.