通用技术 测试工程师进阶,从 0-1 学习 Cucumber 之基于 behave 自动化测试教程(二)

虫兵 · 2022年05月25日 · 最后由 木乃伊 回复于 2022年08月15日 · 5850 次阅读

❤ 大家好!我是虫兵   ❤~

专注测试开发技术分享,技术人健康管理分享!

坚持为应届毕业生提供简历指导及职业规划建议!

坚持无偿为初中级测试工程师提供问题解答!

让分享成为一种美德!

❤ 此系列文章敢说全网最干的 behave 教程文章!❤

前提是你真的想学习!

跟下来必有所得!此系列文章敢说全网最干的基于行为驱动开发模式(BDD)的 基于 python behave 自动化测试教程文章! !

前情提要

测试工程师进阶,从 0-1 学习 Cucumber 基于 behave 自动化测试指南 (一)

上集内容我们主要讲了,Cucumber 是什么,behave 框架的来源,以及 Cucumber behava python 和 Gherkin 之间的关系是什么,其中 Gherkin 是其中的重要部分,是描述 case 的自然语言,所以今天我们主要学习一下 Gherkin,如果对相关知识不了解的过同学应该从以(一)看起,否则你会看不懂。

坚持跟下来你就从 0 -1 掌握了 behave 的自动化测试了! 

进入主题

       Gherkin 使用很多关键词来定义 case 的描述,每个关键词里可以用自然语言也就是日常我们交流的这种口语来描述,Gherkin 的文档中大多数都是以一个关键词开头,知识点:注释必须新起一行,也就是不能和关键字在同一行,否则也会被认为是描述一部门如图所示, 

如图在每个关键词的后面被称为代码块,这部分要在代码中有定义,后面会说,官方叫步骤定义。

还需要注意的是像 Scenario 后面是有(:)冒号的,其他关键词没有,如果你不小心在其他关键词后面也加了冒号,程序是不执行的。

