如何使用Gradle运行一组特定的Android检测测试?

时间:2014-07-16 18:42:19

标签: android android-studio continuous-integration android-gradle

我有多个测试包:

com.mypackage.blackbox    - Robotium UI tests
com.mypackage.integration - REST integration tests
com.mypackage.unit        - low level unit tests

我们的服务器团队需要能够在每次推送时运行集成测试(它们需要几分钟),然后每晚运行所有测试(黑盒UI测试需要10分钟以上)。

This great answer通过重载现有的JUnit注释(如@SmallTest@LargeTest)来提供一种稍微有点(但有效)的方法。

The Gradle documentation建议测试过滤器是这样做的方法,例如

./gradlew connectedAndroidTestDevDebug --tests com.mypackage.integration.*

然而,这失败了> Unknown command-line option '--tests'.错误(可能是因为Android Gradle插件不支持vanilla Gradle所做的一切?)。

同样的文件说他们将来计划支持这些替代方案:

  
      
  • 根据自定义注释(未来)进行过滤
  •   
  • 根据测试层次过滤;执行所有扩展ceratain基类(未来)的测试
  •   
  • 根据某些自定义运行时规则进行过滤,例如系统属性的特定值或某种静态(未来)
  •   

有人知道现在让它运转起来的干净方法吗?现在,我计划在我的所有集成测试扩展的基类上使用@MediumTest注释,但我希望能够指定特定的包。使用@MediumTest@LargeTest会滥用这些注释,因为我的集成和黑盒测试都是大型测试according to the guidelines

3 个答案:

答案 0 :(得分:3)

现在可以添加Android的Testing Support Library,现在您可以使用AndroidJUnitRunner并过滤您自己的自定义注释所运行的测试。

使用自定义注释过滤测试运行到测试(在此示例中为com.myapp.MyAnnotation):

adb shell am \
  instrument -w -e annotation com.myapp.MyAnnotation \
  com.myapp/android.support.test.runner.AndroidJUnitRunner

Complete AndroidJUnitRunner Documentation

您需要使用自定义注释对测试用例进行注释才能使其正常工作。示例测试用例:

import android.support.test.runner.AndroidJUnit4;
import com.myapp.MyAnnotation;

@RunWith(AndroidJUnit4.class)
public class CalculatorTest {

    @MyAnnotation
    @Test
    public void testAddition() {
        //Do testing here
    }

}

这是你的" MyAnnotation"看起来像是:

package com.myapp;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * My custom Annotation to specify a type of tests to run.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyAnnotation {
}

答案 1 :(得分:2)

要使用gradle运行特定测试,您必须创建自定义检测测试运行器类并使用该类运行测试。即创建类

package com.my.package;

public class MyInstrumentationTestRunner extends InstrumentationTestRunner {
    @Override
    public void onCreate(Bundle instrumentationArguments) {
        instrumentationArguments.putString("size", "medium"); // Run medium tests
        // Add more ...
        super.onCreate(instrumentationArguments);
    }
}

然后在build.gradletestInstrumentationRunnerandroid -> defaultConfig下,即

// ...

android {
    // ...

    defaultConfig {
        // ...
        testInstrumentationRunner "com.my.package.MyInstrumentationTestRunner"
    }
}

// ...

希望有所帮助!

注意。 build.gradle来自:lib,测试位于创建src/androidTest/java的{​​{1}}下。

答案 2 :(得分:1)

Sam's answer是最通用的答案。但是,最简单的解决方案可能是使用InstrumentationTestRunner上的-e package选项:

  

在java包中运行所有测试: adb shell am instrument -w -e   包com.android.foo.subpkg   com.android.foo/android.test.InstrumentationTestRunner

您可以将此选项与使用Square Spoon库结合使用,因为它允许您指定单个类,或使用-e将选项传递给测试运行器(例如package选项):

--class-name        Test class name to run (fully-qualified)

--method-name       Test method name to run (must also use --class-name)

--e                 Arguments to pass to the Instrumentation Runner. This can be used
                    multiple times for multiple entries. Usage: --e <NAME>=<VALUE>.
                    The supported arguments varies depending on which test runner 
                    you are using, e.g. see the API docs for AndroidJUnitRunner.

为了记录,Shazam的Fork具有更强大的正则表达式选项:

android.test.classes=REGEX - comma separated regexes that specify a pattern for the classes/packages to run