最近开展新的测试工作,在测试过程中,为了扩大测试范围,将测试覆盖率达到一定比率,考虑在现有case并不能满足测试需求,so想到自己亲手编写case,基本的构思就是实现一个简单的App。为了测试case,也是绞尽脑汁。
对于android开发小白的我,在编写测试App过程中,没写一段代码都要找个手机或者虚拟设备跑一下,安装到设备上要先编译,在等待安装,非常耗时,于是就想android studio是否也可以做单元测试呢!android studio自动生成项目结构过程中,其实已经生成了测试代码的存储路径
app/src
├── androidTestjava (真机虚拟设备单元测试、UI测试)
├── main/java (业务代码)
└── test/java (本地单元测试)
因为只想跳过代码编译、app安装时间,so选择本地单元测试。
本地单元测试,大家是不是想到了Junit,是的,java中强大的Junit单元测试框架,还是深深的影响过我的,想着android是不是也可以用Junit,尝试了Junit的各种测试方法(Junit的具体用法,请参考https://junit.org/junit5/),结果在方法中使用的Log.i方式输出日志,一直报错(见下图)
其实就是说运行出现了异常,不支持Log.i,也就是junit不支持android的sdk中提供的api(也就是jdk中没有android的运行环境)
出现了这个问题,各种查找解决方法,这个过程中认识了Robolectric,小可爱真是藏的够深的,先前都没听说过。
你的小可爱Robolectric上线了,Robolectric主要是解决了单元测试过程中不需要连接设备测试耗时的问题,同时发现它还不用导入各种依赖包,只需要配置好单元测试环境就可以了。
下面介绍配置Robolectric单元测试框架的过程:
1、添加依赖
在项目中找到build.gradle文件,在响应位置添加如下依赖:
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
dependencies {
testImplementation "org.robolectric:robolectric:3.8"
}
第一次运行测试的时候,会下载一些sdk依赖包
2、从主业务逻辑中生成测试类
主业务逻辑中,点击右键——>Go To——>Test
进入“choose Test for class”名称,选择“Create New Test...”
进入“Create Test”,选择需要进行单元测试的方法:
弹出“Choose Des体nation Directory”,选择测试类文件的存放位置,选择“/app/src/test.....”
可以在“/app/src/test...”目录下找到以上创建的测试类
3、测试类中添加配置注解
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowLog.class},constants = BuildConfig.class,sdk = 25)
4、以上配置都做好了,那就开始单元测试之旅吧!
在所在测试类/方法,右键——>Run 类名/方法名
在run窗口中,查看运行结果。
5、robolectric配置完毕了,运行的结果也是绿色的passed状态,但是详细查看了下输出内容,发现并没有输出Log日志,纳尼,非了半天力气还是不能将Log日志输出,有点小情绪了
追本溯源:robolectric跑单元测试是在jvm环境运行的,而log属于android.until的api。不过robolectric提供给了相应的转换,只要在setUp()中添加一行代码,log就可以自由打印了
@Before
public void setUp() throws URISyntaxException {
ShadowLog.stream = System.out;
}
6、见证奇迹吧。重新运行case。Robolectric单元测试框架配置完成。
网友评论