标签: android-testing

Activity 类只能在开发/调试期间启动吗?

我面临的一个常见情况是,我希望View在将自定义项目作为大型应用程序的一部分进行开发时,在屏幕上以可见方式对其进行测试。我意识到单元测试的存在,特别是使用ActivityUnitTestCase,但据我了解,这些框架实际上并没有在屏幕上可见地附加组件。

目前,我倾向于这样做的方法是将组件放置在应用程序中实际使用的任何位置。这通常意味着需要等待一段时间应用程序启动或在应用程序可见之前浏览应用程序的某些部分,这可能会变得很麻烦。

我发现的更好的方法是在应用程序中创建一个Activity纯粹出于测试目的而存在的应用程序(例如,仅显示我正在开发的自定义View),启动该应用程序以显示我正在处理的自定义View(或其他内容)。为此,我Activity在清单中分配给该过滤器的唯一意图过滤器是android.intent.action.MAIN,而不是 android.intent.category.LAUNCHER。然后,我可以简单地在 Android Studio 中创建一个运行/调试配置来Activity直接启动它。据我认为,这实际上允许我拥有Activity只能由我从 IDE 启动的类。

我的问题是:

  1. 省略是否可以android.intent.category.LAUNCHER保证应用程序的用户无法Activity以任何方式启动该应用程序,也无法意识到它的存在?这是一个安全的地方吗Activity只开设用于发展的课程

  2. 是否有任何类型的工作流程或测试框架可以用来改进我的做法?

android android-view android-activity android-testing

3
推荐指数
1
解决办法
613
查看次数

如何使用屏幕上的位置(边界)在 UiAutomator 中查找对象

我想使用 device.findObject() 在屏幕中查找对象,这需要 UiSelector。到目前为止,一切都很好。

问题是我有几个项目只能通过它们在屏幕上的位置来区分,例如,在消息传递应用程序中,所有头像都具有相同的属性,除了它们在屏幕中的位置之外。

我该如何指定这一点?

我想到:

  • 在找到对象后检查属性并在没有此属性的情况下再次进行搜索,但我也找不到任何从搜索中消除对象的方法。
  • 使用 UiCollection 获取所有可能的元素,然后一一检查哪个是正确的。问题:我无法在 UiCollection 中使用 foreach,要查找元素,我只能使用 UiSelector,它与以前有相同的问题。

您有什么建议/解决方案吗?

谢谢。

android bounds uidevice android-testing android-uiautomator

3
推荐指数
1
解决办法
5751
查看次数

AndroidJUnit4 测试未找到

我像这样注释了我的课程

\n\n
@RunWith(AndroidJUnit4.class)\npublic class WorkdayProviderTest\n
Run Code Online (Sandbox Code Playgroud)\n\n

此外,还注释了我的测试方法

\n\n
@Test\npublic void insert_dataInsertsCorrectly()\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,像这样配置我的 build.gradle defaultConfig 和依赖项

\n\n
defaultConfig {\n    applicationId \'com.jueggs.workinghours\'\n    minSdkVersion 16\n    targetSdkVersion 23\n    versionCode 1\n    versionName "1.0"\n\n    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"\n}\n\nandroidTestCompile "junit:junit:4.12"\nandroidTestCompile "com.android.support:support-annotations:23.3.0"\nandroidTestCompile "com.android.support.test:runner:0.4.1"\nandroidTestCompile "com.android.support.test:rules:0.4.1"\nandroidTestCompile "com.android.support.test.espresso:espresso-core:2.2.1"\nandroidTestCompile "com.android.support.test.espresso:espresso-contrib:2.2.1"\nandroidTestCompile "org.hamcrest:hamcrest-library:1.3"\n
Run Code Online (Sandbox Code Playgroud)\n\n

并像这样配置测试运行

\n\n

在此输入图像描述

\n\n

它\xc2\xb4s告诉我

\n\n
No tests were found\n\nTest running failed: Instrumentation run failed due to \'java.lang.ClassNotFoundException\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何解决这个问题?

\n

android android-testing android-junit

3
推荐指数
1
解决办法
2万
查看次数

如何使用connectedAndroidTest命令仅运行测试套件

我在 Circle ci 中运行 UI 测试时遇到超时问题,因为命令connectedAndroidTest 的运行时间超过 10 分钟。

所以我试图将它们分成测试套件并一次运行每个套件。

我在这里找到了如何为我的 android 测试创建套件:https://developer.android.com/reference/junit/framework/TestSuite.html

但我找不到如何使用connectedAndroidTest 命令运行它们。

android android-testing circleci android-espresso

3
推荐指数
1
解决办法
1515
查看次数

UiAutomator - UiDevice 无法通过选择器找到对象(包名称和资源 ID)

我无法UiObject2在 androidTest 中使用 UiAutomator 找到元素 ( )。我获得了 UiDevice 实例并尝试使用以下命令查找对象:

MY_UI_DEVICE.findObject(By.res(CURRENT_PACKAGE, id));
Run Code Online (Sandbox Code Playgroud)

CURRENT_PACKAGE是我的应用程序的包MY_UI_DEVICE.getCurrentPackageName()。我也尝试过这个:

MY_UI_DEVICE.wait(Until.findObject(By.res(CURRENT_PACKAGE, id)), 10000);
Run Code Online (Sandbox Code Playgroud)

我可以看到应用程序在右侧屏幕上等待 10 秒(所需的对象仍然存在),但超时后它无法找到它并且测试失败。它在模拟器 (API 23) 上总是失败,但在真实设备 (API 25) 上很少能正常工作。

当我调试代码时,我可以看到,我可以通过手动调用getChild(index)方法序列来获取正确的元素AccessibilityNodeInfo,但在运行时,即使应用程序在我期望的特定元素的正确屏幕上等待,它仍然会失败。

我正在使用不同的 UiDevice 功能,但没有任何帮助,而且我没有想法,所以任何帮助将不胜感激。

android android-testing android-uiautomator

3
推荐指数
1
解决办法
1万
查看次数

如何为 firebase testlab 添加 testInstrumentation 环境变量?

如果我要在本地运行浓缩咖啡测试并传递环境变量,我可以通过添加来做到这一点

defaultConfig {
 testInstrumentationRunnerArgument 'USERNAME' 'David'
}
Run Code Online (Sandbox Code Playgroud)

build.gradle 文件中

然后我可以通过调用这个变量

InstrumentationRegistry.getArguments().getString("USERNAME")
Run Code Online (Sandbox Code Playgroud)

但是当我在 firebase testlab 上运行此参数时,instrumentationrunner 参数不起作用

android android-testing firebase android-espresso firebase-test-lab

3
推荐指数
1
解决办法
1580
查看次数

片段测试错误:android.view.InflateException:二进制 XML 文件行 #16:二进制 XML 文件行 #16:错误膨胀类 <未知>

我正在尝试按照以下说明测试片段:https ://developer.android.com/training/basics/fragments/testing

launchFragmentInContainer但是,当我从测试中调用时,我遇到了以下崩溃。

堆栈跟踪:

android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating class <unknown>

Caused by: android.view.InflateException: Binary XML file line #16: Error inflating class <unknown>
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
...
at android.view.LayoutInflater.$$robo$$android_view_LayoutInflater$createView(LayoutInflater.java:647)
...
at com.myapp.poll.PollHomeFragment.onCreateView(PollHomeFragment.kt:31)
...
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f0301b1 a=-1}
at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:946)
at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
at android.view.View.__constructor__(View.java:5010)
at android.view.View.<init>(View.java)
at android.widget.TextView.<init>(TextView.java)
...
at com.myapp.poll.PollHomeFragment.onCreateView(PollHomeFragment.kt:31)
Run Code Online (Sandbox Code Playgroud)

