Cucumber - 场景大纲

场景大纲基本上用表中的值替换变量/关键字.表中的每一行都被视为一个场景.

让我们继续使用相同的Facebook登录功能示例.到目前为止,我们一直在执行一个场景:提供正确的用户名后,登录成功.现在,假设我们要检查所有三种可能类型的输入(用户名,电子邮件地址或电话号码)是否成功登录.为实现这一目标,我们需要编写三种不同的方案,其中每种方案都会随输入类型而变化,登录成功.在这种情况下,场景将如下所示.

场景:

给定用户导航到Facebook

当我输入正确的用户名和密码时

然后登录应该成功

场景:

给定用户导航到Facebook

当我输入正确的电子邮件地址和密码

然后登录应该成功

场景:

指定用户导航到Facebook

当我输入正确的电话号码和密码

然后登录应该成功

在这里,如果我们仔细观察,对于以上三种情况:语句是相同的,只有输入参数(用户名/电子邮件)地址/电话号码)正在改变.这就是场景大纲的重要性.

当我们使用场景大纲定义任何场景时,我们可以指定一个测试场景,在其底部我们可以提供一些输入.该场景将被执行的次数与提供的输入次数一样多.

示例

让我们创建一个场景大纲的示例 :

第1步 : 创建一个名为 ScenarioOutlineTest的Maven测试项目

  • 转到文件→新建→其他→Maven →Maven项目→下一步.

  • 提供组ID(组ID将在所有项目中唯一标识您的项目).

  • 提供工件ID(工件ID是没有版本的jar的名称.您可以选择任何小写的名称).

  • 点击完成.

  • 打开 pom.xml :

    • 转到Eclipse左侧的package explorer.

    • 展开项目CucumberTest.

    • 找到pom.xml文件.

    • 右键单击并选择选项,打开方式"文本编辑器".

  • 为Selenium添加依赖关系;这将指示Maven,将Selenium jar文件从中央存储库下载到本地存储库.

    • 打开pom .xml处于编辑模式,在项目标记内创建依赖项标记(< dependencies></dependencies>).

    • 在依赖项标记内,创建依赖关系标记(< dependency></dependency>).

    • 在依赖关系标记中提供以下信息.

<dependency> 
   <groupId>org.seleniumhq.selenium</groupId> 
   <artifactId>selenium-java</artifactId> 
   <version>2.47.1</version> 
</dependency>


  • 为Cucumber-Java添加依赖关系:这将指示Maven,Cucumber文件是从中央存储库下载到本地存储库.

    • 再创建一个依赖标记.

    • 在依赖关系标记中提供以下信息.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>


  • 为Cucumber-JUnit添加依赖项:这将指示Maven,其中Cucumber JUnit文件是从中央存储库下载到本地存储库.

    • 再创建一个依赖标记.

    • 在依赖关系标记中提供以下信息.

<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>


  • 为JUnit添加依赖项 - 这将指示Maven,要下载哪些JUnit文件从中央存储库到本地存储库.

    • 再创建一个依赖关系标记.

    • 在依赖关系标记中提供以下信息.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>


  • 为JUnit添加依赖项 - 这将指示Maven,要下载哪些JUnit文件从中央存储库到本地存储库.

    • 再创建一个依赖关系标记.

    • 在依赖关系标记中提供以下信息.

<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>


  • 验证二进制文件.

    • 成功编辑pom.xml后,保存.

    • 转到项目→清除去;这将需要几分钟.

第2步 : 在 src/test/java

下创建一个名为"outline"的包.Java Package

第3步 : 创建名为"outline.feature"的要素文件

  • 选择并右键单击包大纲.

  • 点击'新'文件.

  • 提供文件名例如"outline.feature"

    • 在文件中写下以下文本并保存.

      功能 : 场景大纲

      场景大纲 : 社交网站的登录功能.

      给定用户导航到Facebook

      当我输入用户名为"< username>"时密码为"<密码>"

      然后登录失败

示例 :

| username  | password  | 
| username1 | password1 | 
| username2 | password2 |


注意 : 这里,示例注释描述了在场景执行时要提供的输入范围.将为所提供的每个输入执行测试场景.因此,在给定的示例中,测试场景将执行三次.

步骤4 : 创建步骤定义文件.

  • 选择并右键单击包装大纲.

  • 点击"新建"文件.

  • 将文件名命名为 stepdefinition.java

  • 在文件中写下以下文字并保存.

package Outline;
 
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 stepdefinition { 
   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(); 
   }    
}


注意 : 在上面的代码中,我们必须定义一个具有两个输入参数的函数:一个用户名,另一个用于密码.因此,对于示例标记中提供的每组输入,将执行Set of GIVEN,WHEN和THEN.

步骤5 : 创建一个跑步者类文件.

  • 选择并右键单击包大纲.

  • 点击"新建"文件.

  • 提供文件名,例如 runTest.java

  • 在文件中写下以下文字并保存.

package Outline; 

import org.junit.runner.RunWith; 
import cucumber.junit.Cucumber; 

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"})

public class runTest { }


  • 使用选项 :

    $ b $运行测试b

    • 从包资源管理器中选择 runTest.java 文件.

    • 右键单击并选择选项'运行为'.

    • 选择JUnit测试.

运行此类文件时,您将观察到以下内容

  • Facebook在新的Firefox网络浏览器实例中打开.

  • 用户名1和密码1将作为用户名和密码字段的输入传递.

  • 点击登录.

  • 关于登录失败,浏览器上将显示消息.

  • 在控制台中,您将看到"Test Pass"已打印.

  • 步骤结果1到5将是为username2和password2重新执行.

简而言之,当方案没有改变但只改变了数据值时,建议使用场景大纲数据表.