【问题标题】:Run a single Android (unit) test from gradle without loading other project dependencies从 gradle 运行单个 Android(单元)测试,而不加载其他项目依赖项
【发布时间】:2013-10-10 03:34:23
【问题描述】:

我使用 awesome plugin from Jake Wharton 进行 Android 单元测试。我不厌其烦地让这些单元测试运行的目的是为了速度(TDD 快速反馈等等)。

我已经设法正确配置它并运行了一些示例测试,如下所示:

./gradlew test

每当我运行测试时,我都会注意到以下输出:

Relying on packaging to define the extension of the main artifact has been deprecated and is scheduled to be removed in Gradle 2.0
The Test.testReportDir property has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the Test.getReports().getHtml().getDestination() property instead.
The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead.
:mySampleApp:preBuild UP-TO-DATE
:mySampleApp:preDebugBuild UP-TO-DATE
:mySampleApp:preReleaseBuild UP-TO-DATE
:libraries:facebook:compileLint
:libraries:facebook:copyReleaseLint UP-TO-DATE
:libraries:facebook:mergeReleaseProguardFiles UP-TO-DATE
:libraries:facebook:packageReleaseAidl UP-TO-DATE
:libraries:facebook:preBuild UP-TO-DATE
:libraries:facebook:preReleaseBuild UP-TO-DATE
:libraries:facebook:prepareReleaseDependencies
:libraries:facebook:compileReleaseAidl UP-TO-DATE
:libraries:facebook:compileReleaseRenderscript UP-TO-DATE
:libraries:facebook:generateReleaseBuildConfig UP-TO-DATE
:libraries:facebook:mergeReleaseAssets UP-TO-DATE
:libraries:facebook:mergeReleaseResources UP-TO-DATE
:libraries:facebook:processReleaseManifest UP-TO-DATE
:libraries:facebook:processReleaseResources UP-TO-DATE
:libraries:facebook:generateReleaseSources UP-TO-DATE
:libraries:facebook:compileRelease UP-TO-DATE
:libraries:facebook:processReleaseJavaRes UP-TO-DATE
:libraries:facebook:packageReleaseJar UP-TO-DATE
:libraries:facebook:packageReleaseLocalJar UP-TO-DATE
:libraries:facebook:packageReleaseRenderscript UP-TO-DATE
:libraries:facebook:packageReleaseResources UP-TO-DATE
:libraries:facebook:bundleRelease UP-TO-DATE
:mySampleApp:prepareComAndroidSupportAppcompatV71800Library UP-TO-DATE
:mySampleApp:preparemySampleAppandroidLibrariesFacebookUnspecifiedLibrary UP-TO-DATE
:mySampleApp:prepareDebugDependencies
:mySampleApp:compileDebugAidl UP-TO-DATE
:mySampleApp:compileDebugRenderscript UP-TO-DATE
:mySampleApp:generateDebugBuildConfig UP-TO-DATE
:mySampleApp:mergeDebugAssets UP-TO-DATE
:mySampleApp:mergeDebugResources UP-TO-DATE
:mySampleApp:processDebugManifest UP-TO-DATE
:mySampleApp:processDebugResources UP-TO-DATE
:mySampleApp:generateDebugSources UP-TO-DATE

Gradle 似乎正在为我的项目加载所有依赖项。

我的样本测试如下:

package com.mycompany.mysampleapp;

import org.junit.Test;

import static org.fest.assertions.api.Assertions.assertThat;

public class AdditionOperationsTest {
  @Test public void testModulus() {
    assertThat(1).isEqualTo(1);
  }
}

这个测试实际上应该需要几分之一秒的时间来运行。我的理解是,项目依赖项的所有预加载都会使其陷入困境。

在好的日子里,我会确保我在 CLASSPATH 中有我需要的东西,然后运行类似的东西:

javac src/test/java/main/java/com/micromobs/pkk/AdditionOperationsTest.java
java org.junit.runner.JUnitCore com.micromobs.pkk.AdditionOperationsTest

考虑到这是一个带有 gradle 的 Android 项目,我假设我必须做一些不同的事情,比如在 gradle 构建文件中创建特定任务,其中仅包括我的示例项目的测试文件,然后运行gradle command ./gradlew taskName ?

问题:是否可以在我的项目 (com.mycompany.mysampleapp) 的上下文中单独运行单个测试“AdditionOperationsTest”,这样它就不会加载外部项目依赖项

这是我的配置文件目前的样子:

# settings.gradle
include ':libraries:gradle-android-test-plugin'
include ':libraries:facebook', ':mysampleapp'

# build.gradle
...
apply plugin: 'android-test'

dependencies {
    testCompile 'junit:junit:4.10'
    testCompile 'org.robolectric:robolectric:2.1.+'
    testCompile 'com.squareup:fest-android:1.0.+'
}

# location of my test files:
androidproj/mysampleapp/src/test/java/main/com/mycompany/mysampleapp/AdditionOperationsTest.java

【问题讨论】:

  • 我正在尝试解决同样的问题。我认为要做的事情是拥有多模块项目,以便测试存在于单独的模块中,但我希望这不是必需的。
  • 是的,我真的不想将我的测试分成不同的模块。我觉得我会失去将整个项目转移到 gradle 的好处。我希望这只是我必须添加的一些愚蠢的参数或我必须声明的任务,它将忽略外部项目依赖项并运行我指向的确切测试以及它需要的唯一依赖项。跨度>

标签: android unit-testing junit gradle robolectric


【解决方案1】:

您应该可以通过使用-a command line option 来做到这一点(不重建项目依赖项)。执行gradle -a test 应该会导致libraries:facebookmysampleapp 项目不会被重建。

编辑:如下所述,您可以使用 Gradle daemon 显着提高 Gradle 构建的性能。

【讨论】:

  • 谢谢本杰明,哇,这完全正确。添加参数可确保未重建 facebook 库。不过我注意到,我只缩短了几毫秒。并没有显着使我的测试运行得更快:(您可以提供的任何提示以使测试运行得更快,例如,仅在使用时才延迟加载依赖项?我拥有的测试不使用“框架”的任何部分,所以应该跑得很快。干杯。
  • 我不知道。您的测试需要运行多长时间?您可能想了解为什么它实际上需要和目前一样长(例如,测试是否调用外部系统)。
  • 总时间:10.612 秒。我认为这更多地与设置有关,因为每个测试类只是一个虚拟测试类(与我在问题中发布的完全一样),它应该立即运行。我认为 gradle 在运行单个测试之前正在重新计算/重新编译或做一些事情来准备整个项目。
  • 下载依赖后,远程检查应该很快。顺便说一句:另一个提示 - 你使用Gradle daemon 吗?这也应该节省一些时间。
  • 你我的朋友,是摇滚明星!在你提到之前,我没有使用守护进程。这将我的构建时间从 10 秒缩短到 3 秒。
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
相关资源
最近更新 更多