创建泛型和测试套件
泛型
根据字面概念,通用词可以作为整个组或类的描述。
在自动化应用程序时,我们会遇到各种端到端场景。端到端场景可能由几个简单的功能组成。因此,这些功能中的许多功能只需稍加修改或几乎无需修改即可作为多个测试脚本的通用功能。
因此,建议创建一个通用类,其中包含可以声称为通用并可以在多个测试脚本之间共享的方法,而不是为多个测试脚本一遍又一遍地实现相同的代码。
请注意,泛型还在我们的框架中引入了可重用性功能。可重用性大大减少了代码、错误、缺陷、维护等所花费的时间。
泛型类型
#1)特定于应用程序
被测应用程序的微不足道的功能可以成为特定于应用程序的泛型的一部分。以登录功能为例。登录就是这样一种功能,它可以成为几乎所有测试脚本的片段。因此,我们不必在测试脚本中重新编写登录代码,而是在泛型类中创建一个通用方法并在需要时调用它。
#2)特定于框架
除了特定于应用程序的泛型之外,我们可能还有一些通用方法,这些方法与被测应用程序没有直接关系,但属于所选框架的一部分。当我们使用测试数据驱动框架时,请考虑 Excel 读取功能。
如果我们在所有测试脚本中一遍又一遍地编写读取 Excel 的代码,那就毫无意义了。因此,我们在通用类中引入一次代码,并在需要时调用它。
通用类的创建
用户可以根据注入的模块化来创建任意数量的通用类。
让我们通过创建泛型来理解泛型的概念。
步骤 1:创建一个新的 java 类“CommonMethods.java”,它将作为一个通用类,由一些常用方法组成,最好位于测试脚本所在的包中。
步骤#2:下一步是将下面的代码复制并粘贴到“CommonMethods.java”通用类中。在这个类的外围可以实现几个常用方法。
以下是登录功能的代码片段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/**
* Login the Test application
*
* @param username
* @param password
*/
public void login(String username, String password) {
try {
// Enter User Name
WebElement userName = driver.findElement(By.id( "loginID" ));
userName.clear();
userName.sendKeys(username);
// Enter Password
WebElement passWord = driver.findElement(By.id( "Password" ));
passWord.clear();
passWord.sendKeys(password);
// Click on the Sign In Button
WebElement signin = driver.findElement(By.id( "SignIn_button" ));
signin.click();
driver.manage().window().maximize();
} catch (Exception e) {
e.printStackTrace();
}
}
|
请注意,上述方法是一种参数化方法。因此,相同的方法可以使用不同的测试数据来测试登录功能。
步骤 3:下一步是在测试脚本中调用通用方法。该过程分为两个步骤。首先,我们在测试类中创建通用类的实例,然后通过传递所需的参数来调用创建的实例中的通用方法。
在下面的代码片段中,我们创建了“TestScript1.java”类的实例,并调用login()方法来登录应用程序。
1 2 3 4 |
// Create Object of the generic class
toolsObj = new Tools();
// Login the test application by calling the common method
preTestObj.login(“username”, “password”);
|
需要注意的是,上述代码可以放在测试类中的任何位置。用户可以将代码放在setup()方法中,也可以放在test()方法中。
测试套件
测试套件是为执行目的而分组的多个测试脚本的集合。因此,测试套件可以无人值守地执行指定数量的测试脚本。测试套件可以引用要自动执行的测试脚本;用户只需为测试套件中的每个测试脚本标记一个条目即可。
该条目应该是带有“.class”扩展名的测试脚本的“类名”,或者只是我们的 Java 类的编译形式。
下面是用 Java 创建的示例测试套件。请注意,测试套件是基于 Java 的类,属于 JUnit 系列。因此,您可能会在代码中遇到多个 JUnit 注释。
代码片段
package com.axway.webliv.tests;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runner.notification.Failure;
import org.junit.runners.Suite;
import com.axway.webliv.tests.MetaData.*;
@RunWith (Suite. class )
@Suite .SuiteClasses({
ChangeStatusBinarySphereTest. class ,
ChangeStatusRestrictionTest. class ,
ChangeStatusDocSphereTest. class ,
})
public class TestSuite {
/**
* Setup method to set system properties
*/
@BeforeClass
public static void Setup() {
}
/**
* @param args
*/
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestSuite. class );
System.out.println( "TEST CASES RUN: " + result.getRunCount());
System.out.println( "TEST CASES FAILED: " + result.getFailureCount());
for (Failure failure : result.getFailures()) {
System.out.println( "\nTEST NAME: " + failure.getTestHeader());
System.out.println( "\nERROR: " + failure.getMessage() + "\n" );
System.out.println(failure.getTrace());
System.exit( 1 );
}
}
/**
* Report test results
*/
@AfterClass
public static void TearDown() {
}
}
|
代码演练
测试套件就是一个简单的 JUnit 类,它有 setup() 和 trashdown() 方法;我们在前面的教程中详细讨论了这两个方法。唯一显著的区别在于它能够一次性执行多个测试脚本。
导入语句
1 2 3 4 5 6 7 |
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runner.notification.Failure;
import org.junit.runners.Suite;
|
上述导入语句嵌入在类中,以便能够使用 JUnit 提供的各种注释。
导入 org.junit.runner.JUnitCore;
导入 org.junit.runner.RunWith;
导入 org.junit.runners.Suite;
上述语句具有执行由多个测试类组成的测试套件的底层架构。
导入 org.junit.runner.Result;
导入语句允许用户存储测试执行状态及其操作。
导入 org.junit.AfterClass;
导入 org.junit.BeforeClass;
这些 import 语句用于标识和注释 setup() 和 teadown() 方法。使用 BeforeClass 注释的 setup() 方法指示程序控制在每次测试脚本执行之前执行该方法。与 setup() 一样,使用 AfterClass 注释的 teadown() 方法指示程序控制在每次测试脚本执行之后执行该方法。
班级入口
1 2 3 4 5 6 |
@RunWith (Suite.<strong> class </strong>)
@Suite .SuiteClasses({
ChangeStatusBinarySphereTest.<strong> class </strong>,
ChangeStatusRestrictionTest.<strong> class </strong>,
ChangeStatusDocSphereTest.<strong> class </strong>,
})
|
类的这一部分允许用户标记下次运行中要执行的测试脚本条目。请记住,这些条目以“.class”扩展名标记,即以编译格式标记。
执行——main()
1 2 3 4 5 6 7 8 9 10 11 |
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestSuite.class);
System.out.println("TEST CASES RUN: " + result.getRunCount());
System.out.println("TEST CASES FAILED: " + result.getFailureCount());
for (Failure failure : result.getFailures()) {
System.out.println("\nTEST NAME: " + failure.getTestHeader());
System.out.println("\nERROR: " + failure.getMessage() + "\n");
System.out.println(failure.getTrace());
System.exit(1);
}
}
|
这部分代码处理执行。程序执行总是从 main() 开始。
JUnitCore 类的 runClasses 方法用于执行测试套件。“Result 类”及其方法用于根据通过和失败的测试用例确定执行状态。
因此,用户可以利用测试套件类进行实验以满足他/她的要求。
结论
在本教程中,我们尝试让您熟悉泛型和常用方法的概念。我们还讨论了泛型带来的好处,例如可重用性。我们还分享了创建泛型及其可访问性的实用方法。
以下是本文的关键内容:
- 泛型可以作为整个组或类的描述。在我们的框架中,泛型是一个仅由可在多个测试类之间共享的方法组成的类。
- 泛型可以分为两类:
- 特定于应用程序
- 特定于框架
- 可以创建一个简单的 Java 类来充当泛型。在泛型类中,可以实现几个常用方法。这些方法可以是参数化方法。
- 可以通过在测试脚本中调用通用类的实例来访问常用方法。
- 测试套件是为执行目的而分组的多个测试脚本的组合。因此,测试套件可以无人值守地执行指定数量的测试脚本。
- 测试套件就是一个简单的 JUnit 类,它有 setup() 和 trashdown() 方法;我们在前面的教程中详细讨论了这两个方法。唯一显著的区别在于它能够一次性执行多个测试脚本。