久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何跨多個活動測試 Android 應(yīng)用程序?

How do you test an Android application across multiple Activities?(如何跨多個活動測試 Android 應(yīng)用程序?)
本文介紹了如何跨多個活動測試 Android 應(yīng)用程序?的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

限時送ChatGPT賬號..

我們正在構(gòu)建一個復(fù)雜的 Android 應(yīng)用程序,該應(yīng)用程序由分布在許多活動中的許多屏幕和工作流組成.我們的工作流程類似于您在銀行的 ATM 機(jī)上看到的工作流程,例如,有一個 Activity 可以登錄,轉(zhuǎn)換到主菜單 Activity 可以轉(zhuǎn)換到基于用戶選擇的其他活動.

We are building a complex Android application consisting of many screens and workflows spread across many Activities. Our workflows are similar to what you might see on a Bank's ATM machine, for example, there is an Activity to login in that transitions to a main menu Activity which can transition to other activities based on the user's choices.

由于我們有如此多的工作流程,我們需要創(chuàng)建跨越多個活動的自動化測試,以便我們可以端到端地測試工作流程.例如,使用 ATM 示例,我們想輸入一個有效的 PIN,驗(yàn)證將我們發(fā)送到主菜單,選擇提取現(xiàn)金,驗(yàn)證我們是否在提取現(xiàn)金屏幕上等等,最終找到自己返回主菜單或退出".

Since we have so many workflows we need to create automated tests that span multiple activities so we can test a workflow from end to end. For example, using the ATM example, we would want to enter a valid PIN, verify that sends us to the main menu, choose withdraw cash, verify that we are on the withdraw cash screen, etc., etc., and eventually find ourselves back on the main menu or "logged" out.

我們玩弄了 Android 附帶的測試 API(例如 ActivityInstrumentationTestCase2)以及 Positron,但似乎都無法測試超出單個 Activity 的范圍,雖然我們可以在這些工具中找到一些實(shí)用程序來進(jìn)行某些單元測試,但它們不會無法滿足我們對跨越多個活動的測試場景的需求.

We've toyed with the test APIs that come with Android (e.g. ActivityInstrumentationTestCase2) and also with Positron, but neither seem capable of testing beyond the bounds of a single Activity, and while we can find some utility in these tools for some unit testing, they won't meet our needs for testing scenarios that cut across multiple Activities.

我們對 xUnit 框架、腳本、GUI 記錄器/回放等持開放態(tài)度,并希望得到任何建議.

We are open to an xUnit framework, scripting, GUI recorders/playbacks, etc. and would appreciate any advice.

推薦答案

回答我自己的懸賞問題有點(diǎn)尷尬,但這里是......

I feel a bit awkward about answering my own bounty question, but here it is...

我對此進(jìn)行了高低搜索,無法相信任何地方都沒有發(fā)布答案.我已經(jīng)非常接近了.我現(xiàn)在絕對可以運(yùn)行跨越活動的測試,但我的實(shí)現(xiàn)似乎有一些時間問題,測試并不總是可靠地通過.這是我所知道的成功跨多個活動進(jìn)行測試的唯一示例.希望我對它的提取和匿名化不會引入錯誤.這是一個簡單的測試,我在登錄活動中輸入用戶名和密碼,然后觀察在不同的歡迎"活動中顯示正確的歡迎消息:

I've searched high and low on this and can't believe there is no answer published anywhere. I have come very close. I can definitely run tests that span activities now, but my implementation seems to have some timing issues where the tests don't always pass reliably. This is the only example that I know of that tests across multiple activities successfully. Hopefully my extraction and anonymizing of it did not introduce errors. This is a simplistic test where I type a username and password into a login activity, and then observe a proper welcome message is shown on a different "welcome" activity:

package com.mycompany;

import android.app.*;
import android.content.*;
import android.test.*;
import android.test.suitebuilder.annotation.*;
import android.util.*;
import android.view.*;
import android.widget.*;

import static org.hamcrest.core.Is.*;
import static org.hamcrest.core.IsNull.*;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.*;
import static com.mycompany.R.id.*;

public class LoginTests extends InstrumentationTestCase {

