或者,如果你有BDD测试,你需要像Fitnesse这样的东西吗?
答案 0 :(得分:116)
BDD“测试”存在于多个不同的粒度级别,一直到初始项目愿景。大多数人都知道这些场景。有些人记得BDD started off with the word "should"代替JUnit的“测试” - 作为TDD的替代品。我把“测试”放在引号中的原因是因为BDD并不是真的要测试;它专注于找到缺乏理解或不匹配的地方。
由于这种关注,对话比BDD工具重要得多。
我要再说一遍。 对话比BDD工具重要得多。
验收测试实际上并不强制要求对话,并且通常假设您正在编写的测试是正确的测试。在BDD中,我们假设我们不知道我们在做什么(可能不知道我们不知道)。这就是为什么我们使用“Given,When,Then”之类的东西 - 这样我们就可以围绕场景和/或单元级示例进行对话。 (这些是大多数人都熟悉的两个级别 - 相当于验收测试和单元测试 - 但它的规模会上升。)
我们不称他们为“验收测试”,因为你不能问商务人士“请帮助我进行验收测试”。他们会以一种非常奇怪的,眯着眼睛的目光看着你,然后把你视为那个极客女孩。 93%的人不希望这样。
尝试“我想跟你谈谈......的情况”。或者,“你能举个例子吗?”这些都是好的。称他们为“验收测试”开始让人们认为你实际上正在进行测试,这意味着你知道自己在做什么,只是想确保你已经完成了。在这一点上,谈话倾向于关注你能够多快地把错误的东西拿出来,而不是关于你弄错了事实。
而你却错了。 Really, honestly, you are.即使你认为自己不是,也只是因为你不理解二阶无知。你不知道你不知道,只要你找到 知道你不知道的地方就可以了。 (你不会找到所有这些。不要让分类悖论让你夜不能寐。)
真正做到正确的唯一方法是事先获得所有要求,并且知道尝试时会发生什么。那就对了。这是瀑布。还记得加班吗?周末工作?七年没有你创造的东西进入生产?如果你想避免这种情况,你只有一次机会:假设你错了,对它进行一些谈话就不那么错了,然后接受你仍然错误并且无论如何都要去做。过早编写测试意味着你甚至有更多错误的机会,现在更难以改变,每个人都认为你是对的,PM正在衡量你的速度,现在你承诺错了再过2周。而且 - 更糟糕的是 - 你也要测试你的错误。
再一次。 对话比BDD工具重要得多。
请,请不要注意工具。这些工具只是一种捕获对话并确保它们在代码中播放的机制。场景不是会话的替代品,任何超过3 x 5的索引卡都可以替代需求。
话虽如此,如果你必须从一个工具开始,把Slim放在Fitnesse后面,这样它就可以运行可爱的Given / When / Thens,而不必弄乱Fit的桌子和固定装置。 GivWenZen基于Slim,其中任何一个都是岩石。 FitSharp与.NET领域的人相当。或者只使用Cucumber,或SpecFlow,或knock up a little custom DSL*来完成这项工作多年。
透明度:*我写了那个。和JBehave的一点点。我希望我们称之为“不要专注于BDD-tools-Behave”。我可能会大量参与BDD的其他部分。如果我能收到这条消息,Dan North会给我一品脱,所以这不是完全公正的建议。
无论如何 - 已经进行了对话。这只是人。去谈谈。
答案 1 :(得分:5)
我不知道是否有这样的事情,严格来说,作为“BDD测试”。 BDD是一种理念,它建议您如何与利益相关者进行最佳互动和协作,以完成复杂的项目。它不直接为编写测试的最佳方式制定任何处方。换句话说,您可能仍会在BDD哲学项目下进行所有常见的测试(包括验收测试)。
当您听说“BDD框架”时,扬声器通常意味着一个框架,用于编写所有常见类型的测试但具有BDD扭曲。例如,在RSpec中,您仍然可以编写单元测试;你只需要添加BDD风味。
答案 2 :(得分:2)
虽然BDD大于测试范围,但确实存在BDD测试。这些测试是遵循BDD语言的单元测试。
给出一些初始背景(给予), 发生事件时 然后确保一些结果。
根据您的偏好语言,有一些很好的BDD框架可用。 Java JBehave Ruby的RSpec .NET的NBehave
答案 3 :(得分:2)
我喜欢区分“规格”和“测试”。
如果我正在介绍一个名为GetAverage(IEnumerable<int> numbers)
的方法,我将编写或多或少的标准单元测试。
如果我正在介绍一个名为CalculateSalesTax(decimal amount, State state, Municipality municipality)
的方法,我仍然会编写单元测试,但我会将其称为规范,因为我要更改它(1)来验证行为例程,和(2)因为测试本身将记录例行程序及其验收标准。
考虑:
[TestFixture]
public class When_told_to_calculate_sales_tax_for_a_given_state_and_municipality() // the name defines the context
{
// set up mocks and expected behaviour
StateSalesTaxWebService stateService
= the_dependency<IStateSalesTaxWebService>;
MunicipalSurchargesWebService municipalService
= the_dependency<IMunicipalSurchargesWebService>;
stateService.Stub(x => x.GetTaxRate(State.Florida))
.Return(0.6);
municipalService.Stub(x => x.GetSurchargeRate(Municipality.OrangeCounty))
.Return(0.05);
// run what's being tested
decimal result = new SalesTaxCalculator().CalculateSalesTax
(10m, State.Florida, Municipality.OrangeCounty);
// verify the expected behaviour (these are the specifications)
[Test]
public void should_check_the_state_sales_tax_rate()
{
stateService.was_told_to(x => x.GetTaxRate(State.Florida)); // extension methods wrap assertions
}
[Test]
public void should_check_the_municipal_surcharge_rate()
{
municipalService.was_told_to(x => x.GetSurchargeRate(Municipality.OrangeCounty));
}
[Test]
public void should_return_the_correct_sales_tax_amount()
{
result.should_be_equal_to(10.65m);
}
}
答案 4 :(得分:2)
JBehave(和NBehave最近添加了相同的支持)使用常规测试文件,因此在许多其他框架添加“BDD味道tounit测试”时,使用JBehave创建的基于文本的行为规范/示例适用于验收测试。不,你不需要fitnesse。
为了了解它是如何运作的,我建议JBehaves 2min tutorial。
答案 5 :(得分:0)
对于Flex中的BDD测试,您可以尝试使用GivWenZen-flex检查http://bitbucket.org/loomis/givwenzen-flex。
干杯, 克里斯
答案 6 :(得分:0)
xBehavior实施良好的BDD测试是由机器人驱动的用户验收标准。
xSpecification BDD测试通常是单元测试,不太可能是可接受的用户验收标准。