Testing 在一个给定的When-Then语句中列出集合的所有部分,或将其拆分为单独的规格?

Testing 在一个给定的When-Then语句中列出集合的所有部分,或将其拆分为单独的规格?,testing,bdd,Testing,Bdd,当您编写给定的When-Then规范时,您更喜欢在1-When语句中列出集合中的元素,还是为每个元素单独指定规范 i、 e 给我一本书 当类别为“狂热”、“科幻”或“恐怖”时 那就买吧。 vs 给我一本书 当类别为“Fanatsy”时 那就买吧。 给我一本书 当类别为“科幻”时 那就买吧。 给我一本书 当类别为“恐怖”时 那就买吧。 此外,你会如何处理其余的场景?您是否为每个不在“见票即买”子集中的类别编写规范,以确保它不会购买这些类别?最好将它们分开,因为这样可以更容易地确定哪个类别失败。例如

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

i、 e

给我一本书 当类别为“狂热”、“科幻”或“恐怖”时 那就买吧。 vs

给我一本书 当类别为“Fanatsy”时 那就买吧。 给我一本书 当类别为“科幻”时 那就买吧。 给我一本书 当类别为“恐怖”时 那就买吧。
此外,你会如何处理其余的场景?您是否为每个不在“见票即买”子集中的类别编写规范,以确保它不会购买这些类别?

最好将它们分开,因为这样可以更容易地确定哪个类别失败。例如,如果你的测试没能买到“科幻”,但在“幻想”和“恐怖”方面成功了,你怎么知道哪一个失败了?困难的部分是哄骗你的语言允许你这样做而不重复你自己一遍又一遍

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

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
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()
{
}
现在,您可以创建多个子类来混合和匹配给定的时间。它减少了痛苦,但在编写真正流畅的BDD风格代码时仍然突出了静态类型语言的缺点

GIVEN a book WHEN category is "Horror" THEN Buy it.
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"
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()
{
}