关键词 

        除了 feature 和 Scenario 其他关键词后面都不能有空行,Gherkin 支持的关键词有:

  • Feature
  • Rule (as of Gherkin 6)
  • Example (or Scenario)
  • Given, When, Then, And, But for steps (or *)
  • Background
  • Scenario Outline (or Scenario Template)
  • Examples (or Scenarios)
    还有一些次要的关键词:

  • """ (Doc Strings)

  • | (Data Tables)

  • @ (Tags)

  • # (Comments)

    Feature

           Gherkin 文件中的第一个关键词就是 Feature , 这里的描述内容在 Cucumber 运行时被忽略,但是 html 测试报告中会展示。除了 Feature 后面可以描述一些文本。还有其他关键字也可以加描述比如:Example/Scenario, Background, Scenario Outline and Rule 并且所有描述都支持 markdown 模式。

Rule (不常用) 

   Gherkin6 之后支持 Rule 关键词,目前博主也没搞清楚他实际使用场景被认为不常用吧。

Example (不常用) 

        Example 的意思和 Sceario 意思是一样的,Example 除了一般和 Rule 搭配使用其他也没啥特殊的,暂且就认为和 Scenario 一样就可以。

Steps

        每个步骤都以 Given, When, Then, And, or But,开头。Cucumber 执行每个关键词按着他们被写的顺序,Cucumber 只要匹配到每个关键词后面的描述后就会被执行,官方说:这意味着您不能在 Given、When、Then、And 或 But 步骤中使用与另一个步骤相同的文本。。
但是我在测试时候是可以的...这可能是因为 behave 框架的原因,跟 Cucumber Gherkin 没啥关系。

Given

        

        官方描述了很多其实说白了就是,官网建议 Given 关键字是在你一个 case 的描述起到一个前置条件的设置作用,比如你要测试一个接口,可以通过 Given 先来一个初始化数据的操作。可以设置多个 Given 可以通过 And 来串联让可读性更强。

例如:

When

        官方建议 When 关键词在一个场景中只应该有一个,如果你必须有多个,官方建议应该拆成多个场景,也就是把 case 拆分的更细。

Then

        then 关键词一般是对结果的描述。应该通过断言去判断实际和预期的结果。结果应该该是可以看到的,是能输出出来的,而不是在系统内部。如存在数据库上的数据。官方大大说了不建议通过 Then 关键词直接去查询数据库。这其实也算是自动化测试的一个原则吧,如果测一个接口的数据是否成功。更多应该建议通过另一个输出接口来获取预期数据。但实际感觉也没什么不好,这可能是违反了可观测性的原则吧,或者说是你没有站在用户的角度上思考,因为用户是不会关心数据库里面存没存的,他只关心系统返给用户信息对不对。

But,And

        这里不做过多赘述就是一些链接的关键词而已。相信大家都懂。

*(不常用) 

        * 可以代替一些关键字 , 感觉没啥用, 如图

BackGround

        如果你有一些公共的逻辑是需要前置执行时候,其实不需要每个 Sceanario 都写一份的,可以把他们抽出来放到一个 BackGround 进行管理。Cucumber 运行时每个 Sceanario 前都会先执行 BackGround 中的步骤定义,这特性还是蛮有用的。图中在输出 one.two 之前都输出了 backgd 。



官方对 BackGround 的使用有一些建议:

  • 不要在 background 里设置复杂状态也就是处理复杂逻辑
  • backgroud 尽可能短
  • backgroud 应该清晰,让人一眼知道要干什么 确实不应该改在这些公共步骤里增加复杂逻辑,如果你有复杂逻辑那就应该拆分,这也比较像面向对象的单一原则。

Scenario Outline

        场景大纲,关键词可以通过不同的值的组合可以在同一个 Scenario 中运行多次,关键词 Scenario Template 和 Scenario Outline 一个意思用哪个都可以。在步骤中使用 “<>” 来获取变量的值,Scenario Outline 使用的话必须用 Examples 关键字,Cucumber 在运行的时候会把 <>中的参数用 Examples 的数据替换。 如示例图:

<>中的 dir_name 变量一次替换了下方 Examples 中的数据,所以控制台打印了多个,但其实是定义在了一个 Scenario 中。

Step Arguments

        步骤参数,有时候我们需要传递一些参数,Gherkin 提供了    Doc Strings and Data Tables 两种方式,感觉没有那么灵活,比如我想传数组,字典什么的都不行。。。不过可以封装吧自己。

DocStrings,传递了一些文本数据:

Data tables demo:

表格中特殊字符转义:

如果逆序填 | 那么可以写成 \I ,如果需要 \, 可以写成 \.

behave 框架对这些 docstrig 或者 table 数据的获取做了封装,后面教程会说到。

最后

        官方推荐,选择什么语言来编写用例应该和日常说的语言一样,避免多个语言进行切换,其实就是要么一直中文,要么一直英文,我觉得。看个人习惯吧, 我们现在就是用的中文描述。
Gherkin 目前支持过 70 个国家的语言。
下面是一个挪威语言编写的例子,大家看着玩就好:

知识点总结

Gherkin 都支持哪些关键字
这些关键字都是什么意思?
这些关键字都怎么用
哪些比较常用哪些不常用
关键字步骤之间参数如何传,都支持哪些类型的参数传递。
掌握以上内容就达到了本章的学习目的,下一节内容我们就进入了 python 的 behave 框架是如何支持 Cucumber 及本章内容的定义的没开始真正学习之旅。

​## 往期内容
测试工程师进阶,从 0-1 学习 Cucumber 基于 behave 自动化测试指南 (一)
疫情裁员浪潮,如何提高面试通过率
测试工程师面试问算法怎么办?看这个就够了

print('有任何问题可以加作者VX:1010584905, 技术交流,同时也可以帮有需要朋友,无偿 review 简历,给予面试指导 ~,今年很难,一起学起来吧 !')
共收到 9 条回复 时间 点赞

曾经用过 cucumber 和 gauge 这类 BDD 或者 ATDD 驱动框架的路过。表示既要写 spec ,还得写实现代码,且 spec 有诸多限制要求,写起来真不如直接写纯代码 + 注释方便。可能运气一直不大好,没遇到过这类工具的最佳实践方式:产品写 spec,技术写代码实现。

楼主有在实际项目中试过用 BDD 的方式么?可以分享下项目中使用的优缺点,便于读者按需选择是否要采用?

1、基于 behavior 而不是 behave
2、代码味道实在是……
程序员的英文水平决定了代码水平😂

陈恒捷 回复

目前公司的项目就正在用啊, 公司编程语言有 golang python java ,如何把多个语言统一到一个自动化框架并且可以和研发共同维护,最终展现在平台。最终方案敲的是 Cucumber 。我们习惯了 testng pytest 这些应用广泛的框架,突然接受一个风格截然不同的会有不习惯,但是你细品 会别有风味。

槽神 回复

随便写的 demo 并没有花啥心思,官网. 就是 behave 啊 ,难道有别的更权威的地方吗,可以给个链接!

至少 wiki 百科、百度、谷歌搜出来的都是 Behavior-driven development,bahave 是动词,不明白黄瓜官网为啥会犯这种低级错误

槽神 回复

哦 这可能是我的表达有问题,这个 behave 其实是 Cucumber 的 python 实现框架叫 behave ! 表达有问题了 😂 ,下次改一改~ 感谢 槽神指正!

我们是用 robot framework+appium/selenium 做 UI 的自动化。因为 robot 是自带的自然语言关键字封装,所以用 BDD 去描述用例很顺畅。

Jerry li 回复

对的 多很多框架都支持了自然语言描述插件 还有 pytest ~~~~

feature 文件第一行加#language: zh-CN 好像是可以使用中文当关键字的, 用中文写的 step 好像插件不同提供联想

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册