天道酬勤,学无止境

Activity never becomes requested state in UI Testing

When implement code to test UI in android using kotlin.

this is my code

I thinks it 's simple code to test but android studio prevent me due to some problem > I searched a lot for this but no result . I tried a lot of solution but no result also . Thanks .

I get this error and activity which I test doesn't start .

java.lang.AssertionError: Activity never becomes requested state "[STARTED, RESUMED, DESTROYED, CREATED]" (last lifecycle transition = "PRE_ON_CREATE")
at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:301)
at androidx.test.core.app.ActivityScenario.launchInternal(ActivityScenario.java:235)
at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:190)
at com.elgaml.myuitesting.MainActivityTest.test_isActivityinView(MainActivityTest.kt:18)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2204)

and my build.gradle is :

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.elgaml.myuitesting"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'

    def androidx_test_espresso="3.2.0"
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    androidTestImplementation "androidx.test.espresso.idling:idling-concurrent:$androidx_test_espresso"
    implementation "androidx.test.espresso:espresso-idling-resource:$androidx_test_espresso"


    // Mockk.io
    def mockk_version = "1.9.3"
    androidTestImplementation "io.mockk:mockk-android:$mockk_version"

    // androidx.test
    def androidx_test = "1.1.0"
    androidTestImplementation "androidx.test:runner:$androidx_test"
    androidTestImplementation "androidx.test:core:$androidx_test"
    androidTestImplementation "androidx.test.ext:junit-ktx:$androidx_test"

}

