Ruby on rails 用一个实际的例子理解BDD

Ruby on rails 用一个实际的例子理解BDD,ruby-on-rails,testing,tdd,cucumber,bdd,Ruby On Rails,Testing,Tdd,Cucumber,Bdd,我试图加入行为驱动的开发方法,但要使用它,我需要了解如何以这种方式思考 我想在我现在开始的一个新的个人项目上测试它(我将使用RoR) 该项目将提供API来收集外部应用程序的数据,它将提供一个身份验证系统(Desive),根据需要收集数据的多个模型,以及一个购买订阅的支付系统,该系统将提供一些仅限付费的功能 我应该执行什么样的测试来覆盖所有这些功能,但不包括干燥 我想我应该同时使用RSpec和Cucumber。对于Desive,我将遵循他们网站上的文档,但我不清楚应该执行何种测试来检查数据是否已正

我试图加入行为驱动的开发方法,但要使用它,我需要了解如何以这种方式思考

我想在我现在开始的一个新的个人项目上测试它(我将使用RoR)

该项目将提供API来收集外部应用程序的数据,它将提供一个身份验证系统(Desive),根据需要收集数据的多个模型,以及一个购买订阅的支付系统,该系统将提供一些仅限付费的功能

我应该执行什么样的测试来覆盖所有这些功能,但不包括干燥


我想我应该同时使用RSpec和Cucumber。对于Desive,我将遵循他们网站上的文档,但我不清楚应该执行何种测试来检查数据是否已正确收集并正确显示给用户,以及用于该任务的工具。另外,如果您能提供一个简单的示例,说明您将如何组织此类项目的测试和开发,这将有所帮助(我不是问真正的测试代码,因为我认为它实际上取决于实现,而是关于开发过程和您将执行的测试类型)。如果您需要更多的细节来选择,请告诉我,并随时发明它,因为它是用于教育目的。

我不确定这是否符合您的确切要求,但我就是这样做BDD的(示例是一个webapp):

假设您作为应用程序的用户坐在计算机前面。写下实现某个用例所需执行的步骤,例如:

导航到系统的url 登录 选择所需的功能 输入相关数据以执行该功能 单击按钮以启动该功能 等待系统响应 确保屏幕上的数据与您期望的数据匹配

如果这些步骤中的任何一个未能执行,或者数据不正确,则表明测试失败


一旦在测试文件中有了它,就可以使用Gherkin/Cucumber/Webdriver来实现执行每个步骤所需的代码。每种方法都是可重用的,因此一旦您在一个地方实现了登录,它应该可以在您调用它的任何地方工作。

对于cucumber或rspec for Desive的测试,请尝试此方法

见此——
或者

我不认为在没有人指责的情况下会有任何关于BDD的提及,因为这都是关于沟通的。所以我就是那个家伙:一切都是关于沟通的!真正的价值在于与不同的利益相关者以可访问的方式探索功能,以确定系统需要透明地做什么。由于每个人都说同一种语言,沟通目标就容易多了。当涉及到实现时,开发人员知道他们在做什么,利益相关者知道他们得到了什么,并且不应该有太多的惊喜(也许除了你错过/捕捉错误/尚未意识到的事情)

因此,走出去,与您的利益相关者交谈,了解调试系统的人希望它做什么。如果这是一个单独的努力,你将需要戴一些不同的帽子

您的BDD测试将涵盖系统的行为-所需功能的单元。您仍然需要进行单元测试等-没有变化

作为产品所有者,思考您希望系统做什么,而不是如何做。你可能不在乎事情是如何运作的,只要它们确实有效。如果您是一名开发人员,这很可能是思维上的困难转变。当我第一次开始研究BDD时,我确信在场景中浏览UI旅程和技术细节等是有意义的。没有。这些内容属于步骤定义。作为开发人员,您可以定义所有的内容

至于保持干燥,请准确地写出您的场景,以便捕捉所需的行为。然后您可以担心重构和识别步骤重用的机会。正则表达式的使用在某种程度上也会有所帮助。这是一个非常有诱惑力的做法,有一整套可重复使用的步骤,但你可能会意识到,当一个步骤的改变波及到你所有的场景,而不仅仅是它应该影响的场景时,这一切都是非常脆弱的。如果您对任何形式的web自动化感兴趣,请查看web自动化金字塔

有用的资源(以及大量示例):

<很棒的免费电子书–阅读起来也很有趣


我的2美分。找一位导师(以前做过并且亲自动手的人)。或者加入本地小组或邮件列表,回答您的问题。不要试图独自完成这一切,也不要猜测自己的成功之路。是的,我认为很难只担心工作内容,而不是工作方式。。。只是一个问题:当你说“这些东西属于步骤定义。作为开发人员,你可以定义其中所有的东西。”通过使用“步骤定义”,你是在说类似黄瓜的步骤定义吗?我指的是与你的小黄瓜步骤相对应的目标语言步骤定义,例如在“Foo_steps.cs”方法中“public void ThensomeAssertionsHouldMake(){}”。