使用 Android Studio 开发 Web 程序 - 测试

测试

这是 “使用 Android Studio 开发 Web 程序” 系列的最后一篇文章,接着前一篇调试的主题之后要进行的是测试。不是已经可以调试了? 调试就是在测试了啊? 还要研究什么? 有这样疑问的人可以先参考一下这一篇文章

研究的方向是希望能够确认在 Android Studio 进行测试时,可以满足下几项测试上的需求:

  • 自动化
    不仅仅是在开发时能够大幅减少测试这项工作的负担,并且还要能够把自动化延续到 CI 系统中,以便有效提升整体的开发工作品质。
  • Code Coverage
    作为测试完成度的一项指标,借以调整测试程序开发的策略、投入的成本及风险的控管。
  • Data Driven
    用来与测试的策略搭配以提升 Code Coverage,并且可以将造成系统运作问题的数据保留下来,成为一个收集系统问题的机制,成为回归测试的基准之一。

在 Android Studio 里就已内建了对 JUnit 和 TestNG 的支持,所以只要按照这些 Framework 的规格写好测试类,并且把文件存在对应 Module 的 src/test 文件夹之下,IDE 就会自动识别出来。IDE 也有提供对应的功能来简化测试的产生程序,相关的细节可以参考官网的 Creating TestsCreating Test Methods

有了测试的程序,接下来要确认是否能够达成自动化的需求。首先,要启动测试的话,透过 IDE 就可以轻易的达成,运行的细节可以参考官网的 Creating Run/Debug Configuration for TestsPerforming Tests 的说明文件。测试的结果会直接显示在 IDE 的介面上,但要先确定 “Show Statistics” 的选项是否开启,否则只会看到运行后的输出结果。要如何开启 “Show Statistics” 选项可以参考官网 Viewing and Exploring Test Results 的说明文件。

由 Run/Debug Configuration 的设定画面可以发现,和 Eclipse 相同,可以设定要运行测试的范围。所以只要设定好适当的选项,即可在 IDE 中一键运行所有的测试来达成开发阶段的测试自动化。与 CI 系统整合的部分,既然是 Gradle 的专案,当然是运行 test 或是有包含 test 的 Task 来达到目的,由相关的功能来看自动化的需求已经能够满足。

编写源代码的系列文章中有提到,IDE 的介面上就可以直接运行 Gradle 专案的 Task,和在 Terminal 下指令相同,都会产生 HTML 格式的测试报告在对应 Module 的 build/reports/tests 文件夹下。但如果是在 Terminal 下指令则要自行用浏览器开启测试报告的 HTML 档,而使用 IDE 运行 Task 则可以在 IDE 中检视测试的结果,并点选如下图所示的 “Open Gradle test report” 图标启动并显示测试报告的内容。

而与测试有着密切关连的 Code Coverage 需求,由于 Android Studio 内建就有整合了 Code Coverage 的功能,所以只要是属于测试类型的 Configuration 项目都可以使用 “Run 'xxx' with Coverage” 的功能,如果不是测试类型的 Configuration 项目在 Toolbar 上的图标会被 Disable。相关的操作细节可以参考官网的 Running with CoverageViewing Code Coverage Results 的说明文件。

最后一项需求是 Data Driven,在 Android Studio 所支持的 JUnit 和 TestNG 都有提供特定的方法来达成目的。但在这里有一个比较不一样的选择:Spock,对,就是那个尖耳朵、瓜呆头的半 Vulcan 星人的名字。这是一个和 JUnit 相容的测试框架,也就是说可以无缝式地被整合在支持 JUnit 的 IDE 中,再说得白话一点就是可以在 Android Studio 里使用 JUnit 的 Configuration 项目运行 Spock 的测试程序、产出测试报告、运行 Code Coverage 等。

为什么为想要使用 Spock 来做为测试的框架?主要是长久以来软件设计的生命周期里,需求和程序之间都有一道明显的鸿沟,原因是主流的程序语言还没有进化到可以使用自然语言来表达,所以就需要靠程序撰写人员来转译,把需求文件中的文字转成可运行的源代码。就算是导入 TDD 来协助开发,源代码可以透过先写好的测试程序来检查是否符合需求,然而目前的测试程序也还都是相同的程序语言所构成的,需求里描述的情境还是要再被转一手。

转换就会有出现落差的风险,但是 Spock 使用 BDD 的概念填补了需求文件和测试程序间的差距,让测试案例可以不被大幅转译的情况下,在测试源代码中以接近自然语言的语法来呈现 (可惜是当然地使用英文的语法),使转译失真的风险有效地被降低。就 Spock 这项特色来说,可以让文件和测试建立直接的关连并且用来验证实作的结果,是相当具有吸引力的。当然,Spock 也可以使用 Data Driven 的方式来撰写测试程序,而且能够以更直觉的的式来建立测试时所需的数据。

Spock 的测试类别是以 Groovy 为基础,要在原本是 Java 的 Module 上使用 Groovy 要先设定让 Module 支持 Groovy,详细的操作步骤可以参考官网的 Configuring Groovy-Based Frameworks 说明文件。并且在 build.gradle 里应该包含以下示范的内容:

dependencies {
   testCompile 'org.codehaus.groovy:groovy-all:2.3.3'
   testCompile 'org.spockframework:spock-core:0.7-groovy-2.0'
}

在使用 Data Driven 产出的测试报告时有一个要注意的细节,通常测试报告显示的单位都是以测试项目为基准,但由于 Data Driven 是在一个单一的测试项目中重覆地输入不同数据的方式来进行。在使用 Data Driven 产出的测试报告没有办法显示每一个受测数据样本的测试结果时,会造成阅读报告时一个很大的困扰。因为使用的样本数有可能成百上千组,当测试报告显示某个项目测试失败,但却无法显示造成失败的数据样本,甚至连失败样本组数都没有的话,错误根本就无从定位,也没有办法被修正。

在 Spock 中提供了一个 @Unroll 的 Annotation,可以让测试报告显示的项目揭露到每一组数据样本的层级。透过 Gradle 的 test Task 产出的报告档就会根据这个 Annotation 调整内容,将原本以测试项目为单位改为以受测的样本组为单位。

但在 Android Studio 里会有一个小状况是,如果只单独运行一个测试类别,在 Statistics 里可以检视到每一组数据样本的测试结果。当同时运行多个类别的测试,Statistics 检视不到相同的结果。所以这时可能就不能使用 JUnit 的 Configuration 来运行测试,要改为 Gradle 的 Configuration,并且在浏览器中来检视测试报告。

截至目前为止,研究的结果大致都符合原先设定的需求条件,所以可以暂时完全先放下 Eclipse,开开心心地使用 Android Studio 上工啰!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,856评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,778评论 6 342
  • 调试 这是 “使用 Android Studio 开发 Web 程序” 系列的第三篇文章,接续前一篇文章的内容,源...
    _WZ_阅读 6,198评论 0 0
  • 龙亭公园后面的梅苑,由于位置偏些,不起眼的缩在公园西北一隅,往往被游客忽略。但是在冬末初春,却成了人们竞相光顾...
    且行且珍惜知足常乐阅读 233评论 6 4