评论

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • AndroidX.Test ActivityScenario: java.lang.AssertionError: Activity never becomes requested state "[RESUMED]" (last lifecycle transition = "STOPPED")
    ActivityScenario is a replacement of ActivityController in Robolectric and ActivityTestRule in ATSL. When refactoring from ATSL to AndroidX Test, I am using this code to start my IndexActivity before each espresso test. @Before public void launchActivity() { ActivityScenario<IndexActivity> scenario = ActivityScenario.launch(IndexActivity.class); } However, my tests are stalling out 80-90% of the time and throwing this error. java.lang.AssertionError: Activity never becomes requested state "[RESUMED]" (last lifecycle transition = "STOPPED") When trying to troubleshoot, I changed the above to:
  • AndroidX.Test ActivityScenario:java.lang.AssertionError:Activity 永远不会变成请求状态“[RESUMED]”(最后一个生命周期转换 =“STOPPED”)(AndroidX.Test ActivityScenario: java.lang.AssertionError: Activity never becomes requested state "[RESUMED]" (last lifecycle transition = "STOPPE
    问题 ActivityScenario 替代了 Robolectric 中的 ActivityController 和 ATSL 中的 ActivityTestRule。 从 ATSL 重构到 AndroidX 测试时,我使用此代码在每次浓缩咖啡测试之前启动我的 IndexActivity。 @Before public void launchActivity() { ActivityScenario<IndexActivity> scenario = ActivityScenario.launch(IndexActivity.class); } 但是,我的测试有 80-90% 的时间会停止并抛出此错误。 java.lang.AssertionError:Activity 永远不会成为请求状态“[RESUMED]”(最后一个生命周期转换 =“STOPPED”) 在尝试进行故障排除时,我将上述内容更改为: @Before public void launchActivity() { ActivityScenario<IndexActivity> scenario = ActivityScenario.launch(IndexActivity.class); scenario.moveToState(Lifecycle.State.RESUMED); } 但是,我现在 100%
  • 在 iOS 应用程序的 UI 测试中禁用等待空闲状态(Disabling waiting for idle state in UI testing of iOS apps)
    问题 基本上问题和这个一样:XCTestCase: Wait for app to idle 我在我的视图中使用永久重复的“背景动画”。 !@#$#$&@ Xcode/iOS 的 UI 测试希望等待所有 UIView 动画结束,然后才会认为应用程序处于空闲状态并继续执行诸如点击按钮之类的操作。它只是不适合我们的方式'已经设计了应用程序。 (具体来说,我们有一个使用UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse选项设置动画的按钮,所以它永远不会停止。) 但我认为可能有某种方法可以关闭和/或缩短“等待应用程序空闲”状态。 有没有? 如何? 有没有其他办法解决这个问题? 回答1 不幸的是,使用 Apple 的 UI 测试,您无法打开“等待应用程序空闲”或轮询其他网络活动,但是您可以使用环境变量来禁用应用程序中的动画以使测试更加稳定。 在测试之前的设置方法中设置这样的环境变量。 override func setUp() { super.setUp() continueAfterFailure = false let app = XCUIApplication() app.launchEnvironment = ["UITEST_DISABLE_ANIMATIONS" : "YES"] app.launch()
  • understanding onTrimMemory( int level )
    I recently read this article on Managing Your App's Memory,I strongly suggest to read it if you are an AndroidDev and never did. There are lots of good practices and one thing I never happen to know about is the onTrimMemory(int level) method called by the system on every Activity/Fragment to notify events on which memory should or could be released. Here is a quote from that article: Notice that your app receives the onTrimMemory() callback with TRIM_MEMORY_UI_HIDDEN only when all the UI components of your app process become hidden from the user. This is distinct from the onStop() callback
  • 一个即将消失的职位?这或许是身为软件测试工程师的你需要明白的。
    软件测试岗未来是否会消失?这是一个问题,因为它决定了软件测试人员这个群体未来会走向哪里?作为测试群体的一分子,笔者认真梳理了这个问题并得出个人观点,供各位测试同仁参考。 一、软件测试的由来 1936年,英国数学家阿兰·麦席森·图灵提出一种抽象计算模型:图灵机。科学家将带点的卡片纸传递给图灵机,图灵机通过计算给出计算结果。这一时期的软件多以计算为主,规模小复杂度低,尚未出现专职测试员。 1957年,美国科学家约翰·巴科斯开发出第一套高级编程语言Fortran,Frotran被广泛应用在科学计算领域,这时的Frotran程序有主程序和子程序的概念。同时由于摆脱了卡片纸的约束,程序的代码规模呈现出几何级的增长。如何证明程序是正确的、完备的,就成了一个无法回避的问题,测试活动由此而诞生。软件测试不同于调试,软件测试旨在发现软件的缺陷,其目的是要鉴定软件的正确性、完备性。 这么看来,软件测试活动存在的原因是因为程序代码规模的增加和复杂度的提高。看似合理实际不然!笔者大学期间曾参与开发了一套学院选课系统,该系统前台有二十多个功能,后台有十几张数据库表。这套选课系统与早期的Frotran程序相比,代码规模和程序复杂度都高出很多。但是,我们却并没有软件测试活动这个环节。原因很简单,因为这个程序没有真实客户,学生算真实客户吗?答案是不算,如果学生A使用选课系统出现异常,我们会告诉A你的操作有问题
  • Instrumental Testing with FragmentScenario
    I'm trying to use the new FragmentScenario APIs of the androidx testing libraries for local testing and instrumentation testing(androidTest). The api works fine in local environment but in instrumental testing, it gives error: java.lang.AssertionError: Activity never becomes requested state "[RESUMED, DESTROYED]" (last lifecycle transition = "PRE_ON_CREATE")" Help me in instumental testing(androidTest) Please check complete error detail: java.lang.AssertionError: Activity never becomes requested state "[RESUMED, DESTROYED]" (last lifecycle transition = "PRE_ON_CREATE") at androidx.test.core
  • 什么时候使用和不使用android Application 类?(When to use and not to use the android Application class?)
    问题 我正在考虑使用 android Application 类作为存储应用程序中其他(片段)活动共享的临时状态和公共代码的地方。 我想获得更多关于它是否适合以下方面的反馈: 共享常量,如 ID、首选项名称等。 全局变量(即 setter/getter)反映当前 UI 状态、导航、选定片段,以及通常不需要持久化的临时数据。 当某些条件被触发时用于持久化数据的钩子。 在首选项更改后更新 UI。 提供一种从应用程序中的任何位置访问上下文的简单方法,包括getApplication()不可用的代码,例如通过静态 getter,如MyApp.getApp() 。 需要全局状态变量可见性的常见方法,并且会变得太麻烦而无法移到专用类中。 在活动课上还有什么是合适/有用/方便的? 什么不是一个好主意,什么是最好的选择? 最后,您发现应用程序最适合在您的应用程序中使用什么? 回答1 共享常量,如 ID、首选项名称等。 我通常为此创建一个名为 C 的常量文件,因为它的可读性更好。 C.SHARED_PREFS更容易理解Application.SHARED_PREFS恕我直言。 全局变量(即 setter/getter)反映当前 UI 状态、导航、选定片段,以及通常不需要持久化的临时数据。 这在它所关注的 Activity 或组件中会更好(例如,Activity 的 UI 状态可能应该存储在
  • 其实我一直不明白软件测试是做什么事的/
    好久没登过CSDN了,刚刚立秋下了一场很大的雨,时光荏苒,岁月蹉跎,还是写点文章。希望能对看到这篇文章的朋友们有所帮助,尤其是转行的和还在从事“点点点”的朋友们。 今天在知乎上看到一个问题:其实我一直不明白软件测试是做什么事的? 软件测试工程师的工作内容 软件测试工程师薪资高待遇好,人员需求增加快而广受关注,未来的发展前景受到肯定。吸引了众多的人加入这个行业,那么,软件测试到底是做什么的,想要成为软件工程师,你就必须先清楚它的职责内容。 1.测试和发现软件中存在的软件缺陷 使用各种测试技术和方法来测试和发现软件中存在的软件缺陷。测试技术主要分为黑盒测试和白盒测试两大类。其中黑盒测试技术主要有等价类划分法、边界值法、因果图法、状态图法、测试大纲法以及各类典型的软件故障模型等;白盒测试的主要技术有语句覆盖、分支覆盖、判定覆盖、基本路径覆盖等; 2. 测试工作需要贯穿整个软件开发生命周期 完整的软件测试工作包括单元测试、集成测试、确认测试和系统测试工作。单元测试工作主要在编码阶段完成,由开发人员和软件测试工程师共同完成,其主要依据是详细测试。 确认测试和系统测试是在软件开发完成后,验证软件的功能与需求的一致性、验证软件在相应的硬件条件下的系统功能是否满足用户需求,其主要依据是用户需求。 3. 缺陷报告编写及提交 测试人员将发现的缺陷编写成正式的缺陷报告,提交给开发人员进行缺陷的确认和修复
  • 了解onTrimMemory(int level)(understanding onTrimMemory( int level ))
    问题 我最近阅读了有关管理应用程序内存的文章,强烈建议您阅读,如果您是AndroidDev且从未使用过。 有很多好的做法,我从来没有碰过的一件事是系统在每个Activity / Fragment上调用onTrimMemory(int level)方法来通知应该或应该释放内存的事件。 这是该文章的引文: 请注意,只有当应用程序进程的所有UI组件都向用户隐藏时,您的应用程序才会使用TRIM_MEMORY_UI_HIDDEN接收onTrimMemory()回调。 这与onStop()回调不同,该onStop()回调在Activity实例变为隐藏时被调用,即使用户移动到应用程序中的另一个Activity也会发生。 因此,尽管您应该实现onStop()来释放活动资源(例如网络连接)或注销广播接收器,但是通常不应该释放UI资源,直到收到onTrimMemory(TRIM_MEMORY_UI_HIDDEN)为止。 这样可以确保,如果用户从应用程序中的另一个活动导航回来,则您的UI资源仍然可用于快速恢复活动。 我真的很想在我的应用程序中实现良好的内存管理,因此我期待以正确的方式实现onTrimMemory()。 我对此只有几个问题: 在onStop()之后立即调用onTrimMemory(TRIM_MEMORY_UI_HIDDEN)吗? 在这种情况下,“释放UI资源”是什么意思?
  • Android App 开发新尝试:模拟服务器数据接口 - MockApi
    现在搞开发,很多人都是搞的体力活儿,恰恰丢失了真正的“开发精神”。什么是“开发精神”?是探索,是向前求知。今天想和大家分享的是前辈的 Android App 开发新尝试。 原文地址:https://www.cnblogs.com/everhad/p/6219795.html 为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块。本篇文章就尝试为使用gradle的android项目设计实现MockApi。 需求概述 在app开发过程中,在和服务器人员协作时,一般会第一时间确定数据接口的请求参数和返回数据格式,然后服务器人员会尽快提供给客户端可调试的假数据接口。不过有时候就算是假数据接口也来不及提供,或者是接口数据格式来回变动——很可能是客户端展示的原因,这个是产品设计决定的,总之带来的问题就算服务器端的开发进度会影响客户端。 所以,如果可以在客户端的正常项目代码中,自然地(不影响最终apk)添加一种模拟服务器数据返回的功能,这样就可以很方便的在不依赖服务器的情况下展开客户端的开发。而且考虑一种情况,为了测试不同网络速度,网络异常以及服务器错误等各种“可能的真实数据请求的场景”对客户端UI交互的影响,我们往往需要做很多手动测试——千篇一律!如果本地有一种控制这种服务器响应行为的能力那真是太好了。
  • Web Worker 被 Chrome 中的主线程阻止(Web Worker blocked by main thread in Chrome)
    问题 我有一个网络工作者。 我希望用它定期发出网络请求。 我特别想要的一件事是即使主 JS 执行线程被阻塞(例如,被 window.alert 阻塞)也能发出这些请求。 我正在使用 Chrome 38。 但是,当我尝试在工作程序中发出网络请求时,这些请求似乎被 UI 线程阻止了。 这是一个人为的例子来说明这个问题: 基础.js: var worker = new Worker("/worker.js"); setTimeout(function() { console.log("begin blocking"); var startDt = new Date(); var blockPeriod = 5000; var a; // Obviously we'd never actually do this, but this while loop // is a convenient way to create the problem case (a blocked main // thread). while ((new Date() - startDt) < blockPeriod) { a = 0; } console.log("stop blocking"); }, 3000); 工人.js: var requestInterval = 1000; var
  • 一旦我的应用程序进程被终止,我的活动状态是什么?(What is holding my activity's state once my application process has been killed?)
    问题 我一直在通过运行一个强制终止我的应用程序的内存占用应用程序来测试我的程序的行为。 在阅读了关于 onSaveInstanceState 包在哪里保存?的答案后,我对我看到的一些结果感到困惑。 该链接中给出的两个答案都暗示,当需要回收内存时,会销毁单个活动,而不是应用程序。 但是根据 http://developer.android.com/guide/components/processes-and-threads.html,进程 - 而不是单个活动 - 被杀死。 而且由于所有组件通常都在同一个进程中运行,我希望整个应用程序在内存不足的情况下被杀死。 我的测试与 Android 文档一致,因为当我运行我的内存消耗应用程序时,我不再看到进程正在运行。 因此,如果整个过程都被终止了,那么我假设该问题中给出的答案不正确是否正确? 但是如果是这样,如果进程被终止,当我恢复我的应用程序时,我的 Bundle 是什么? 真的保证永远不会写入磁盘吗? 回答1 该链接中给出的两个答案都暗示,当需要回收内存时,会销毁单个活动,而不是应用程序。 这是不正确的,尽管我自己在这一点上困惑了很长时间。 恕我直言,该问题的三个答案中最多有一个“意味着当需要回收内存时,单个活动而不是应用程序将被销毁”。 但是如果是这样,如果进程被终止,当我恢复我的应用程序时,我的 Bundle 是什么? 有时
  • 解放双手 - Android 开发应该尝试的 UI 自动化测试
    解放双手 - Android 开发应该尝试的 UI 自动化测试 困境 接下来我将说到这种情况并非个例——作为一个Android开发者,当我实现了一个界面的一些功能,或者对界面上某些功能进行了修改,我该如何去查收我想要的结果呢? 最简单的方式就是直接编译运行App,通过自己的操作对界面进行交互,从个人的视觉效果上进行功能的检查,比如我实现了一个RecyclerView,我就打开界面,看看这个列表是否正确显示在了界面上。 不久之后,我觉得某些地方代码不是很好,于是我改了一些代码,我怕会出现问题,于是为了保证项目能够不出问题(至少是避免低级的错误),我选择再次编译运行,验收结果。 再深入一点,如果每个版本发布前都需要这么多次测试,或者每当我们简单修改了一下代码,就需要更多次重复进行以上步骤,并检测结果,来来往往,反反复复,实在令人乏味。 也许, UI自动化测试是一劳永逸解决这个问题的方案之一。 UI自动化测试简介 充满热情,一腔热血,说学就学,我行我上。 相信我,不要这样,这和学习库或者框架不一样,UI自动化测试是一个专业技能。不信的话,请参考一下各大机构对于测试工程师的培训周期,系统性走一遍全日制要几个月,闲暇时间学习?学不完的,而且,没必要。 以Android官方文档的概述,AndroidStudio提供了几种UI测试工具供开发者使用。 事实上UI的自动化测试工具很多
  • Android开发10年,小公司报了薪资没下文,要个20K就这么难么?
    最近求职情况 这是一位网友分享的Android开发找工作的动态。从2月初到到3月底,主要在两个平台找工作,一个是拉勾,一个是BOSS直聘。对比两个平台,拉勾简直是天坑,不仅仅是没有面试机会,连沟通机会都没有,这让他感觉有点奇怪。就算行情再差也不至于连沟通机会都没有。而BOSS直聘就好了不少。常常有公司主动来联系自己,自己投的简历通常也会有HR们回复,所以也得到了不少面试机会。从九月初到十月中旬这段时间,大概面试了差不多几十家。通常都是2轮技术面加一轮HR面。 很多Android开发朋友经常会被找工作困惑,觉得Android开发找工作难,内卷严重。 现在的终端开发已经开始进入稳定期,在这个阶段大厂压力很大小厂更会收到挤压,人们使用的App越来越固定,即使是大厂,几年前平台级应用发个Push就能引流几十万,现在这些的作用也越来越小,特别到了今年,想要在Top 100的App里突然出现一个来自不知名团队的爆款已经基本不可能。在这种情况下对于开发者来说带来的变化我认为主要有两点: 1. 开发者的门槛越来越高: 小厂的机会少了,大厂的业务趋于稳定,短期内在移动端不会出现爆发性的增长,那随之而来的就是移动端招人越来越理性,门槛水涨船高。这两年看部门移动端校招,除了技术本身都很扎实以外,清一色985/211学霸+竞赛成绩+各种奖项+NB实习经历,社招基本集中在国内主要的互联网公司和几大手机公司中
  • Activity的4种启动模式整理笔记
    Activity 的4种启动模式整理笔记 在介绍Activity的启动模式之前,我们先理解一下任务栈,所谓任务栈,就是桌面应用启动时,系统会为应用分配一个Activity栈(Task),用来存放Activity实例,首先他也是一个栈,所以有栈的特性先进后出,其主要有两个操作,压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈的操作更改Activity的顺序。 在当前 Activity 启动另一个 Activity 时,新的 Activity 将被推送到任务栈顶部并获得焦点。上一个 Activity 仍保留在任务栈中,但会停止。当 Activity 停止时,系统会保留其界面的当前状态。当用户按返回按钮时,当前 Activity 会从任务栈顶部移除(该 Activity 销毁),上一个 Activity 会恢复(界面会恢复到上一个状态)。任务栈中的 Activity 永远不会重新排列,只会被送入和移除,在当前 Activity 启动时被送入任务栈,在用户使用返回按钮离开时从任务栈中移除。因此,返回任务栈按照“后进先出”的特性运作。 正常情况下,当一个Activity启动了另一个Activity的时候,新启动的Activity就会置于任务栈的顶端,并处于活动状态,而启动它的Activity虽然成功身退,但依然保留在任务栈中,处于停止状态
  • 一文带你走近软件测试(测试-定义、类型、方法?)
    为什么我们需要软件测试? 可能有些人会有这样的疑问:“为什么我们需要软件测试”或者“为什么需要测试”或者“为什么需要软件测试”。 软件测试的目的: 1、发现被测对象与用户需求之间的差异,即缺陷。 2、通过测试活动发现并解决缺陷,增加人们对软件质量的信心。 3、通过测试活动了解被测对象的质量状况,为决策提供数据依据。 4、通过测试活动积累经验,预防缺陷出现,降低产品失败风险。 当我进入测试行业的时候,我不知道什么是软件测试以及为什么需要它。我也不知道从哪里开始。也许你的处境和我很久以前一样。就我而言,软件测试是一门艺术,它评估软件应用程序的功能,目的是发现开发的软件是否满足指定的要求,并确定缺陷,以确保产品无缺陷(理想状态),从而生产出高质量的产品。 假设如果在软件开发过程中没有软件测试呢? 按照目前的趋势,由于数字化的不断变化和发展,我们的生活在各个方面都在改善。我们的工作方式也改变了。我们在网上访问我们的银行,在网上购物,在网上订购食物等等。我们依赖软件和系统。如果这些系统出现故障怎么办。我们都知道,从财务损失和商誉的角度来看,一个小漏洞对企业的影响是巨大的。为了交付高质量的产品,我们需要在软件开发过程中进行软件测试。 软件测试之所以成为信息技术领域非常重要和不可或缺的一部分,原因如下。 成本效益 事实上,对于任何复杂的系统,设计缺陷永远不能完全排除。这并不是因为开发人员粗心大意
  • Android:使用 Admob 的 Consent SDK 获取用户的位置(Android: Getting user's location using Admob's Consent SDK)
    问题 我对 AdMob 的新“同意 SDK”有疑问; 集成指南说要将以下内容放入onCreate ... public class MainActivity extends Activity { ... @Override protected void onCreate(Bundle savedInstanceState) { ... ConsentInformation consentInformation = ConsentInformation.getInstance(context); String[] publisherIds = {"pub-xxxxxxxxxxxxxxxx"}; consentInformation.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() { @Override public void onConsentInfoUpdated(ConsentStatus consentStatus) { // User's consent status successfully updated. } @Override public void onFailedToUpdateConsentInfo(String errorDescription) { // User
  • 在Android M的运行时权限中,我们如何区分永不停止和永不停止?(How Do We Distinguish Never-Asked From Stop-Asking in Android M's Runtime Permissions?)
    问题 根据Google的说法,当涉及到M Developer Preview运行时权限时: 如果您以前从未请求过特定许可,则只需请求如果您之前询问过,并且用户说“否”,然后用户尝试执行需要被拒绝的权限的操作,则在再次请求该权限之前,应提示用户解释为什么需要该权限。 如果您之前几次询问,并且用户说“不,并停止询问”(通过运行时权限对话框上的复选框),则您应该停止打扰(例如,禁用需要该权限的UI) 但是,我们只有一个方法shouldShowRequestPermissionRationale() ,它返回一个boolean ,并且我们具有三种状态。 我们需要一种将永​​不请求状态与永不请求状态区分开的方法,因为我们从shouldShowRequestPermissionRationale()得到的都是false 。 对于在首次运行该应用程序时要求的权限,这不是一个大问题。 有很多方法可以确定这可能是您应用程序的首次运行(例如, SharedPreferences boolean值),因此您假设如果这是您应用程序的首次运行,则您处于永不询问的状态。 但是,运行时权限的愿景的一部分是,您可能不需要事先提出所有要求。 与边缘功能相关联的权限只有在用户点按需要该权限的内容时,才可能在以后请求。 在这里,该应用程序可能已经运行了好几个月,已经运行了好几个月了,然后才突然需要另一个权限。
  • When do intent extras become null between activities?
    I'm having problems receiving intent extras between activities. In my MainActivity I start a Gallery activity to chose video files on external SD card: public class MainMenu extends Activity { //Button change video Button video_change; //Extra for changing video content Bundle extras; //Intent for Gallery view activity Intent intent; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); //... intent = new Intent(getApplicationContext(),GalleryView.class); video_change.setOnClickListener(new View.OnClickListener() { @Override public void
  • 如何使用Espresso空闲资源进行网络通话(How to use Espresso Idling Resource for network calls)
    问题 我正在尝试使用Espresso来测试我的UI。 当我登录到我的应用程序时,我将调用Parse API(网络调用)以验证用户名和密码。 如果一切顺利,用户将被带到一个新的活动。 我想测试一下,但是我似乎无法使用空闲资源。 代码: public class ApplicationTest extends ActivityInstrumentationTestCase2<LoginActivity> { private CountingIdlingResource fooServerIdlingResource; public ApplicationTest() { super(LoginActivity.class); } @Before public void setUp() throws Exception { super.setUp(); injectInstrumentation(InstrumentationRegistry.getInstrumentation()); getActivity(); CountingIdlingResource countingResource = new CountingIdlingResource("FooServerCalls"); this.fooServerIdlingResource = countingResource