2.3 表格化测试
验收测试驱动开发:ATDD实例详解
现在,随着第一个实例的自动化,Tony可以简单地重用第一个测试的步骤对剩下的经讨论会确定的实例进行自动化。作为第一步,他需要将Valet.feature里的场景转换为一个表格化的实例场景框架。为了完成这个目标,他把30分钟的时长用一个占位符< parking duration >代替,并且把期望的价格用占位符< parking costs >代替,并把这个场景标记为场景框架。Tony把实际数值放在场景框架下记录所有实例数据的表格里。Tony用占位符的名字作为表格项的名称。结果见程序清单2-23。
程序清单2-23 第一个测试转换为表格形式
1 Feature: Valet Parking feature
2 The parking lot calculator can calculate costs for Valet
Parking.
3
4 Scenario Outline: Calculate Valet Parking Cost
5 When I park my car in the Valet Parking Lot for <parking
duration>
6 Then I will have to pay <parking costs>
7
8 Examples:
9 | parking duration | parking costs |
10 | 30 minutes | $ 12.00 |
现在,Tony可以开始将讨论会上确定的实例逐一输入表格中了。Tony首先运行了测试,确保他仍能正常工作。他得到的输出如程序清单2-24所示。
程序清单2-24 第一个测试改为表格形式后的命令行输出
1 Feature: Valet Parking feature
2 The parking lot calculator can calculate costs for Valet
Parking.
3
4 Scenario Outline: Calculate Valet Parking Cost
# Valet.feature:4
5 When I park my car in the Valet Parking Lot for <parking
duration> # step_definitions/Valet_steps.rb:1
6 Then I will have to pay <parking costs>
# step_definitions/Valet_steps.rb:6
7
8 Examples:
9 | parking duration | parking costs |
10 | 30 minutes | $ 12.00 |
11
12 1 scenario (1 passed)
13 2 steps (2 passed)
14 0m0.316s
现在他开始填入剩下的实例。最后Tony把讨论会上所有的实例都做成了表格化的测试(见程序清单2-25)。
程序清单2-25 讨论会中所有的实例都被填入表格
1 Feature: Valet Parking feature
2 The parking lot calculator can calculate costs for Valet
Parking.
3
4 Scenario Outline: Calculate Valet Parking Cost
5 When I park my car in the Valet Parking Lot for <parking
duration>
6 Then I will have to pay <parking costs>
7
8 Examples:
9 | parking duration | parking costs |
10 | 30 minutes | $ 12.00 |
11 | 3 hours | $ 12.00 |
12 | 5 hours | $ 12.00 |
13 | 5 hours 1 minute | $ 18.00 |
14 | 12 hours | $ 18.00 |
15 | 24 hours | $ 18.00 |
16 | 1 day 1 minute | $ 36.00 |
17 | 3 days | $ 54.00 |
18 | 1 week | $ 126.00 |
为了执行这些测试,他需要用合适的值扩展ParkCalcPage类中的durationMap(见程序清单2-26)。
程序清单2-26 为全部代客泊车测试扩展了durationMap后的ParkCalcPage类
1 class ParkCalcPage
2
3 ...
4
5 @@durationMap = {
6 '30 minutes' => ['05/04/2010', '12:00', 'AM', '05/04/2010'
,'12:30', 'AM'],
7 '3 hours' => ['05/04/2010', '12:00', 'AM', '05/04/2010',
'03:00', 'AM'],
8 '5 hours' => ['05/04/2010', '12:00', 'AM', '05/04/2010',
'05:00', 'AM'],
9 '5 hours 1 minute' => ['05/04/2010', '12:00', 'AM',
'05/04/2010', '05:01', 'AM'],
10 '12 hours' => ['05/04/2010', '12:00', 'AM', '05/04/2010',
'12:00', 'PM'],
11 '24 hours' => ['05/04/2010', '12:00', 'AM', '05/05/2010',
'12:00', 'AM'],
12 '1 day 1 minute' => ['05/04/2010', '12:00', 'AM',
'05/05/2010', '12:01', 'AM'],
13 '3 days' => ['05/04/2010', '12:00', 'AM', '05/07/2010',
'12:00', 'AM'],
14 '1 week' => ['05/04/2010', '12:00', 'AM', '05/11/2010',
'12:00', 'AM']
15 }
16
17 ...
Tony执行了所有的测试并看到它们全部通过了。似乎Alex已经实现了代客泊车的所有功能。故事卡背面的验收条件为Alex提供了实现功能所需的信息。作为最后一步,Tony将他修改过的所有文件提交到源代码库中,并且在团队的任务看板上将代客泊车的故事卡标记为已自动化且通过测试。这天下班前,Alex和Tony击掌庆祝了他们的成功。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。