楼主: AlexQin

[转载] Cucumber 使用进阶

[复制链接]
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
11#
 楼主| 发表于 2016-7-28 10:39 | 只看该作者
按照 tag expression 过滤测试用例
纯粹的讲 expression 本身会让读者觉得味同嚼蜡,下面本文以不同的例子为基础,讲述如何适用基础的 tag expressions 来过滤 Cucumber 测试用例。
  • 运行指定的单个 tag 对应的测试用例:

命令:`java cucumber.api.cli.Main --tag @focus features`只会运行 features 中那些被标记为“@focus”tag 的场景。仅仅关注某一些或者某一个场景其实在场景调试过程中非常有用,尤其是在您没有可用的 IDE 环境中,比如在没有 Window 环境的 Unix/Linux 机器上调试测试用例时;

  • 运行 @focus 或者 @key 对应的测试用例

命令:`java cucumber.api.cli.Main --tag @focus,@key features`可以运行 features 中那些被标记为“@focus”和被标记为“@key”的场景。此处的逗号可以被理解为逻辑上的“OR”关系运算符,因此运行的结果是二者或者多个 tags 的并集。

  • 运行被 @fast 标记并且 @bvt 标记的测试用例

命令:`java cucumber.api.cli.Main --tag @fast --tags @bvt features`可以运行 features 中那些既被 @fast 标记又 @bvt 标记的测试用例。命令可以从字面上理解为运行 BVT 测试用例中那些运行速度快的测试用例,假设您在做 code refactor,想快速验证一下所做的改动是否影响到主流程,上述命令会帮您快速运行 BVT 相关的用例,当然,前提是您已经对测试用例做了 tag。

  • 不运行被 @slow 标记但是被 @bvt 标记的测试用例

命令:`java cucumber.api.cli.Main --tag ~@slow --tags @bvt features`可以运行 features 中那些被标记为 bvt 但是不被 tag @slow 修饰标记的测试用例。理想情况下,我们期望测试用例运行的足够快,但是现实测试中,通常需要对系统进行登录认证,授权,不乏有运行慢的用例,因此,标记出那些运行速度慢的用例,然后只在适合的时间运行它们,这对于提高测试用例的执行效率也是非常有必要的。此处的“~”表示否定的意思。

如果您担心用例中有同样的标记比如 @focus 也在被别人使用,不希望通过 tag 的方式来标记测试用例,Cucumber 支持以别的方式来实现同样的功能:Filter on lines 和 Filter on names。

按照行号过滤测试用例
命令:`java cucumber.api.cli.Main src/main/resources/features/FixedAmountWithdraw.feature:12:17`可以运行 FixedAmountWithdraw.feature 文件中的第 12 和 17 行,如果需要运行更多的行,只需要在 feature 文件名之后加上“:行号”。

按照场景名称过滤测试用例
命令:`java cucumber.api.cli.Main --name 固定金额取款 features`可以运行名称为“固定金额取款”的 Scenario 或者 Scenario Outline。对于 debug 单个场景时,这个功能非常有用。

使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
12#
 楼主| 发表于 2016-7-28 10:43 | 只看该作者
指定 Cucumber 运行结果报告
Cucumber 本身支持多种报告格式以适用于不同环境下调用的报告输出:
  • pretty :用于在命令行环境下执行 Cucumber 测试用例所产生的报告,如果您的 console 支持,pretty 形式的报告还可以按照颜色显示不同的运行结果;如下图所示的例子分别显示了用例执行通过和用例没有 Steps definitions 的输出报告:

图 5. Pretty 格式的 Passed 报告示例


6. Pretty 格式的 Undefined 报告示例

  • json :多用于在持续集成环境下的跨机器生成报告时使用,比如在用例执行的机器 A 上运行 Cucumber 测试用例,而在调度或报告机器 B 上生成用例执行报告,此时只需要把生成的 JSON 报告传输到机器 B 上即可。

图 7. JSON 格式报告示例



  • html :用于生成简单的 HTML 格式的报告以便查看 Cucumber 测试用例运行的结果



图 8. 简单的 HTML 格式报告示例

  • junit :用于生成 JUnit 格式的报告:



清单 7. JUnit 格式报告示例
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <testsuite failures="0" name="cucumber.runtime.formatter.JUnitFormatter"
  3.                             skipped="0" tests="1" time="0.177755">
  4. <testcase classname="使用 ATM 固定金额方式取款" name="固定金额取款" time="0.177755">
  5. <system-out>
  6. <![CDATA[
  7. 假如我的账户中有余额"500.00"元.........................................passed
  8. 当我选择固定金额取款方式取出"500.00"元..................................passed
  9. 那么我应该收到现金"500.00"元..........................................passed
  10. 而且我账户的余额应该是"0.00"元.........................................passed
  11. ]]>
  12. </system-out>
  13. </testcase>
  14. </testsuite>
