如何使用不同的参数多次运行故事

时间:2012-05-24 01:26:41

标签: bdd jbehave

  1. 我已经开发了一个jBehave故事来测试我们系统中实现的一些工作流程。 假设这个故事叫做customer_registration.story

  2. 这个故事是我们系统支持的其他一些更复杂的工作流程的起点。 不同的故事也涵盖了那些更复杂的工作流程。 假设我们有一个由customer_login.story覆盖的更复杂的工作流程

  3. 所以customer_login.story看起来如下所示:

    Story: Customer Login
    
    Narrative:
    
    In order to access ABC application
    As a registered customer
    I want to login into the application
    
    Scenario: Successfully login into the application
    
    GivenStories: customer_registration.story
    
    Given I am at the login page
    When I type a valid password
    Then I am able to see the application main menu
    

    一切都很完美,我很满意。

    3.上面第1点的故事(客户注册)是我需要在不同的数据集上运行的。 假设我们的系统支持i18n,我们需要检查所有支持的语言的客户注册故事是否正常运行,比如我们想测试我们的客户注册工作正常使用en-gb和zh-tw

    所以我需要实现一个看起来像这样的multi_language_customer_registration.story:

    Story: Multi language customer registration
    
    Narrative:
    
    In order to access ABC application
    As a potential customer
    I want to register for using the application
    
    Scenario: Successfully customer registration using different supported languages
    
    GivenStories: customer_registration.story
    
    Then some clean up step so the customer registration story can run again
    
    Examples:
    |language|
    |en-gb   |
    |zh-tw   |
    

    关于如何实现这一目标的任何想法? 请注意,下面的内容不是一个选项,因为我需要在运行之间运行清理步骤。

    GivenStories:  customer_registration.story#{0},customer_registration.story#{1}
    

    在客户注册故事中移动清理步骤也不是一个选项,因为登录故事将停止工作。

    提前致谢。

    P.S。正如你可以猜到的那样,我们创造的故事更复杂,重构它们并不是一件容易的事,但我很乐意为真正的利益做到这一点。

3 个答案:

答案 0 :(得分:2)

首先,BDD与测试不同。我不会将它用于每一个i18n场景。相反,隔离处理i18n和单元测试的位,手动测试一对并完成调用。如果你真的需要更彻底的话,那么就用几种语言来使用它,但是不要用它们来做 - 只要有足够的例子给你一些安全性。

现在与客户在一起。首先,登录和注册真的很有趣吗?一旦你让它们工作,你有可能改变它们吗?登录或注册是否对您的业务特别重要?如果没有,请尝试保留场景中 out 的东西 - 维护它的价值会比它的价值更大,如果它永远不会改变,你可以手动测试一次。

显示用户登录 的用户的情景通常对业务(you are having conversations with the business, right?)更具吸引力和吸引力。

否则,您可以通过以下三种方式设置上下文(给定):

  • 通过黑客攻击数据(直接访问数据库)
  • 通过UI(或控制器,如果您从该级别自动化)
  • 使用现有数据。

您还可以查看数据是否存在,如果不存在,请进行设置。因此,例如,如果您的客户已注册且您不希望他注册,您可以删除他的注册作为设置上下文的一部分(运行Given步骤);或者如果你需要他进行注册而他不是,你可以通过用户界面注册他。

最后,JBehave有一个@AfterScenario注释,您可以使用它来表示该场景的清理步骤。步骤是可重用的 - 您可以从代码中的另一个步骤调用场景的步骤,而不是使用JBehave的机制(无论如何这都是IMO更易于维护),这将允许您在登录时避免清除注册。

希望其中一个选项适合您!

答案 1 :(得分:2)

从战术角度来看,我会这样做:

在你的.story文件中

Given I set my language to {language}
When I type a valid password {pass}
Then I am able to see the application main menu

Examples:
|language|pass|
|en-gb   |password1|
|zh-tw   |kpassword2|

然后在您的Java文件中

@Given ("I set my language to $lang")
@Alias ("I set my language to {language}")

//方法到这里

@When ("I type a valid password $pwrd")
@Alias ("I type a valid password {pass}")

//方法到这里

@Then ("I am able to see the application main menu")

答案 2 :(得分:0)

大多数单元测试框架都支持这一点。

看看mstest如何指定DataSource,nunit是类似的 https://github.com/leblancmeneses/RobustHaven.IntegrationTests

不幸的是,我见过的一些bdd框架尝试替换existsng单元测试框架,而不应该共同使用以重用基础结构。

https://github.com/leblancmeneses/BddIsTddDoneRight 是一种流畅的bdd语法,可以与mstest / nunit一起使用,并与现有的测试运行器一起使用。