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