1、业务规则如下:“只要总购买金额超过1000美元,就提供5%的折扣。”有以下几组购买金额和对应的折扣金额数据:(1.00美元,0.00美元)、(10.00美元,0.50美元)、(1400.00美元,75.00美元)、(20000.00美元,200.00美元)。按照测试是否通过来为这些数据上色,若测试通过涂绿色,不通过涂红色,请判断每组数据测试是否通过并说明应涂颜色。
根据业务规则,当总购买金额超过1000美元时,应提供5%的折扣。
对于金额1.00美元,未超过1000美元,折扣应为0.00美元,此测试通过,可涂绿色。 对于金额10.00美元,未超过1000美元,折扣应为0.00美元,而表格中是0.50美元,此测试不通过,可涂红色。 对于金额1400.00美元,超过1000美元,折扣应为1400 * 0.05 = 70.00美元,而表格中是75.00美元,此测试不通过,可涂红色。 对于金额20000.00美元,超过1000美元,折扣应为20000 * 0.05 = 1000.00美元,而表格中是200.00美元,此测试不通过,可涂红色。
2、选择一个与你相关的业务流程中的简单步骤序列,并使用ActionFixture表编写一个测试。
以购买物品为例,业务规则为用户选择若干物品购买,累计这些物品的总价。以下是使用
表编写的测试:
ActionFixture
| fit.ActionFixture |
| start | BuyActions |
| check | total | 00.00 |
| enter | price | 12.00 |
| press | buy |
| check | total | 12.00 |
| enter | price | 100.00 |
| press | buy |
| check | total | 112.00 |
该表第一行是固定名称
,第二行启动应用程序以累计总价,后续行按顺序执行操作:先检查初始总价为
ActionFixture
,输入价格
00.00
,点击购买按钮,检查总价变为
12.00
;再输入价格
12.00
,点击购买按钮,检查总价变为
100.00
。
112.00
3、为与你相关的事物列表创建一个RowFixture表。
以测试某类事物列表为例创建RowFixture表。假设要测试某类物品的列表,包含物品名称和物品描述两个字段。表格如下:
ItemList
| 物品名称 | 物品描述 |
|----------|--------------------|
| 苹果 | 红色的水果 |
| 香蕉 | 黄色的长条形水果 |
第一行命名了夹具为
。 第二行是表头。 后续行是具体的测试数据。
ItemList
4、为你感兴趣的以下测试选择合适的表类型——ColumnFixture (C)、RowFixture (R) 或 ActionFixture (A),并做出适当假设。a. 所缴税款取决于收入和(允许的)总支出。b. 是否需要给付款缓慢的人发一封催款信要求立即付款(否则将采取措施)?c. 这是一个有效的 URL 吗?d. 测试一个国际象棋程序中的一系列走法,并指出将军和将死的情况。e. 一个数是否为负数?f. 测试谷歌搜索是否列出了你的特殊主页。g. 国际象棋开局时棋子是否处于正确位置?h. 列表中的所有客户及其地址和电话号码是否正确?i. 计算一个数的对数。j. 借贷交易历史是否正确?k. 日期值的格式是否正确?
a. C
b. C
c. C
d. A
e. C
f. A
g. C
h. R
i. C
j. C
k. C
5、获取一个早期的示例测试表,例如 TestDiscount.xls,然后运行该测试。
下面是给定的【文本内容】:
假设已有人设置好工具和应用程序代码,使你能够对文件或文件夹中的一组文件运行 Fit 测试,你可以获取如
这样的早期示例测试表并运行测试。若你不是程序员,可让程序员为你设置好相关内容。
TestDiscount.xls
6、现在创建一个新文件,其中包含一个或多个使用尚不存在的新夹具的表格。对缺少夹具代码的表格运行 Fit,会产生什么结果?
这会产生一个错误。
7、设置一组测试并运行 Fit 对其进行测试。
当 Fit 测试数量增多时,可将相关测试组织成测试套件以节省查找和运行测试的时间,例如:
将相关测试组织到一个文件夹 或 FitNesse 子维基中
之后就可以运行 Fit 对测试套件进行测试。
8、对页面的标记进行实验,并查看用户指南以了解标记的详细信息,简述进行该实验的步骤。
在已安装FitNesse的前提下,对页面标记进行实验并参考用户指南了解详细信息。
9、尝试使用无前导 ^ 的维基词在同一级别添加页面,以及使用带有 ^ 的维基词在子维基中添加页面。观察带有前导. 的完整维基词和普通维基词在页面层次结构的不同页面中是如何工作的。
在同一级别添加页面时,只需在现有页面中添加一个维基词,创建链接后点击 ? 编辑并保存新页面。
要在现有页面内添加子维基(新页面),需在维基词前加
。
^
例如,在
页面添加
TestMyTable
作为维基词并点击其 ? 链接,会在当前页面内创建新页面,页面标题会包含父页面和新页面的名称,如
^WithinPage
。
TestMyTable.WithinPage
若在新的
页面使用普通维基词,如
WithinPage
并创建,该页面会位于同一子维基中。
SecondWithinPage
若要从不在该子维基的页面引用
页面,需使用其全名
SecondWithinPage
。
TestMyTable.SecondWithinPage
可以根据需要在子维基内进一步添加子维基来组织测试页面,合理命名子维基便于查找特定测试。
10、在
CalculateMoney
表和
CalculateDiscount
表中,给定值分别是什么,计算的内容分别是什么?
CalculateMoney
CalculateDiscount
在
表中,给定值是
CalculateMoney
和
money
,计算的是
multiplier
;
result()
在
表中,给定值是
CalculateDiscount
,计算的是
amount
。
discount()
11、当业务规则相当复杂时,应该如何完善相关表格?
从业务规则的一小部分开始,像类似展示的那样,逐步添加更多的案例来完善表格。
12、随着表格的演变,在推进过程中重新考虑词汇的使用,怎样让它更清晰?
在表格结构演变时,应准备好更改表头行和操作中的名称。简短的名称当时可能有意义,但之后自己或他人可能记不住其含义。选择合适的名称虽不易,但有助于增进理解,所以要让词汇更清晰,使用合适的业务术语,避免名称造成混淆,若名称存在问题可能暗示测试存在理解不充分、观点分歧或测试组合不当等潜在问题。
13、请翻译句子:Feel free to completely change things at any point; as you attempt to express the tests, you may find better ways to do so.
随时都可以完全改变内容;当你尝试表达这些测试时,你可能会找到更好的方法来实现。
14、为什么在实际应用中要尽量使用真实的例子,即使最初不得不对它们进行简化?
在实际应用中尽量使用真实的例子,即使最初要对它们进行简化,有以下原因:
真实例子具有现实代表性 ,能反映实际情况,让使用者更好地理解概念和方法在实际场景中的应用; 简化后的真实例子降低了理解难度 ,便于初学者快速掌握核心要点; 基于真实例子的学习和应用更符合实际需求 ,能帮助学习者将所学知识更好地迁移到实际工作和生活中。
15、为什么将测试拆分成多个表可能会很有用?
长表的组织与优化建议
长表可能需要组织成几个表,以帮助测试阅读者和编写者。
拆分表格 :当高需求不为零时,使用单独的表来定义逾期归还业务规则。 按情况拆分 :一般来说,长表可以拆分,为主要情况创建单独的表。
表格排列与格式优化
明确排列行 :明确排列表中的行,以便更易于查看组织结构,也更容易查看是否有情况缺失。
ColumnFixture 使用建议
避免重复值 :对于 ColumnFixture,可以使用空白而不是在一列中重复相同的值。 使用表参数 :或者使用表参数。
16、你实际上是否在处理两个或更多相关的业务规则?如果是,将它们拆分。
当遇到处理两个或更多相关业务规则的情况时,应将它们拆分。
17、请描述与一群什么样的人聚在一起的场景,这群人要和你有共同兴趣、具备你可能在业务方面所欠缺的背景,并且拥有良好测试技能或抽象技能(比如程序员)。
与其他几个和你有共同兴趣、具备你可能在业务方面所欠缺的背景,并且拥有良好测试技能或抽象技能(比如程序员)的人聚在一起。
18、记录内容时,选择在白板上或大张纸上记录,而不选择用电脑记录的原因是什么?
用电脑记录会减慢进度,并且会让注意力集中在操作键盘的那个人身上。
19、当同时有很多事情在进行时,应该怎么做,后续会有怎样的效果?
若同时事务繁多,可将其罗列并确定先后处理顺序,待部分取得进展后,后续拓展处理便较为轻松。
20、在尝试了一些表述之后,用这些表述中的词汇作为操作的关键词,将它们用 Fit 表格表达出来。
在尝试了一些表述之后,用这些表述中的词汇作为操作的关键词,将它们用 Fit 表格表达出来。
21、寻找测试通常包括哪三个阶段?
设置、操作和检查
22、当你发现测试内容过长时,应该怎么做?
考虑拆分测试,检查是否包含多个测试以及是否过早处理过多条件,遇到困难时要简化。
23、Keep the examples concrete and meaningful; that will make them much more useful, and you will make faster progress.
保持示例具体且有意义;这样会让它们更有用,你也会取得更快的进展。
24、Don’t spend too long at it; building shared understanding and vocabulary can be hard work, so stop for a break before you need it. When you start again, you may be surprised at how much your thinking has changed in the meantime, without effort.
不要在这上面花费太长时间; 建立共同的理解和词汇可能是一项艰巨的工作,所以在你需要休息之前就停下来休息一下。 当你再次开始时,你可能会惊讶地发现,在此期间你的思维在不知不觉中发生了很大的变化。
25、If too many opinions conflict, try to focus on the examples that you can agree on; that gives you a basis for better discussing the differences later.
如果有太多意见发生冲突,试着关注那些你们能达成共识的例子;这会为你们之后更好地讨论分歧提供基础。
26、考虑当前软件各种可能需要的计划扩展,且不要计划在更改完成后再添加测试,应该尝试哪些步骤?
可尝试以下步骤:
邀请在业务或测试方面更有帮助的人一同参与。 选定迭代时间并严格执行。 共同为每个扩展或其部分编写故事,若故事过大则拆分。 为每个故事编写一两个Fit测试,以判定其是否在软件中完全实现,这有助于完善故事。 进行规划游戏,由实施更改者负责估算所需时间和精力。 根据估算选入适合该时间段的故事。 实施更改时用故事测试检验完成情况。 迭代结束后回顾进展。
27、为什么夹具不能自动确定元素类型?
虽然可以自动确定,但可能不存在所有对象的公共超类。不过像
这样的夹具可以单独处理每个元素。
RowFixture
28、如果元素没有共同的超类会怎样?
在这种情况下,实际的共同超类是
,它没有实例变量。一种方法是使用单独的表,每个表都有自己的夹具;每个夹具都必须过滤出正确类的元素,为相关表组装合适的数组。另一种方法是让夹具处理实际集合中对象之间的差异,并期望如果没有相应的实例变量,单元格为空。
Object
和相关的
ArrayFixture
夹具采用了这种方法。
FitLibrary
29、If not, you’ll need to introduce an intermediate (adapter) class to manage the conversion of a Point to a String.
如果没有,你需要引入一个中间(适配器)类来管理从 Point 到 String 的转换。
30、在机器上安装FitNesse并完成相关练习
安装步骤如下:
需要Java系统1.4.0或更高版本来运行FitNesse,即便计划用其他编程语言运行测试; 前往 www.fitnesse.org 将系统作为zip文件下载; 解压文件,在FitNesse系统主文件夹中双击
(如果使用Linux或Unix系统则双击
run.bat
)以在你的机器上运行它; FitNesse作为服务器运行,可通过浏览器在URL
run.sh
访问; 可以选择在其他端口运行FitNesse; 可以决定是否要求登录FitNesse,具体细节可查看FitNesse附带的在线手册。
http://localhost:(你自己机器上的标准HTTP端口)
完成安装后,可开展关于使用FitNesse创建Fit表以及运行测试等相关练习。
31、如果我们还测试原始租赁物品是否恢复到原始状态,测试将会更有力。如何确保测试原始租赁物品是否恢复到原始状态?
需在测试结束时生成另一个表,以此来测试原始租赁物品是否恢复到原始状态,从而加强测试效果。
32、请解释‘不要在一个示例上花费太长时间;尝试几个有变化的示例会让你更好地了解需要表达的内容’这句话的含义。
这句话传达了在处理示例时应避免在单个示例上耗时过久,通过尝试多个有变化的示例来更好把握表达内容的建议。