BDD是否testing验收testing?

或者,如果您有BDDtesting,您是否需要Fitnesse?

BDD“testing”存在于多个不同粒度级别,一直到最初的项目愿景。 大多数人都知道这种情况。 有几个人记得, BDD开始时用“should”一词替代了JUnit的“testing” – 作为TDD的替代品。 我把“testing”放在引号中的原因是因为BDD不是真正的testing; 重点是寻找缺乏理解的地方。

由于这个焦点,谈话比BDD工具重要得多。

我要再说一遍。 对话比BDD工具重要得多。

验收testing实际上并不要求对话,通常是从你正在编写的testing是正确testing的假设开始的。 在BDD中,我们假设我们不知道我们在做什么(可能不知道我们不知道)。 这就是为什么我们使用诸如“给定,当时,然后”之类的东西 – 以便我们可以围绕场景和/或单元级别的例子进行对话。 (这是大多数人所熟悉的两个层次 – 相当于验收testing和unit testing – 但是这个规模已经上升了)。

我们不称他们为“验收testing”,因为你不能要求商业人士“请帮我做验收testing”。 他们会用一种非常奇怪的,眯眼的目光看着你,然后把你当作那个怪女孩 。 93%的人不需要这个。

尝试“我想和你谈谈……的场景”。 或者,“你能给我一个例子吗?” 这些都是好的。 称他们为“验收testing”开始让人们认为你实际上在做testing,这意味着你知道你在做什么,只是想确保你已经做了。 在这一点上,谈话倾向于关注你能够多快地把错误的东西拿出来,而不是关心你错误的事情。

你搞错了东西。 真的,说实话,你是。 即使你认为你不是,也只是因为你不了解二阶无知。 你不知道你不知道,没关系,只要你find了你不知道的地方。 (你不会发现所有这些,不要让分类悖论让你晚上。)

要真正做到正确的唯一方法就是事先获得所有要求,并且知道当你尝试时会发生什么。 那就对了。 这是瀑布 。 记得加class? 周末的工作? 你创造的七年没有生产什么东西? 如果你想避免这种情况,你只有一个机会:假设你错了,有一些关于它的谈话没有错,然后接受你仍然是错误的,无论如何去做。 过早地写testing意味着你有更多的机会出错,现在很难改变,每个人都认为你是对的,下午正在测量你的速度,现在你又犯了另外两个星期的错误。 而且 – 更糟的是,你也要testing你错了。

再来一次。 对话比BDD工具重要得多。

请,请不要固定在工具上。 这些工具只是一个捕获对话的机制,并确保他们被发挥到代码。 scheme不能代替对话,只有3×5索引卡才能取代要求。

话虽如此,如果你必须从一个工具开始,把Slim放在Fitnesse后面,这样它就可以运行可爱的Given / When / Thens,而不必乱用Fit的桌子和灯具。 GivWenZen基于苗条和他们任一个岩石。 FitSharp与.NET空间中的那些相同。 或者只是使用Cucumber或SpecFlow,或者敲几个自定义的DSL * ,这样可以很好地工作多年。

透明度:*我写了一个。 还有一些JBehave。 我希望我们称之为“不要集中于BDD工具 – 行为”。 我可能会大量参与BDD的其他部分。 如果我能得到这个信息,Dan North会给我买一个品脱,所以这不是一个公正的build议。

不pipe – 已经有了对话。 这只是人。 去说吧。

严格来说,我不知道是否有这样的事情,作为“BDDtesting”。 BDD是一个哲学,表明如何最好地与利益相关者进行互动和合作来完成一个复杂的项目。 它不会直接制定任何处方来编写testing的最佳方式。 换句话说,在BDD哲学项目下,您可能仍然会进行所有常见的testing(包括验收testing)。

当你听到“BDD框架”的时候,说话者通常意味着一个框架,用于编写你所有常见的testing,但是有一个BDD扭曲。 例如,在RSpec中,你仍然编写unit testing; 你只需要添加BDD的味道。

我喜欢区分“规格”和“testing”。

如果我覆盖一个名为GetAverage(IEnumerable<int> numbers) ,我将写一个或多或less的标准unit testing。

如果我介绍一种名为CalculateSalesTax(decimal amount, State state, Municipality municipality) ,我仍然要写unit testing,但是我会把它称为规范,因为我要把它改为(1)到validation例程的行为,(2)因为testing本身将logging例程及其接受标准。

考虑:

 [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); } } 

JBehave(和NBehave最近添加了相同的支持)与常规testing文件一起工作,所以当许多其他框架添加“BDD味觉testing”时,使用JBehave创build的基于文本的行为规范/示例适用于验收testing。 不,你不需要这样做。

要了解它是如何工作的,我build议JBehaves 2min教程 。

虽然BDD大于刚刚testing的范围,但确实有BDDtesting。 这些testing是按照BDD语言进行的unit testing。

给定一些初始上下文(givens),当一个事件发生时,然后确保一些结果。

有一些好的BDD框架可用,这取决于您的偏好语言。 JBehave for Java RSpec for Ruby NBehave for .NET

对于Flex中的BDDtesting,您可以尝试GivWenZen-flex检查http://bitbucket.org/loomis/givwenzen-flex

干杯,克里斯

x行为BDDtesting实施得很好是机器人驱动的用户验收标准。

x规范BDDtesting通常是unit testing,不太可能是用户接受的标准。