testing - 在一个 Given-When-Then 语句中列出一组的所有部分,还是分解为单独的规范?

标签 testing bdd

当您编写 Given When Then 规范时,您更喜欢在 1 个 When 语句中列出集合中的元素,还是为每个单独的规范?

GIVEN a book 
WHEN category is "Fanatsy", "Sci-Fi", or "Horror" 
THEN Buy it. 

对比

GIVEN a book
WHEN category is "Fanatsy"
THEN Buy it.
GIVEN a book 
WHEN category is "Sci-Fi"
THEN Buy it.
GIVEN a book 
WHEN category is "Horror" 
THEN Buy it.

此外,您如何处理其余的集合?您是否为不在您的“即买即看”子集中的每个类别编写规范以确保它不会购买?

最佳答案

最好能将它们分开,因为这样可以更容易地确定哪一个失败了。例如,如果您的测试未能购买“Sci-Fi”,但在“Fantasy”和“Horror”上成功,您怎么知道哪一个失败了?困难的部分是哄骗您的语言,让您无需一遍又一遍地重复自己就可以做到这一点。

这在一维问题上不像在多维问题上那样有问题,例如:

GIVEN a bookstore
THAT has "Fantasy", "Sci-Fi", and "Horror" books
WHEN you only have enough money to buy one book
THEN buy "Fantasy"

GIVEN a bookstore
THAT has "Fantasy", "Sci-Fi", and "Horror" books
WHEN you have enough money to buy two books
THEN buy "Fantasy" and "Sci-Fi"

GIVEN a bookstore
THAT has "Fantasy", "Sci-Fi", and "Horror" books
WHEN you have enough money to buy two books
AND you already own a "Fantasy" book
THEN buy "Sci-Fi" and "Horror"

在这些情况下,我的投票仍然是您将其拆分:

GIVEN a bookstore
THAT has "Fantasy", "Sci-Fi", and "Horror" books
WHEN you have enough money to buy two books
AND you already own a "Fantasy" book
THEN buy "Sci-Fi"
THEN buy "Horror"

这意味着您在上述情况下有两个规范。但是,在 C# 和 Java 等静态语言中,我还没有找到一种很好的方法来执行此操作。有帮助的一件事是将您的安排和断言代码分解为可重用的方法,然后像从自助餐厅排队中挑选菜肴一样从中挑选:

public virtual void Establish_context()
{
    Given_a_bookstore_that_has_Fantasy_Sci_fi_and_Horror_books();
    When_you_have_enough_money_to_buy_two_books();
    And_you_already_own_a_fantasy_book();
}

[Specification]
public void Then_buy_Sci_fi()
{
}

[Specification]
public void Then_buy_Horror()
{
}

现在您可以创建多个子类来混合和匹配您的 Given 和 When。它减少了痛苦,但在编写真正流畅的 BDD 样式代码时仍然突出了静态类型语言的缺点。

关于testing - 在一个 Given-When-Then 语句中列出一组的所有部分,还是分解为单独的规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3497051/

相关文章:

unit-testing - 测试后端 api 端点是否被视为单元测试?

java - Jenkins 用引号包裹 java 系统属性

bdd - 对我的小 cucumber 感到困惑 - 网页之间的导航

javascript - CasperJS 的替代品,用于 Cucumber.js

testing - plone 3.3.5 - 使用 last_login_time 和日期范围索引的测试目录查询失败

perl - 强制 cmp_deep 在失败时显示哈希中的所有差异

testing - Google App Script 中的 Gmail 服务每执行四次操作就会运行缓慢。为什么?

python - 是否有适用于 Python 的首选 BDD 样式单元测试框架?

Python Behave 在功能之间共享数据

bdd - MSpec 和 SpecFlow 什么时候用哪个?两者的优点/缺点是什么?