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

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

所以 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}

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

提前致谢。

PS 正如您在现实中可能猜到的那样,我们创建的故事更复杂,重构它们并非易事,但我很高兴这样做以获得真正的收益。

4

3 回答 3

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")
于 2012-09-11T17:34:17.290 回答
2

首先,BDD 与测试不同。我不会在每一个 i18n 场景中都使用它。相反,隔离处理 i18n 的位并对其进行单元测试,手动测试一对并将其称为完成。如果你真的需要更彻底,那么将它与几种语言一起使用,但不要对所有语言都这样做 - 只是足够的例子给你一些安全。

现在与客户交流一下。首先,登录和注册真的那么有趣吗?一旦你让它们工作,你有可能改变它们吗?登录或注册对于您的业务有什么特别之处吗?如果没有,请尝试将这些东西排除在场景之外——维护起来比它的价值更痛苦,如果它永远不会改变,你可以手动测试一次。

显示用户登录内容的场景通常对企业来说更有吸引力和有趣(您正在与企业进行对话,对吗?)

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

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

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

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

希望这些选项之一对您有用!

于 2012-05-30T20:03:22.477 回答
0

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

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

不幸的是,我见过的一些 bdd 框架试图替换现有的单元测试框架,而它应该一起工作以重用基础设施。

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

于 2012-05-24T06:12:21.400 回答