我已经开发了一个jBehave故事来测试我们系统中实现的一些工作流程。 假设这个故事叫做customer_registration.story
这个故事是我们系统支持的其他一些更复杂的工作流程的起点。 不同的故事也涵盖了那些更复杂的工作流程。 假设我们有一个由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}
在客户注册故事中移动清理步骤也不是一个选项,因为登录故事将停止工作。
提前致谢。
P.S。正如你可以猜到的那样,我们创造的故事更复杂,重构它们并不是一件容易的事,但我很乐意为真正的利益做到这一点。
答案 0 :(得分:2)
首先,BDD与测试不同。我不会将它用于每一个i18n场景。相反,隔离处理i18n和单元测试的位,手动测试一对并完成调用。如果你真的需要更彻底的话,那么就用几种语言来使用它,但是不要用它们来做 - 只要有足够的例子给你一些安全性。
现在与客户在一起。首先,登录和注册真的很有趣吗?一旦你让它们工作,你有可能改变它们吗?登录或注册是否对您的业务特别重要?如果没有,请尝试保留场景中 out 的东西 - 维护它的价值会比它的价值更大,如果它永远不会改变,你可以手动测试一次。
显示用户登录 的用户的情景通常对业务(you are having conversations with the business, right?)更具吸引力和吸引力。
否则,您可以通过以下三种方式设置上下文(给定):
您还可以查看数据是否存在,如果不存在,请进行设置。因此,例如,如果您的客户已注册且您不希望他注册,您可以删除他的注册作为设置上下文的一部分(运行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一起使用,并与现有的测试运行器一起使用。