- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在我的项目中使用 AndroidJUnitRunner,但无论是在 Android Studio 中还是通过 gradlew
从命令行在设备和模拟器上执行单元测试都非常慢。
我正在使用这个开源项目的主分支 OneBusAway(截至 this commit): https://github.com/OneBusAway/onebusaway-android
我看到所有 142 个测试的执行时间在实际运行时间中超过 3 分钟,但 Android 只在“测试结果”下显示的执行时间中记录了其中的一小部分。在切换到 AndroidJUnitRunner 之前,所有这些单元测试的执行时间都在 20 秒内。
下面是一个示例测试:
/**
* Tests to evaluate utility methods related to math conversions
*/
@RunWith(AndroidJUnit4.class)
public class MathUtilTest {
@Test
public void testOrientationToDirection() {
// East
double direction = MathUtils.toDirection(0);
assertEquals(90.0, direction);
}
}
这是 build.gradle
配置:
android {
dexOptions {
preDexLibraries true
}
compileSdkVersion this.ext.compileSdkVersion
buildToolsVersion "27.0.3"
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
versionCode 93
versionName "2.3.8"
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
}
...
testOptions {
execution 'ANDROID_TEST_ORCHESTRATOR'
unitTests.includeAndroidResources true
}
...
}
dependencies {
...
// Unit tests
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestUtil 'com.android.support.test:orchestrator:1.0.2'
...
}
为什么这个运行的单元测试这么慢?
最佳答案
显然,减速与包含对 Android Test Orchestrator 的依赖有关。 ,我不需要(即使我在需要 Android 上下文的设备上运行测试)。根据现有文档,我不清楚这些测试不需要 Orchestrator。
我从 build.gradle
中删除了以下几行,我通过 Android Studio 的总执行时间回落到大约 15 秒的范围内:
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
...
execution 'ANDROID_TEST_ORCHESTRATOR'
...
androidTestUtil 'com.android.support.test:orchestrator:1.0.2'
所以这是在大约 15 秒内执行测试的新 build.gradle
:
android {
dexOptions {
preDexLibraries true
}
compileSdkVersion this.ext.compileSdkVersion
buildToolsVersion "27.0.3"
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
versionCode 93
versionName "2.3.8"
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
testOptions {
unitTests.includeAndroidResources true
}
...
}
...
dependencies {
...
// Unit tests
androidTestImplementation 'com.android.support.test:runner:1.0.2'
}
我想也许 testInstrumentationRunnerArguments clearPackageData: 'true'
是导致执行时间增加以清除包数据的罪魁祸首,但单独删除该行并没有改变测试的总执行时间- 我必须完全删除 Orchestrator 依赖项。
这是 Github 上删除 Orchestrator 的提交: https://github.com/OneBusAway/onebusaway-android/commit/a1657c443258ac49b1be83a75399cf2ced71080e
关于AndroidJUnitRunner 单元测试执行起来很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51216343/
我在我的项目中使用 AndroidJUnitRunner,但无论是在 Android Studio 中还是通过 gradlew 从命令行在设备和模拟器上执行单元测试都非常慢。 我正在使用这个开源项目的
只要指定类,我就可以运行仪器测试。 adb shell am instrument -w -e class com.application.instrumentation.BaseActivityTe
我使用 gradle 构建我的 android 应用程序。 我按照文档 ( https://developer.android.com/topic/libraries/testing-support-
设置: 我继承的一个较旧的项目有很多遗留的仪器测试,我想对它们施加超时,因为它们中的很多都可以无限期地挂起,这使得很难获得测试报告。我正在将测试更新为 Junit4 样式,但目前它们都在扩展 Acti
我有一个 Android 应用程序,我正在尝试使用 Jenkins 进行设置。我已经使用 Android 模拟器插件启动模拟器,并使用 gradle 脚本构建项目,但我无法让它运行我使用 Androi
我是 Android 测试领域的新手,单元测试示例提到了 AndroidJunit4 runner 的使用。我偶然发现了另一个名为 AndroidJUnitRunner 的运行者。现在,我看到了这两个
我正在尝试整合 Espresso 2.0's AndoridJUnitRunner与 ActivityUnitTestCase。但是,当 startActivity() tries to initia
在 Gradle 和 Run/Debug Configurations -> Android Tests -> MyInstrumentedTest -> General -> Specific in
我想使用 faSTLane screengrab,当我启动时 fastlane screengrab我有这个错误:android.util.AndroidException: INSTRUMENTAT
我们围绕相机功能进行了一些 UI 测试,在我们从 InstrumentationTestRunner 切换到 AndroidJUnitRunner 作为迁移到 Espresso/JUnit4 的一部分
我正在尝试使用插桩测试,并将我的项目更新为 AndroidX。但是在尝试运行时出现以下错误: 2018-10-09 14:22:29.468 13263-13263/xxx.yyy E/Android
我是仪器测试的新手。我正在尝试使用 AndroidJUnitRunner 进行基本测试。这是我的毕业典礼: apply plugin: 'com.android.application' androi
我正在尝试将我的项目更新为最近发布的 Android 测试支持库版本 1.0.0。但是,如果我添加 assertj-core 依赖项,Gradle 检测的测试任务开始失败,并显示“未找到测试”消息。不
我已经编写了一个简单的 Android 工具测试用例来测试网络操作。 Test case class name: Main3ActivityTest.java Method name:addNewEm
我尝试在 MultiDex 应用程序上运行 Espresso 测试,但失败并出现以下错误 Error:Execution failed for task > :transformClassesWith
几天以来,我一直在为我们的 MultiDex 应用程序中的 NoClassDefFoundError 和 AndroidJUnitRunner 而苦苦挣扎...... 因为我们想开始使用 Espres
我们将 Robotium 与 android.test.InstrumentationTestRunner 一起用于我们的测试。尽管如此,我们还是想用 Espresso 替换 Robotium,但我们
我在单元测试中使用了 robolectric。最近在我们的项目中,我们添加了一个来自 zendesk 的新依赖项。 repositories { maven { url 'ht
在我的应用程序上录制了一个简单的 Espresso 测试后,测试无法运行,我希望有人能指导我了解为什么会发生这种情况。产生的错误是: D/AndroidJUnitRunner: Use the raw
我是一名优秀的程序员,十分优秀!