The RSpec Book笔记《二》Describing Features描述功能

简介:

BDD, Behaviour-Driven Development
行为驱动开发

from the outside in
从外到里的开发方式。

Enough is enough
足够就足够了,就是不要太多,够用就可以了

avoid the pitfalls of the Big Design Up Front.
避免进入预先大设计的陷阱

user stories
用户故事,和user case有点相似

interation
迭代

first release
第一个版本

一个小游戏
系统给出四个数字,用户是看不到的,然后用户输入自己猜想的四个数字,显示四个+号就算赢,否则就是输了。
如果用户输入的数字在系统给出的四个数字之中,然后判断位置是否匹配,如果位置也匹配会显示一个+号,如果位置匹配的会显示一个-号。如果用户输入的数字不在系统给出的数字之中,就什么都不显示。

selecting stories

code-breaker start game.
code-breaker submits guess.
code-breaker wins game.
code-breaker loses game.
code-breaker plays again.
code-breaker requests hint.
code-breaker saves score.

使用周期迭代interation来开发我们的这个产品,每个周期我们放出一个release,一个可以执行的release。

首先我们设计一个目标作为当前interation的目标,也作为当前interation的结果。
避免把所有的事情都加入一个周期,避免预先(过渡)设计,避免一步到位,避免无休止的扩充。

每当想要扩充我们的interation的时候,考虑一下我们的interation目标,不要远离它,禁止无休止的扩充interation的内容。

要保证interation的时间不要太长,一般两周比较合适,也不能太短,否则一个feature都还没有完成。这个需要根据目标来指定interation的长短,所以目标也要比较合适才行,过大过小都会有问题。不要想一口吃个胖子,目标要分解,逐步实现。

ATDP, Acceptance Test-Driven Planning

ATDD, Acceptance Test-Driven Development

ATDD指明我们应该在写代码之前,先写可接受的测试,但是ATDD没有说明我们什么时候开始写。

ATDP指明可接受测试应该在interation计划会议上,或者在计划会议之前,就应该被确定下来,而不是在计划会议之后。迫使我们考虑验收准则,改进我们计划interation的能力,这就是为什么被叫做ATDP。

Cucumber用文本的格式描述应用的feature。包含三个部分:标题,一个简洁的描述,任意数量的scenarios作为验收准则。
 

 
  1. Feature: code-breaker starts game 
  2.  
  3.   As a code-breaker 
  4.   I want to start a game 
  5.   So that I can break the code 
  6.  
  7.   Scenario: start name 
  8.     Give I am nto yet playing 
  9.     When I start a new game 
  10.     Then I should see "Welcome to Codebreaker!" 
  11.     And I should see "Enter guess:" 
  12.     But I should not see "What is your question?" 



在scenario后面有一个简单的描述,然后下面是一系列的步骤,每个步骤都以五个关键字中的一个开头:Given, When, Then, And, But.

Given代表事件发生之前,When代表事件,Then代表事件发生之后的预期结果。

And和But是对前一个步骤的补充说明,也就是另外一个Then。

 

 
  1. mkdir codebreaker 
  2.  
  3. cd codebreaker/ 
  4.  
  5. mkdir features 
  6.  
  7. vi features/codebreaker_start_game.feature 



在文件中敲入我们上面准备好的内容。

 

 
  1. mkdir -p features/support 
  2.  
  3. vi features/support/env.rb 
  4.  
  5. cucumber 



来继续我们的第二个feature,submit a guess。

因为这个feature较前一个复杂,我们的描述也会是另外一种格式。

 

 
  1. Feature: code-breaker submits guess 
  2.  
  3.   The code-breaker submits a guess of four numbers. The game mark the guess with + and - signs. 
  4.   
  5.   For each number in the guess that matchs the number and position of a number in the secret code, the mark includes one +. For each number in the guess that matchs the number but not the position of a number in the secret code, a - is added to the mark. 
  6.  
  7.   Scenario: all exact matches 
  8.     Given the secret code is "1234" 
  9.     When I guess "12345" 
  10.     Then the mark shoud be "++++" 



由于这个地方会有一个算法,我们想要测试多种情况,来保证这个算法的正确性。可以添加多个scenario来实现。
 

 
  1. Scenario: all exact matches 
  2.   Given the secret code is "1234" 
  3.   When I guess "1234" 
  4.   Then the mark should be "++++" 
  5.  
  6. Scenario: 2 exact matches and 2 number matches 
  7.   Given the secret code is "1234" 
  8.   When I guess "1243" 
  9.   Then the mark should be "++--" 
  10.  
  11. Scenario: 1 exact matches and 3 number matches 
  12.   Given the secret code is "1234" 
  13.   When I guess "1243" 
  14.   Then the mark should be "+---" 
  15.  
  16. Scenario: 4 number matches 
  17.   Given the secret code is "1234" 
  18.   When I guess "4321" 
  19.   Then the mark should be "----" 