   @MediumTest
   public void testAValidUserCanLogIn() {

      Instrumentation instrumentation = getInstrumentation();

      // Register we are interested in the authentication activiry...
      Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(AuthenticateActivity.class.getName(), null, false);

      // Start the authentication activity as the first activity...
      Intent intent = new Intent(Intent.ACTION_MAIN);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      intent.setClassName(instrumentation.getTargetContext(), AuthenticateActivity.class.getName());
      instrumentation.startActivitySync(intent);

      // Wait for it to start...
      Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
      assertThat(currentActivity, is(notNullValue()));

      // Type into the username field...
      View currentView = currentActivity.findViewById(username_field);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(EditText.class));
      TouchUtils.clickView(this, currentView);
      instrumentation.sendStringSync("MyUsername");

      // Type into the password field...
      currentView = currentActivity.findViewById(password_field);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(EditText.class));
      TouchUtils.clickView(this, currentView);
      instrumentation.sendStringSync("MyPassword");

      // Register we are interested in the welcome activity...
      // this has to be done before we do something that will send us to that
      // activity...
      instrumentation.removeMonitor(monitor);
      monitor = instrumentation.addMonitor(WelcomeActivity.class.getName(), null, false);

      // Click the login button...
      currentView = currentActivity.findViewById(login_button;
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(Button.class));
      TouchUtils.clickView(this, currentView);

      // Wait for the welcome page to start...
      currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
      assertThat(currentActivity, is(notNullValue()));

      // Make sure we are logged in...
      currentView = currentActivity.findViewById(welcome_message);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(TextView.class));
      assertThat(((TextView)currentView).getText().toString(), is("Welcome, MyUsername!"));
   }
}

這段代碼顯然不是很可讀.我實(shí)際上已經(jīng)將它提取到一個帶有類似英語 API 的簡單庫中,所以我可以這樣說:

This code is obviously not very readable. I have actually extracted it into a simple library with an English-like API so I can just say things like this:

type("myUsername").intoThe(username_field);
click(login_button);

我已經(jīng)對大約 4 項(xiàng)活動進(jìn)行了深度測試,并且對這種方法的工作感到滿意,盡管正如我所說,似乎偶爾會出現(xiàn)一個我還沒有完全弄清楚的時間問題.我仍然有興趣了解跨活動的任何其他測試方式.

I've tested to a depth of about 4 activities and am satisfied that the approach works though as I said, there appears to be an occasional timing issue I have not completely figured out. I am still interested in hearing of any other ways of testing across activities.

這篇關(guān)于如何跨多個活動測試 Android 應(yīng)用程序?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Cut, copy, paste in android(在android中剪切、復(fù)制、粘貼)
android EditText blends into background(android EditText 融入背景)
Change Line Color of EditText - Android(更改 EditText 的線條顏色 - Android)
EditText showing numbers with 2 decimals at all times(EditText 始終顯示帶 2 位小數(shù)的數(shù)字)
Changing where cursor starts in an expanded EditText(更改光標(biāo)在展開的 EditText 中的開始位置)
EditText, adjustPan, ScrollView issue in android(android中的EditText,adjustPan,ScrollView問題)
主站蜘蛛池模板: 日本免费一区二区三区四区 | 欧美成人免费在线视频 | 国内精品久久精品 | 欧美一级毛片免费观看 | 国产黑丝在线 | 欧美影院 | 日韩在线综合 | 最近免费日本视频在线 | 国产色网站 | 91精品国产自产在线老师啪 | 九九热在线免费观看 | 特黄色毛片| 韩日一区 | 香蕉大人久久国产成人av | 精精国产xxxx视频在线 | 97人人爱 | 成人午夜免费福利视频 | 91在线一区 | 888久久久 | 天天躁日日躁狠狠很躁 | 亚洲成人av在线播放 | 国产精品视频久久 | 亚欧午夜 | 国产精品国产精品国产专区不卡 | 亚洲一区二区久久 | 日韩免费视频一区二区 | 在线一级片 | 成人亚洲网站 | 成人精品一区二区三区中文字幕 | 国产99久久久国产精品 | 国产精品久久久久久久久久久久午夜片 | 久久久久网站 | 亚洲精品在线视频 | 国产精品黄视频 | 麻豆国产一区二区三区四区 | 日韩高清一区 | 最新中文字幕在线播放 | 亚洲精品免费在线观看 | 91精品一区 | 天天综合永久入口 | 91一区二区 |