复制代码


使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
13#
 楼主| 发表于 2016-7-29 09:52 | 只看该作者
如何避免 Cucumber 测试用例报告失真
从上面描述的 Cucumber 支持的报告格式和样例,看不出有什么失真啊?错了就错了,对了就对了,很明确的啊!为什么测试报告会失真?
这里说的测试报告失真是以 Maven 调用的方式运行 Cucumber 测试用例时才会出现,但是这种运行方式是大家在持续集成环境中经常会用到的,因此,此处才对这种情况加以处理,以避免在持续集成环境下出现测试报告失真。
一般情况下我们在 Maven 中执行测试用例只需要运行命令`mvn test`即可,下面是一次运行中给出的结果:
图 9. Maven 给出的失真的测试报告示例

从中可以看出:
  • Cucumber 提示运行了 4 个 Scenario 一共 16 个 Step 且全部通过了;
  • 可以理解成一共执行了 4 个 JUnit 测试用例,没有失败或编译错误;
  • 但是 Maven 给出的报告却提示运行了 20 个 Test,全部通过。

这就造成了运行报告的失真:
  • 事实上没有那么多测试用例,但是 Maven 却给出了数倍于真实的测试用例;
  • 如果有一个失败,其失败率明显会低于真实情况;
  • 如果以此为依据来 refactor 代码,很可能造成过于自信而导致后续工作量无法承受。

鉴于此,必须要避免这样的情况,有什么样的方法可以避免吗?
当然有,不知读者是否还记得 Cucumber report 支持 json 呢?Github 上有很多开源的插件或者 Cucumber 扩展可以帮助从 JSON 格式的报告生成 HTML 格式的报告。本文中推荐大家使用 Cucumber-reportingCucumber-reporting 不仅能够完成从 JSON 格式报告生成 HTML 格式报告,而且可以按照 tag 和 feature 以及 step 查看,不得不提的是生成的 HTML 格式报告的样式非常好看,下面就是以本文中所使用的 feature 文件为例,以 Cucumber-reporting 来生成的 HTML 报告:



使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
14#
 楼主| 发表于 2016-7-29 09:53 | 只看该作者
按照 Features 方式查看

图 10. 按照 Features 方式查看报告示例

使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
15#
 楼主| 发表于 2016-7-29 09:53 | 只看该作者
按照 Tags 方式查看
图 11. 按照 Tags 方式查看报告示例

使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
16#
 楼主| 发表于 2016-7-29 09:54 | 只看该作者
按照 Steps 方式查看
图 12. 按照 Steps 方式查看报告示例


从上述报告中可以看出,Scenario 和 Step 是分别统计的,因此只需要关注 Scenario 失败的信息就能够避免报告失真。


使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
17#
 楼主| 发表于 2016-7-29 09:54 | 只看该作者
如何与持续集成工具集成
主流的持续集成工具有很多,被广泛采用的开源工具当推 Jenkins。Cucumber reporting 功能也可以被 Jenkins 支持,Github 中有开源的 Jenkins Plugin:Publish pretty cucumber-jvm reports on Jenkins。对于其具体的用法,其文档中已经有详细介绍,笔者尝试过可以按照其步骤成功集成 Cucumber Reporting 功能到 Jenkins,此处不再赘述。

使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
18#
 楼主| 发表于 2016-7-29 09:55 | 只看该作者
结束语
本文从实际使用 Cucumber 这一工具的角度出发,以 Cucumber-JVM 实现为基础,采用了不同的事例阐述了如何编写 feature 文件,如何从 feature 文件生成对应的 Steps,如何生成不同格式的报告,如何定制化的运行测试用例以及在与其他主流工具结合中如何避免报告失真、如何与主流持续集成工具结合使用等,为大家在日常工作中使用 Cucumber 释疑解惑。回到 Cucumber 作为自动化工具的层面,其在 API 测试中的使用也有很多可圈可点之处,本系列后续文章会对此进行阐述:
  • 《活用 Cucumber 测试服务端开放 API》,讲述结合 BDD 风格测试工具 Rest-Assured 验证 API 功能,如何使用 JSON Schema 验证 API 的返回结构等一系列实用的经验分享。


使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
19#
 楼主| 发表于 2016-7-29 09:56 | 只看该作者
参考资料
学习
讨论
  • 加入 developerWorks 中文社区,查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。



使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
20#
 楼主| 发表于 2016-7-29 09:58 | 只看该作者

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表