这是布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-testing android-fragmentscenario

3
推荐指数
1
解决办法
1200
查看次数

如何在单元测试中使用协程测试实时数据

我正在使用 mockito、junit5 和协程来获取存储库中的数据。但是在测试用例中调用了 no 方法。我尝试使用没有任何Dispatchersemit()功能的正常挂起功能,并且它有效。因此,我猜原因可能是由于 livedata 协程

GitReposRepository.kt

fun loadReposSuspend(owner: String) = liveData(Dispatchers.IO) {
    emit(Result.Loading)
    val response = githubService.getReposNormal(owner)
    val repos = response.body()!!
    if (repos.isEmpty()) {
        emit(Result.Success(repos))
        repoDao.insert(*repos.toTypedArray())
    } else {
        emitSource(repoDao.loadRepositories(owner)
                           .map { Result.Success(it) })
    }
}
Run Code Online (Sandbox Code Playgroud)

GitReposRepositoryTest.kt

internal class GitRepoRepositoryTest {

    private lateinit var appExecutors:AppExecutors
    private lateinit var repoDao: RepoDao
    private lateinit var githubService: GithubService
    private lateinit var gitRepoRepository: GitRepoRepository

    @BeforeEach
    internal fun setUp() {
        appExecutors = mock(AppExecutors::class.java)
        repoDao = mock(RepoDao::class.java)
        githubService = mock(GithubService::class.java) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-testing android-livedata kotlin-coroutines

3
推荐指数
1
解决办法
3527
查看次数

Android 设备在 espresso 测试时不会在屏幕上启动活动

只要我在 YouTube 视频中看到 Android 设备倾向于启动并显示在我的测试中启动的活动,我就认为这里有问题,因为我的设备根本没有反应(尽管屏幕始终处于打开状态,动画已关闭)。当我尝试测试应用程序中首先运行的活动(逻辑上)时,我尝试在测试时自己打开应用程序,并且不知何故它起作用了。现在我正在测试另一个,但这个技巧不再起作用了。

无论如何,我总是收到错误:java.lang.AssertionError:活动永远不会变成请求状态“[RESUMED,STARTED,CREATED,DESTROYED]”

我的测试代码不包括:

val 场景 = ActivityScenario.launch(HomeActivity::class.java)

然后我只检查布局元素(textview 或任何东西)是否存在

有什么想法可能会发生吗?提前致谢

UPD:安卓模拟器工作正常。

android android-testing android-studio android-espresso

3
推荐指数
1
解决办法
1825
查看次数

在android中测试Intent

我有一个Android应用程序.当用户点击按钮A并且意图像这个android-presudocode一样被触发:)

//inside FirstActivity
@Override
public void onClick(View view) {
    startActivity(new Intent(this, AnotherActivity.class));
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我没有弄错的话,应该调用onResume方法AnotherActivity,对吗?

ActivityInstrumentationTestCase2<FirstActivity>用来测试我的活动,但我无法实例化AnotherActivity.

所以问题是,我该如何测试:'当按下按钮时,恢复正确的活动并将正确的额外内容传递给意图'.

android integration-testing android-intent android-testing

2
推荐指数
1
解决办法
6851
查看次数