如何用黄瓜标签和 JUnit 构建顺序测试?
How to structure sequential test with cucumber tags and JUnit?
我有一个梦想,我想用 Cucumber 来实现。
我想将 Cucumber 与 selenium 结合使用(<= 到目前为止还不错)并使用标签优化测试执行。在我的梦中,我能够用代表数据库场景的字符串标记我的场景。例如:
@noData
Scenario: bake a bread
@oneBread
Scenario: look at bread
@tenBreads
Scenario: give multiple breads to the poor
我的一些测试改变了数据,有些则没有。所以我想,如何将所有 "non-altering" 测试聚类以并行访问给定数据
@viewOnly
Scenario: look at a bread
@viewOnly
Scenario: smell a bread
通过这种集群,我的目标是实现最轻微的设置并尽可能并行工作。
@noData
@viewOnly
Scenario: bake a bread
when i bake a bread
then i see a bread
@oneBread
@viewOnly
Scenario: look at a bread
then i see a bread
@oneBread
@viewOnly
Scenario: smell a bread
then i see a bread
@oneBread
Scenario: slice a bread in half
when i slice my bread
then i got two parts of the bread
@oneBread
Scenario: butter a bread
when i butter my bread
then i got one bread covered in butter
有了这个功能文件,我希望这个解决方案能按以下顺序处理功能:
- 在数据库中设置 Szenario => @noData
@noData => Scenario: bake a bread
- 在数据库中设置 Szenario => @oneBread
@oneBread => @viewOnly Scenario look at a bread
@oneBread => @viewOnly Scenario smell a bread
- 在数据库中设置 Szenario => @oneBread
@oneBread => Scenario slice a bread in half
- 在数据库中设置 Szenario => @oneBread
@oneBread => Scenario butter a bread
有一次我玩过 JUnit runners 并尝试自己处理创建的 JUnit 测试。我是否必须再次编写自己的 JUnit 运行程序?或者是否可以使用 Cucumber 功能来满足我的要求?
有人可以帮我吗?
您可以通过 运行 对每个数据库场景进行单独测试来做到这一点。为此,请使用 --tags 参数,如此处所述 https://github.com/cucumber/cucumber/wiki/Tags#running-a-subset-of-scenarios
我更喜欢的另一种方法是将类似的数据库场景放入功能文件中。例如,那些如何更改数据的功能文件。使用@Before 获取场景的标签。
@Before
public void beforeTest(Scenario scenario){
}
希望对您有所帮助!
您必须设置 Before 挂钩,只有 运行 如果标签匹配,以及 viewonly 数据的静态标志。对于 noData,您可以添加一个类似于 onebread 标签的功能,即重置标志。
我不清楚 oneBread 标签,它是否意味着设置一个面包。那么多个面包呢?猜猜你将不得不修改逻辑。
下面应该适用于您提到的功能文件流程。
private static boolean dbSetupReq = true;
//Only get called if both tags are present
@Before(value={"oneBread","viewOnly"})
public void oneBreadViewOnly() {
if(dbSetupReq ) {
addData();
dbSetupReq = false;
}
}
//Only get called if oneBread tag is present
@Before(value={"oneBread"})
public void oneBreadViewOnly() {
dbSetupReq = true;
addData();
}
public void addData() {
// Add logic to add data to database
}
你可以尝试这样的事情。有一个通用的 Before 挂钩,它始终 运行s 并将 Scenario 对象作为参数。您可以使用 getSourceTagNames()
方法访问 Scenario
上的所有标记,其中 returns 标记名的字符串集合。然后,您可以根据存在的标签应用逻辑。也许您可以在 Before 挂钩上放置一个标记,以便在需要数据设置时调用它。
@Before
public void dataSetup(Scenario sce) {
List<String> tags = sce.getSourceTagNames();
//Do your thing with the tag names....
}
我有一个梦想,我想用 Cucumber 来实现。
我想将 Cucumber 与 selenium 结合使用(<= 到目前为止还不错)并使用标签优化测试执行。在我的梦中,我能够用代表数据库场景的字符串标记我的场景。例如:
@noData
Scenario: bake a bread
@oneBread
Scenario: look at bread
@tenBreads
Scenario: give multiple breads to the poor
我的一些测试改变了数据,有些则没有。所以我想,如何将所有 "non-altering" 测试聚类以并行访问给定数据
@viewOnly
Scenario: look at a bread
@viewOnly
Scenario: smell a bread
通过这种集群,我的目标是实现最轻微的设置并尽可能并行工作。
@noData
@viewOnly
Scenario: bake a bread
when i bake a bread
then i see a bread
@oneBread
@viewOnly
Scenario: look at a bread
then i see a bread
@oneBread
@viewOnly
Scenario: smell a bread
then i see a bread
@oneBread
Scenario: slice a bread in half
when i slice my bread
then i got two parts of the bread
@oneBread
Scenario: butter a bread
when i butter my bread
then i got one bread covered in butter
有了这个功能文件,我希望这个解决方案能按以下顺序处理功能:
- 在数据库中设置 Szenario => @noData
@noData => Scenario: bake a bread
- 在数据库中设置 Szenario => @oneBread
@oneBread => @viewOnly Scenario look at a bread
@oneBread => @viewOnly Scenario smell a bread
- 在数据库中设置 Szenario => @oneBread
@oneBread => Scenario slice a bread in half
- 在数据库中设置 Szenario => @oneBread
@oneBread => Scenario butter a bread
有一次我玩过 JUnit runners 并尝试自己处理创建的 JUnit 测试。我是否必须再次编写自己的 JUnit 运行程序?或者是否可以使用 Cucumber 功能来满足我的要求?
有人可以帮我吗?
您可以通过 运行 对每个数据库场景进行单独测试来做到这一点。为此,请使用 --tags 参数,如此处所述 https://github.com/cucumber/cucumber/wiki/Tags#running-a-subset-of-scenarios
我更喜欢的另一种方法是将类似的数据库场景放入功能文件中。例如,那些如何更改数据的功能文件。使用@Before 获取场景的标签。
@Before
public void beforeTest(Scenario scenario){
}
希望对您有所帮助!
您必须设置 Before 挂钩,只有 运行 如果标签匹配,以及 viewonly 数据的静态标志。对于 noData,您可以添加一个类似于 onebread 标签的功能,即重置标志。 我不清楚 oneBread 标签,它是否意味着设置一个面包。那么多个面包呢?猜猜你将不得不修改逻辑。 下面应该适用于您提到的功能文件流程。
private static boolean dbSetupReq = true;
//Only get called if both tags are present
@Before(value={"oneBread","viewOnly"})
public void oneBreadViewOnly() {
if(dbSetupReq ) {
addData();
dbSetupReq = false;
}
}
//Only get called if oneBread tag is present
@Before(value={"oneBread"})
public void oneBreadViewOnly() {
dbSetupReq = true;
addData();
}
public void addData() {
// Add logic to add data to database
}
你可以尝试这样的事情。有一个通用的 Before 挂钩,它始终 运行s 并将 Scenario 对象作为参数。您可以使用 getSourceTagNames()
方法访问 Scenario
上的所有标记,其中 returns 标记名的字符串集合。然后,您可以根据存在的标签应用逻辑。也许您可以在 Before 挂钩上放置一个标记,以便在需要数据设置时调用它。
@Before
public void dataSetup(Scenario sce) {
List<String> tags = sce.getSourceTagNames();
//Do your thing with the tag names....
}