Android 有没有为目标API编写单元测试的方法

Android 有没有为目标API编写单元测试的方法,android,unit-testing,robolectric,android-instrumentation,Android,Unit Testing,Robolectric,Android Instrumentation,我正在编写Android仪器化测试的过程中,这是一个机器人分子自定义阴影无法实现的领域 理想情况下,我们希望编写跨所有版本的Android SDK的灵活代码,但我处于一个边缘情况,需要为一个只适用于棉花糖的方法编写一个单独的单元测试 我还需要编写一个单元测试,该测试只适用于棒棒糖和更低版本,因为操作系统依赖关系不同(例如java.lang.NoClassDefFoundError) 我是否可以通过类似Junit4的注释或类似于Robolectric的东西来实现这一点,如果SDK不适合,它可以忽略

我正在编写Android仪器化测试的过程中,这是一个机器人分子自定义阴影无法实现的领域

理想情况下,我们希望编写跨所有版本的Android SDK的灵活代码,但我处于一个边缘情况,需要为一个只适用于棉花糖的方法编写一个单独的单元测试

我还需要编写一个单元测试,该测试只适用于棒棒糖和更低版本,因为操作系统依赖关系不同(例如java.lang.NoClassDefFoundError)

我是否可以通过类似Junit4的注释或类似于Robolectric的东西来实现这一点,如果SDK不适合,它可以忽略运行测试

我不想编写这样的代码:

// MarshmallowWidgetTest.java
@Test
public void testPrintName()
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    {
        // ...asserts...
    }
}

// LollipopWidgetTest.java
@Test
public void testPrintName()
{
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP)
    {
        // ...asserts...
    }
}
//marshmallowwidgetest.java
@试验
public void testPrintName()
{
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M)
{
//…断言。。。
}
}
//棒棒糖widgetest.java
@试验
public void testPrintName()
{

if(Build.VERSION.SDK_INT我不太熟悉单元测试或
Robolectric
,但因为我编写单元测试时不支持API 23,所以我使用了该配置:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21) //this guy
public class MainActivityTest {

    MainActivity_ activity = Robolectric.setupActivity(MainActivity_.class);

}
正如您所看到的,有一个注释可以用于测试类


编辑: 很抱歉,我只关注了
roblectric
测试框架,而不是主要问题

对于注释特定API的仪器测试,我将使用:

1.使用@Before注释初始化

创建一个带有@Before注释的类,在该类中它将检查被测试设备的API。如果错误,则此方法中的测试将失败。请使用
fail();
method

2.使用
@SdkSuppress
注释

指示特定测试或类需要最低API级别才能执行

在低于指定级别的android平台上执行时,将跳过测试

发件人:

因此,如果您将
@SdkSuppress(minSdkVersion=23)
设置为只能在Android棉花糖设备上运行,如果@code>@SdkSuppress(minSdkVersion=20)
设置为只能在更高版本的5.0 API设备上运行

另请阅读:

3.创建自己的注释,如
@SdkOnly

也许这篇文章会有用:

4.为您的特定仪器测试创建套件

为此,您可以使用
@RunWith()
Suites.SuiteClasses()
注释

要组织检测单元测试的执行,您可以 在测试套件类中对测试类集合进行分组并运行这些 测试在一起。测试套件可以嵌套;您的测试套件可以分组 其他测试套件并一起运行其所有组件测试类

import com.example.android.testing.mysample.CalculatorAddParameterizedTest;
import com.example.android.testing.mysample.CalculatorInstrumentationTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

// Runs all unit tests.
@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorInstrumentationTest.class,
        CalculatorAddParameterizedTest.class})
public class UnitTestSuite {}
测试套件包含在测试包中,类似于主测试包 应用程序包。按照约定,测试套件包名称 通常以.suite后缀结尾(例如, com.example.android.testing.mysample.suite)

要为单元测试创建测试套件,请导入JUnit 在测试套件中,添加
@RunWith(suite.class)
以及
@Suite.SuiteClasses()
注释。在
@Suite.SuiteClasses()
注释,将单个测试类或测试套件列为 争论

下面的示例显示了如何实现测试套件 调用的
UnitTestSuite
,对
CalculatorInstrumentationTest
CalculatorAddParameterizedTest
test 一起上课

import com.example.android.testing.mysample.CalculatorAddParameterizedTest;
import com.example.android.testing.mysample.CalculatorInstrumentationTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

// Runs all unit tests.
@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorInstrumentationTest.class,
        CalculatorAddParameterizedTest.class})
public class UnitTestSuite {}
发件人:

5.有用的资源


希望它有帮助

Config
也适用于方法是的,这不是正确的答案,因为我问的是安卓指令测试,而不是Robelic JVM单元测试。你的答案指的是我说的时候已经知道的事情“类似于Robolectric所做的,如果SDK不适合,它可以忽略运行测试”理想的解决方案是使用@RunWith(AndroidJUnit4.class)test runner,而不是@RunWith(RobolectricGradleTestRunner.class)进行一些神奇的注释我已经编辑了我的答案。我认为@SdkSupress注释可能会帮助您解决问题;-)这正是我所需要的!SdkSuppress不会出现在Stackoverflow上的任何地方,因此这是一个新的知识。感谢您的帮助!作为对尝试使用@SdkSuppress的其他人的补充说明,该注释只会在安卓指令测试中工作,即在/androidTest下。它不会出现在JVM机器人测试中,即under/测试