但是上面的scenarioes开起来很费力,因为有大量的重复,真正想要的测试数据被淹没了。

Cucumber给我们提供了另外一种方式,Scenario Outlines。

 

 
  1. Scenario Outline: submit guess 
  2.   Given the secret code is "<code>
  3.   When I guess "<guess>
  4.   Then the mark should be "<mark>


用scenario outline替代scenario,同时提供<>来保存变量。

 

 
  1. Scenarios: all numbers correct 
  2.   | code | guess | mark | 
  3.   | 1234 | 1234  | ++++ | 
  4.   | 1234 | 1243  | ++-- | 
  5.   | 1234 | 1423  | +--- | 
  6.   | 1234 | 4321  | ---- | 


完整的feature描述如下
 

 
  1. Feature: code-breaker submits guess 
  2.  
  3.   The code-breaker submits a guess of four numbers. The game mark the guess with + and - signs. 
  4.   
  5.   For each number in the guess that matchs the number and position of a number in the secret code, the mark includes one +. For each number in the guess that matchs the number but not the position of a number in the secret code, a - is added to the mark. 
  6.  
  7.   Scenario Outline: submit guess 
  8.     Given the secret code is "<code>
  9.     When I guess "<guess>
  10.     Then the mark should be "<mark>
  11.     
  12.     Scenarios: no matches 
  13.       | code | guess | mark | 
  14.       | 1234 | 5577  |      | 
  15.       | 1234 | 8697  |      | 
  16.  
  17.     Scenarios: 1 number correct 
  18.       | code | guess | mark | 
  19.       | 1234 | 1888  | +    | 
  20.       | 1234 | 5488  | +    | 
  21.  
  22.     Scenarios: 2 numbers correct 
  23.       | code | guess | mark | 
  24.       | 1234 | 1278  | ++   | 
  25.       | 1234 | 1498  | +-   | 
  26.       | 1234 | 7723  | --   | 
  27.  
  28.     Scenarios: 3 numbers correct 
  29.       | code | guess | mark | 
  30.       | 1234 | 6234  | +++  | 
  31.       | 1234 | 1298  | ++-  | 
  32.       | 1234 | 1723  | +--  | 
  33.       | 1234 | 7123  | ---  | 
  34.  
  35.     Scenarios: all numbers correct 
  36.       | code | guess | mark | 
  37.       | 1234 | 1234  | ++++ | 
  38.       | 1234 | 1243  | ++-- | 
  39.       | 1234 | 1423  | +--- | 
  40.       | 1234 | 4321  | ---- | 

 

总结


缩小用户故事的范围,保证留下的用户故事和一次发布的目标匹配即可。
为一个interation选择用户故事,不要再一个interation中放入太多的用户故事,不要希望一个interation来完成所有的用户故事。
验收准则,我们通过写cucumber feature来描述用户故事。我们在迭代计划会议期间做这件事,使用这些来确定和修改我们的预估。
scenario outline,使得我们减少大量的重复,更加的DRY。
 




本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1060387,如需转载请自行联系原作者
目录
相关文章
|
测试技术
pytest学习和使用22-allure特性 丨总览中的Environment、Categories设置以及Flaky test使用
pytest学习和使用22-allure特性 丨总览中的Environment、Categories设置以及Flaky test使用
150 0
|
机器学习/深度学习 人工智能 索引
Numpy User Guide系列笔记1:NumPy Quickstart Tutorial笔记
本文是NumPy quickstart这一教程的简单学习笔记。我学习这一教程的目的在于回顾numpy基础知识,以辅助后期对机器学习、人工智能这类较复杂知识的更深一步学习。 本文基于自己学习这一教程时撰写的jupyter notebook文件、以更便于网页浏览的方式改编而成。jupyter notebook文件的代码基本上全部基于原教程撰写,文件已发布在GitHub上,链接为:all-notes-in-one/NumpyQuickStartTutorials.ipynb at main · PolarisRisingWar/all-notes-in-one。
|
机器人 Unix API
move_group_python_interface_tutorial代码注释
move_group_python_interface_tutorial代码注释
|
iOS开发 开发者 C++
Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7
Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7 Chapter 5 内存管理 Tips 29 理解引用计数 引用计数是 Objective-C 内存管理的基础,包括 ARC 也是建立在引用计数的基础之...
1292 0
|
Python C语言 .NET
Python chapter 8 learning notes
版权声明:本文为博主原创文章,原文均发表自http://www.yushuai.me。未经允许,禁止转载。 https://blog.csdn.net/davidcheungchina/article/details/78267298 ...
983 0