android测试入门选择哪个工具何时,Android单元测试——辅助工具介绍
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
阅读本文大约需要8分钟 目录
最近在学习单元测试的相关知识,在这里我将分享一下我在学习过程中,使用到的一些辅助工具或框架。我也是一个初学小白,不足之处,还望大家予以指正。
文中使用的IDE是Android Studio,下面涉及到的插件、工具或导包,都是以Android Studio为例。 鸣谢:1.本文采用的代码来自Robolectric3.0的介绍和实战,该文附带的两篇博客也在单元测试方面给了我很大帮助,强烈推荐。 2.一些点子来自Android单元测试在蘑菇街支付金融部门的实践,该作者小创 有很多关于单元测试的知识值得学习。
一.Code Coverage Tool (代码覆盖率工具):
众所周知,在编写单元测试案例的过程中,有一个重要的指标就是代码覆盖率。编写单元测试并不是为了追求100%覆盖率,但覆盖率在单元测试中仍占据着不可或缺的地位。
经典的Java Coverage Tool : Emma、Eclemma(Eclipse推荐使用)、Cobertura,感兴趣的学者可以自行查阅资料。
接下来,我们来看Android Studio支持的Coverage Tool : jacoco、IntelliJ IDEA。
在Android Stuido新建过工程的同学,应该有注意到,该工程默认会新建androidTest及test的测试包。在Android Stuido中,在androidTest编写的单元测试,默认使用jacoco插件生成包含代码覆盖率的测试报告;而test包下的单元测试代码,则直接使用Android Studio已有工具IntelliJ IDEA生成覆盖率,也可以通过自定义gradle task使用jacoco插件生成与androidTest相同格式的测试报告。 androidTest 与 test:
区别:androidTest是存放一些与View(UI界面层)相关的单元测试案例的测试代码集,需要在真机或虚拟机上运行。一般使用的框架有:Instrumentation、Espresso,也可以编写自动化测试案例(框架:Uiautomator2.0);
而test包则一般只存放与Model(数据层)相关的单元测试案例,但Android几乎无法实现MV完全解耦,所以目前在test包下可能也会涉及到View的测试。直接在JVM虚拟机上运行即可,速度快。框架:Robolectric+Mockito+其他。
运行方式:Android Studio 2.0版本开始,已经能够智能检测当前的测试是androidTest还是test了,低版本的可以在Build Variants中设置Test Artifact或者Add New Configuration 时选择Unit Tests(对应test),Android Instrumentation Tests(对应androidTest)。
jacoco:先讲androidTest的使用方法
在Module gradle文件中添加以下代码:1
2apply plugin : 'com.android.application'
apply plugin: 'jacoco'1
2
3
4
5
6
7
8
9buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile ('proguard-android.txt' ), 'proguard-rules.pro'
}
debug {
testCoverageEnabled true
}
}
添加完代码之后,打开右侧的Gradle面板运行connectedAndroidTest任务,
或在Terminal控制台输入 gradlew connectedAndroidTest,回车
在appbuildreportsandroidTestsconnectedindex.html:
在appbuildreportscoveragedebug index.html:
androidTest包下未添加测试案例,所以Test Summary测试条数为0,覆盖率也都为0。可自行添加案例测试对于test包下,如果使用jacoco生成覆盖率将会麻烦一点点
需要在gradle中自定义task,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31task jacocoTestReport( type : JacocoReport, dependsOn : "testDebugUnitTest") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
// exclude auto-generated classes and tests
def fileFilter = [ '**/R.class', '**/R$*.class' ,
'**/BuildConfig.*' , '**/Manifest*.*' ,
'android/**/*.*' ]
def debugTree = fileTree( dir:
" ${ project. buildDir }/intermediates/classes/debug" ,
excludes : fileFilter)
def mainSrc = "${ project .projectDir }/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
additionalSourceDirs = files([
" ${ buildDir}/generated/source/buildConfig/debug" ,
" ${ buildDir}/generated/source/r/debug"
])
executionData = fileTree( dir: project .projectDir , includes:
['**/*.exec' , '**/*.ec'])
reports {
xml . enabled = true
xml . destination = " ${buildDir }/jacocoTestReport.xml"
csv . enabled = false
html . enabled = true
html . destination = " ${buildDir }/reports/jacoco"
}
}
添加task之后在右侧gradle面板中会发现,多了jacocoTestReport任务:
在appbuildreportstestsdebugindex.html:
在appbuildreportsjacocoindex.html:
那么问题来了:如果同时编写了androidTest与test单元测试代码,能否使用jacoco生成一份综合的代码覆盖率测试报告呢?此处应有思考。
IntelliJ IDEA:
目前,只有test才支持此方式,操作步骤请看下图:
Tracing模式会增加消耗,但测量会更精确,但一般使用Sampling就足够。
生成报告:
jacoco 与 IntelliJ IDEA:
两者各有优缺点,最明显的不同是,jacoco生成的是html报告,如果使用Jenkins自动构建测试,应该使用jacoco;而 IntelliJ IDEA,其实也是采用jacoco检测覆盖率的,但其在面板中显示,较为直观,推荐在编写调试案例时使用。分不同情况使用不同的覆盖率工具,两者可以相互取长补短。
二.静态代码检测工具:FindBugs
what:静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。
安装:AndroidStudio->Settigns->Plugins->Browse repositories->search “findBUgs-IDEA” 安装重启AndroidStudio即可。
安装完之后,工程右键选择>FindBugs>Analyze Module Files,即可开始检测代码。
若部分错误不想扫描,可右键工程->Open Module Settings里设置:
扫描结果分析:
该工程扫描出两种类型的错误Bad practice(坏的实践:不建议的写法,建议修改为约定俗成的写法)和Dodgy Code(危险代码: 具有潜在危险的代码,可能运行期产生错误),并给出了详细的说明。此工程的代码量较少,且编码风格也较好,所以查出来的bug较少,FindBugs关于FindBugs更多信息,可查看一些你不知道的事,findbugs的配置跟使用。
需要注意的是,虽然FindBugs能够对代码进行静态检测,但并不是FindBugs查找出来的bug就一定存在问题,也并不是所有潜在的bug,FidBugs都能查找出来,还需要开发者结合具体代码进行判断。
Annotation 与 JUnit Rule 的详细使用,需要自行学习,这里只介绍Android单元测试在蘑菇街支付金融部门的实践中提到的结合两者来编写测试方法的注释,来规避测试方法名冗长、难以定义、格式不美观的问题。当测试失败时,会在控制台上添加自定义的错误信息。这的确是一个不错的方法。
1).新建Annotation类,需要注意的是,单元测试以JUnit形式运行,[email protected],否则运行时无法检测到该类1
2
3
4@Retention (RetentionPolicy. RUNTIME)
public @interface Purpose {
String desc () default "" ;
}
2).新建实现MethodRule接口的自定义Rule类,在apply方法中处理案例执行前、执行成功或失败所做的操作:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29public class ErrorRule implements MethodRule {
@Override
public Statement apply( final Statement base, final FrameworkMethod method , Object target) {
return new Statement() {
@Override
public void evaluate () throws Throwable {
/***starting(method);***/
ShadowLog. stream = System. out ;//此处是使用Robolectric框架的方法,将该测试案例的log输出到控制台,方便查看log
try {
base.evaluate() ;
/***succeeded(method);***/
} catch (Throwable t) {
/***failed(t, method);***/
try {
System. err .print("@" + method.getName() + "--->" + method .getAnnotation(Purpose . class).desc()) ;
} catch (NullPointerException e) {
} finally {
throw t;
}
} finally {
/***finished(method);***/
}
}
};
}
}
3).在测试类中调用Purpose、ErrorRule1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18@RunWith (RobolectricGradleTestRunner. class)
@Config (constants = BuildConfig. class)
public class MainActivityTest {
@Rule
public ErrorRule rule = new ErrorRule();
@Test
@Purpose( desc = "when onCreate, the menu shoule be 'First menu item' and 'Second menu item'. ")
public void onCreateShouldInflateTheMenu () {
Activity activity = Robolectric. setupActivity(MainActivity. class) ;
final Menu menu = shadowOf(activity).getOptionsMenu() ;
assertEquals(menu.findItem(R.id. item1).getTitle() , "first menu item") ;
assertEquals(menu.findItem(R.id. item2).getTitle() , "Second menu item") ;
}
}
4).运行结果:
android测试入门选择哪个工具何时,Android单元测试——辅助工具介绍相关推荐
- Android基础入门教程——8.3.1 三个绘图工具类详解
Android基础入门教程--8.3.1 三个绘图工具类详解 标签(空格分隔): Android基础入门教程 本节引言: 上两小节我们学习了Drawable以及Bitmap,都是加载好图片的,而本节我 ...
- 宏宇社:国外lead入门教程(六)lead任务辅助工具网站
宏宇社:国外lead入门教程(六)lead任务辅助工具网站 做国外lead任务需要的是批量操作.简单的来说,你不可能通过在同一个联盟申请的一个账号就能做到几百美刀.几千美刀的成绩.这种获利的程度很难达 ...
- 1、Android测试入门
编写和运行测试时Android APP开发周期中的重要的一环.好的测试可以让你非常容易的在开发过程中发现bug,提升你对自己代码的自信.使用Android Studio,你可以在物理设备或者虚拟机中运 ...
- Android测试入门学习
一,Android测试新人练习--安装及文件传输 [课前准备] Android测试环境搭建 1.下载并安装JDK: http://www.oracle.com/technetwork/java/jav ...
- pcmark2 android测试,PC跑分狂魔来Android啦!
Futuremark今天宣布,PCMark for Android已经正式发布,完全免费,无广告,无内购,无任何限制. 在此之前,作为行业图形性能评测多年标杆的Futuremark 3DMark已经陆 ...
- html5 css3在线工具,HTML5/CSS3开发辅助工具(TopStyle)
TopStyle 是一款 CSS 开发辅助工具,即 HTML5 / CSS3 编辑器,它专注于 HTML CSS 设计辅助,提供比较多的功能,如 CSS 代码检查等,据称 TopStyle 的帮助文件 ...
- Android测试solo,SoloPi支付宝开源的 Android 专项测试工具的介绍与快速上手
SoloPi支付宝开源的 Android 专项测试工具的介绍与快速上手 SoloPi:支付宝开源的 Android 专项测试工具的介绍与快速上手 MTSC2019大会上,Soloπ算是一次正式的在公众 ...
- android从入门到精通!阿里巴巴Android面试都问些什么?绝对干货
金九银十,给大家整理了月薪20K的Android面试题必问集锦,希望让大家查漏补缺,最后祝大家都能在金九银十找到一份不错的工作! 一.Android性能优化的方面 针对Android的性能优化,主要有 ...
- 安装Android SDK需要选择哪些,开始为Android开发,我应该选择安装哪些SDK?
我开始将我的开发人员技能扩展到Android开发. 我安装了所有的工具和配置,每件事看起来都很棒,作为默认设置,我安装了3.2 SDK,但是没有太多的文档在那个,2.x SDK上的模式是什么. 它是否 ...
最新文章
- 浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)
- 女朋友啥时候怒了?Keras识别面部表情挽救你的膝盖
- PYTHON编程导论群问题汇总(一)
- Oracle技术之实例恢复的顺序
- Flutter之Widget、Element、renderObject
- PM们,请避免对产品的过度解读!
- wxWidgets:wxFileDirPickerEvent类用法
- GAN生成对抗网络-INFOGAN原理与基本实现-可解释的生成对抗网络-06
- 华为P50系列即将登场:曝线下门店已开始准备样机、物料
- oracle的游标的属性,Oracle 游标属性
- php课后答案 唐四薪_php课后习题及答案
- Cainteoir Text-to-Speech 0.8 发布
- ARP协议-路由交换原理5-【HCNA笔记】
- 基于大数据的消费者洞察
- Linux 查看日志的方法
- 多线程,线程通信,线程池和Lambda表达式
- 移动滑杆控制(UGUI实现)Unity3D
- 微博情感分析的表情符号平滑语言模型(A11, AAAI2012)
- Java——EasyPoi导出word文档,itextpdf转换pdf
- 股票金融K线图控件AnyStock详细介绍教程