ATDD与BDD和框架的正确使用
我刚刚进入BDD的概念,并听取了Scott Bellware与Herding Code家伙的谈话。我已经和SpecFlow一起玩了,很喜欢它。
我明白ATGD和TDD之间的区别,如博客文章Classifying BDD Tools (Unit-Test-Driven vs. Acceptance Test Driven) and a bit of BDD history所述,但是这让我有一个疑问。 如上所述,没有使用BDD工具(如MSpec)只是另一个单元测试框架?在我看来,它是。 此外,这似乎表明使用SpecFlow来指定较低级别的组件(例如您的存储库和服务)将是错误的。如果我可以使用相同的工具来为ATDD和TDD的低级组件,为什么不呢?在这里似乎还有一些模糊的线条,我觉得我不太了解。
快速回答
提出的一个非常重要的一点是行为驱动发展有两种。两种口味是xBehave和xSpec。 xBehave BDD:SpecFlow SpecFlow(非常类似于Ruby堆栈中的cucumber)非常适合促进xBehave BDD测试作为验收标准。然而,它不是提供在单位级别写行为测试的好方法。还有一些其他xBehave测试框架,但SpecFlow已经获得了很大的牵引力。 xSpec BDD:NSpec 对于单位级别的行为驱动开发,我建议您使用NSpec(由RSpec直接启用)。您可以通过简单地使用NUnit或MSTest来实现单元级别的BDD …但是它们有些缺陷(这是非常难以逐步构建上下文)。 MSpec也是一个选择,已经有了很多工作,但是NSpec中只是简单的一些东西(您可以在MSpec中逐步建立上下文,但需要继承,这可能变得复杂)。 长答案 BDD的两种味道主要存在,因为它们提供了正交的益处。 xBehave的优点和缺点(GWT语法) 优点 >通过所谓的常用方言(例如,给定…,和…,当……,当……,然后….)帮助促进与业务的对话。 , 接着) 缺点 >虽然xBehave方法有利于驱动高级别的接受标准,但通过属性将英语映射到可执行代码所需的周期使得在单元级别上排除域不可行。 xSpec的优点和缺点(上下文/规范) 优点 >允许开发人员逐步建立上下文。可以为测试设置上下文,并且可以针对该上下文执行一些断言。然后,您可以指定更多的上下文(建立在已存在的上下文上),然后指定更多的测试。 缺点 >不如业务平易近人让我们面对它,业务不想消除他们想要的东西。如果我们给他们一个基于上下文的方法来BDD,那么这个句子只会读“Just make it work”。 样品 Bowling Kata是一个很好的例子。 SpecFlow样本 以下是SpecFlow中的规格说明(再次,这是一个非常好的接受测试,因为它直接与业务通信): 功能文件 特征文件是测试的常用方言。 Feature: Score Calculation In order to know my performance As a player I want the system to calculate my total score Scenario: Gutter game Given a new bowling game When all of my balls are landing in the gutter Then my total score should be 0 步骤定义文件 步骤定义文件是测试的实际执行,此文件包含SpecFlow的映射 [Binding] public class BowlingSteps { private Game _game; [Given(@"a new bowling game")] public void GivenANewBowlingGame() { _game = new Game(); } [When(@"all of my balls are landing in the gutter")] public void WhenAllOfMyBallsAreLandingInTheGutter() { _game.Frames = "00000000000000000000"; } [Then(@"my total score should be (d+)")] public void ThenMyTotalScoreShouldBe(int score) { Assert.AreEqual(0,_game.Score); } } NSpec示例,xSpec,上下文/规范 这是一个NSpec的保龄球卡塔的例子: class describe_BowlingGame : nspec { Game game; void before_each() { game = new Game(); } void when_all_my_balls_land_in_the_gutter() { before = () => { game.Frames = "00000000000000000000"; }; it["should have a score of 0"] = () => game.Score.should_be(0); } } 那么是… SpecFlow很酷,NSpec很酷 随着您越来越多的BDD,您会发现需要使用xBehave和xSpec风格的BDD。 xBehave更适合接受测试,xSpec更适合单元测试和域驱动设计。 相关链接 > RSpec vs Cucumber (RSpec stories) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |