黄瓜 – 标签
黄瓜 – 标签
当我们在一个特性文件中只有一个、两个或五个场景时,这看起来很简单。然而,在现实生活中它不会发生。对于每个被测试的特性,我们可能在一个特性文件中有 10 个、20 个或更多的场景。它们可能代表不同的目的(冒烟测试/回归测试)、不同的预期(开发人员/QA/BA)、不同的状态(准备执行/正在进行的工作)等。如何管理如此大量的执行?
为此,Cucumber 已经提供了一种通过在特征文件中使用标签来组织场景执行的方法。我们可以用一个有用的标签定义每个场景。稍后,在 runner 文件中,我们可以决定我们希望 Cucumber 执行哪个特定标签(以及场景)。标签以“@”开头。在“@”之后,您可以使用任何相关文本来定义您的标签。让我们通过一个例子来理解这一点。
假设在一个特征文件中有两个或多个场景。我们只想执行一个场景作为冒烟测试的一部分。因此,第一件事是识别该场景,第二件事是在场景开头用“@SmokeTest”文本标记它。让我们深入研究一下 –
第 1 步– 创建一个 Maven 项目,命名为ucucumberTag。
第 2 步–在src/test/java下创建一个名为CucumberTag的包
步骤 3 – 创建一个名为ucumberTag.feature的特征文件。
在文件中写入以下文本并保存。此功能文件包含两个场景,其中只有一个被标记为SmokeTest标签。
功能– 黄瓜标签
Scenario Outline – 社交网站的登录功能。
给定用户导航到 Facebook
当我输入用户名为“<用户名>”和密码为“<密码>”时
那么登录应该是不成功的
例子
| username | password | | username1 | password1 | | username2 | password2 |
#following 场景已被标记为 SmokeTest,这应该被执行。@SmokeTest
设想:
给定用户导航到 Facebook
当我输入用户名“<>”和密码“<>”时
然后用户应该被重定向到登录重试
步骤 4 – 创建一个步骤定义文件。
-
选择并右键单击包轮廓。
-
单击“新建”文件。
-
给文件起一个名字,比如cucumberTag.java
-
在文件中写入以下文本并保存。
package cucumberTag; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import cucumber.annotation.en.Given; import cucumber.annotation.en.Then; import cucumber.annotation.en.When; public class cucumberTag { WebDriver driver = null; @Given("^user navigates to facebook$") public void goToFacebook() { driver = new FirefoxDriver(); driver.navigate().to("https://www.facebook.com/"); } @When("^I enter Username as \"([^\"]*)\" and Password as \"([^\"]*)\"$") public void I_enter_Username_as_and_Password_as(String arg1, String arg2) { driver.findElement(By.id("email")).sendKeys(arg1); driver.findElement(By.id("pass")).sendKeys(arg2); driver.findElement(By.id("u_0_v")).click(); } @Then("^login should be unsuccessful$") public void validateRelogin() { if(driver.getCurrentUrl().equalsIgnoreCase( "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ System.out.println("Test Pass"); } else { System.out.println("Test Failed"); } driver.close(); } @Then("^User should be redirected to login retry$") public void loginRetry() { if(driver.getCurrentUrl().equalsIgnoreCase( "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ System.out.println("Test Pass"); } else { System.out.println("Test Failed"); } driver.close(); } }
第 5 步– 创建一个跑步者类文件。
-
在包内创建一个名为runTest.java 的运行器类。
-
编写以下代码。
-
保存文件。
package cucumberTag; import org.junit.runner.RunWith; import cucumber.junit.Cucumber; @RunWith(Cucumber.class) @Cucumber.Options(format = {"pretty", "html:target/cucumber"}) public class runTest { }
-
运行测试选项。
-
右键单击并选择选项‘Run as’。
-
选择 JUnit 测试。
当您运行这个类文件时,您将观察到以下情况。
-
Facebook 在新的 Firefox 网络浏览器实例中打开。
-
不会为用户名和密码字段提供任何值。
-
登录将被点击。
-
将加载登录重试页面。
在特征文件中定义标签没有限制。根据您的需要,您可以导出要使用的标签和要执行的场景。
主要有两种类型的标签 –
-
默认标签– 默认标签具有其预定义的含义。示例@Dev,@Ignore
-
自定义标签– 自定义标签为您提供了充分的灵活性来选择合适的文本来定义您的标签。
标签也可以在功能级别定义。在功能级别定义标签后,它确保该功能文件中的所有场景都继承该标签。根据场景的性质,我们可以为单个功能使用多个标签。每当 Cucumber 找到合适的调用时,就会执行特定的场景。
Cucumber 还提供了一种反转标签选择的方法。考虑到在 25 个定义的场景中,10 个被标记为冒烟测试。我们只需要执行回归测试场景。
为此,我们可以在 JUnit runner 类中使用“~”来排除冒烟测试场景。它将如下所示。
@RunWith(Cucumber.class) @Cucumber.Options(format = {"pretty", "html:target/cucumber"}, tags = {"~@SmokeTest"}) public class runTest { }
在定义多个标签的同时,我们还可以定义逻辑或/和逻辑与操作。
-
定义逻辑或在 runner 类中 – @dev,@wip – 它表示需要执行匹配任何此标签的场景。
-
定义逻辑或运行器类 – [@dev,~@wip] –它表示需要执行匹配这两个标签的场景。