Android Kotlin тестировал тестирование, если действие завершается / завершается после вызова finish (), запускающего другое действие - PullRequest
1 голос
/ 28 сентября 2019

Я разрабатываю приложение для Android с использованием Kotlin.Я добавляю инструментальные тесты в моем проекте.Сейчас я борюсь с тестированием, если действие не открывается после запуска другого действия.Это мой сценарий.

У меня есть MainActivity, который запускает LoginActivity.

Это код MainActivity

class MainActivity : AppCompatActivity() {

    companion object {
        val LAUNCH_DELAY: Long = 2000
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Handler().postDelayed({
            this.startLoginActivity()
            finish() //please, pay attention here
        }, LAUNCH_DELAY)
    }

    protected fun startLoginActivity()
    {
        startActivity(Intent(this, LoginActivity::class.java))
    }
}

Как вы можете видеть в приведенном выше коде, явызов метода finish () для прекращения действия после запуска LoginActivity.Я хочу проверить, нажата ли кнопка "Назад" в процессе входа в систему, который запускается основным действием, приложение закрывается и не возвращается к основному действию.

Это мой тестовый класс

@RunWith(AndroidJUnit4::class)
class MainActivityTest {
    @Rule @JvmField
    val mainActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule<MainActivity>(MainActivity::class.java)
    @Rule @JvmField
    val loginActivityRule: ActivityTestRule<LoginActivity> = ActivityTestRule<LoginActivity>(LoginActivity::class.java)

    @Before
    fun setUp() {
    }

    @Test
    fun mainActivityHistoryIsForgottenAfterStartingLoginActivity()
    {
        Intents.init()
        Thread.sleep(MainActivity.LAUNCH_DELAY);
        Intents.release()

        pressBack()
        //here how can I assert if the main activity is not open.
    }
}

Пожалуйста, обратите внимание на комментарий в коде.Мне нравится утверждать, что основное действие не открыто или оно не возвращается к основному действию, когда при входе в систему нажимается кнопка «Назад».Как я могу проверить это?

1 Ответ

0 голосов
/ 28 сентября 2019

Поскольку вы хотите протестировать взаимодействие высокого уровня с вашим приложением, вы должны использовать UI Automator test framework .

Сначала добавьте библиотеку в build.gradle:

dependencies {
    ...
    androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
}

Затем напишите тест, подобный этому:

@RunWith(AndroidJUnit4::class)
class MainActivityTest {
    @get:Rule
    val mainActivityRule = ActivityTestRule(MainActivity::class.java)

    @Test
    fun mainActivityHistoryIsForgottenAfterStartingLoginActivity()
    {
        // mainActivityRule makes sure MainActivity is launched, so we just need to wait
        // for MainActivity to launch LoginActivity
        Thread.sleep(MainActivity.LAUNCH_DELAY)

        // Wait some more since the system is not instantaneous
        Thread.sleep(1000)

        // Now LoginActivity should be showing. Press the back button
        val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
        uiDevice.pressBack()

        // Wait some more still since the system is not instantaneous
        Thread.sleep(1000)

        // Make sure that we have left our app, i.e. pressing back have closed our app
        // BuildConfig.APPLICATION_ID is the package name of our app
        // So if the currently active package (app) is NOT our own app, it means
        // our own app was closed, which is what we want to test.
        assertNotEquals(uiDevice.currentPackageName, BuildConfig.APPLICATION_ID)
    }
}

Обратите внимание, что у вас не должно быть этого:

@Rule @JvmField
val loginActivityRule: ActivityTestRule<LoginActivity> = ActivityTestRule<LoginActivity>(LoginActivity::class.java)

, так как это запустит LoginActivity в началеконтрольная работа.Вы этого не хотите.Вы хотите, чтобы MainActivity запустил LoginActivity.Также обратите внимание, что вы можете упростить

@Rule @JvmField
val mainActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule<MainActivity>(MainActivity::class.java)

до

@get:Rule
val mainActivityRule = ActivityTestRule(MainActivity::class.java)

И вам не понадобится

@Before
fun setUp() {
}

, поскольку он пуст и ничего не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...