TestNG 中测试的可重用性
Reusability of tests in TestNG
我想 运行 一些自动化测试来测试处理流程工作流的 Web 应用程序。
为了与应用程序本身进行交互,我已经编写了一个页面对象模型,它利用 Selenium WebDriver 与应用程序的多个组件进行交互。
现在我要编写一些测试,这些测试应该允许我 运行 为特定应用程序进行一些自动化测试。作为测试框架,我想使用 TestNG。
但是由于被测应用是工作流应用,我发现我总是需要先完成流程的某个部分,然后再进行测试。
示例测试用例 1:将 activity 添加到档案中的特定任务
- 登录应用程序
- 打开档案 x
- 在档案 x 中打开任务 y
- 将 activity z 添加到档案 x
中的任务 y
示例测试用例 2:在档案
的任务中添加针对某个 activity 的计划
- 登录应用程序
- 打开档案 x
- 在档案 x 中打开任务 y
- 将 activity z 添加到档案 x
中的任务 y
- 添加activityz
的规划
因此,正如您从上面的示例中看到的,在进行实际测试之前,我总是需要自己完成一定数量的类似步骤。
作为我自己的起点,我开始编写 TestNG classes。一个用于测试用例 1,第二个用于测试用例 2。然后,在每个测试中 class 我实现了许多与测试步骤相对应的测试方法。
请参阅下面的测试用例 1 示例代码:
public class Test_Add_Activity_To_Task_In_Dossier extends BaseTestWeb {
private Dossier d;
private Task t;
@Test
public void login() {
System.out.println("Test step: login");
}
@Test(dependsOnMethods = "login")
public void open_dossier() {
System.out.println("Test step: open dossier");
}
@Test(dependsOnMethods = "open_dossier")
public void open_task() {
System.out.println("Test step: open task");
}
@Test(dependsOnMethods = "open_task")
public void add_activity() {
System.out.println("Test step: add activity");
}
}
这里是测试用例 2 的示例代码:
public class Test_Add_Planning_For_Activity_To_Task_In_Dossier extends BaseTestWeb {
private Dossier d;
private Task t;
@Test
public void login() {
System.out.println("Test step: login");
}
@Test(dependsOnMethods = "login")
public void open_dossier() {
System.out.println("Test step: open dossier");
}
@Test(dependsOnMethods = "open_dossier")
public void open_task() {
System.out.println("Test step: open task");
}
@Test(dependsOnMethods = "open_task")
public void add_activity() {
System.out.println("Test step: add activity");
}
@Test(dependsOnMethods = "add_activity")
public void add_planning() {
System.out.println("Test step: add planning");
}
}
所以你已经注意到,随着要编写的测试用例数量的增加,这种测试结构是不可维护的,因为我现在总是在到达要完成的实际测试之前先重复相同的步骤...
因此我想在这里向社区询问如何才能使所有内容更具可重用性并避免在每个测试用例中一遍又一遍地编写重复步骤
欢迎所有想法!!
我有一个类似的环境,我需要拥有处于正确状态的帐户才能开始我的测试。我制作了一个名为 accelerators 的程序包并打开了一些基于 classes 的进程以将帐户从一个进程移动到另一个进程以使它们处于正确的状态。我的建议是不要将 @Test 注释放在加速器的方法之上。但是要在实际测试中调用那些加速器 classes 和方法。
如果您有更多问题,请随时提出。
所以我编辑了我的答案,因为我不能 post 长评论大声笑我在这里很新。
@Hans Mens 所以我所做的是我创建了 class 和方法作为进程如何作为加速器。在 @BeforeTest 注释中,我调用了我在测试中使用的所有加速器 classes。然后我从 class 扩展了我的测试方法 classes,其中 @BeforeTest 注释 is.That 方式我可以使用我在 @BeforeTest 中调用的所有对象,而无需在测试中调用它们 classes 这样我的测试脚本就干净了。
正如您所提到的,您正在使用页面对象模型。所以我假设您可能已经通过创建一个单独的 class.
为每个页面编写了对象存储库及其操作
因此,在编写测试时,只需从 POM class 调用这些方法即可。例如你的情况:
测试用例 1:
public class Test_Add_Activity_To_Task_In_Dossier extends BaseTestWeb {@Test
public void add_activity() {
//To call below methods , please create object of the classes they belong to .
login();
open_dossier();
open_task();
System.out.println("Test step: add activity");
}
}
测试用例 2:
public class Test_Add_Planning_For_Activity_To_Task_In_Dossier extends BaseTestWeb {
@Test
public void add_planning() {
//To call below methods , please create object of the classes they belong to .
login();
open_dossier();
open_task();
System.out.println("Test step: add planning");
}
}
希望对您有所帮助。
据我了解,您想删除在每个测试用例之前重复做的事情,例如
Login to application
Open dossier x
Open task y within dossier x
您可以使用 @BeforeMethod
,这样它会在每个测试用例之前执行这些先决条件任务(基本上您可以保留每次测试前需要的常见任务)。
@BeforeMethod
public void setUp()
{
login();
open_dossier();
open_task();
}
测试用例 - 1
@Test
public void testAddActivity()
{
add_activity();
}
测试用例 - 2
@Test
public void testAddPlanning()
{
add_planning()
}
我想 运行 一些自动化测试来测试处理流程工作流的 Web 应用程序。
为了与应用程序本身进行交互,我已经编写了一个页面对象模型,它利用 Selenium WebDriver 与应用程序的多个组件进行交互。
现在我要编写一些测试,这些测试应该允许我 运行 为特定应用程序进行一些自动化测试。作为测试框架,我想使用 TestNG。
但是由于被测应用是工作流应用,我发现我总是需要先完成流程的某个部分,然后再进行测试。
示例测试用例 1:将 activity 添加到档案中的特定任务
- 登录应用程序
- 打开档案 x
- 在档案 x 中打开任务 y
- 将 activity z 添加到档案 x 中的任务 y
示例测试用例 2:在档案
的任务中添加针对某个 activity 的计划- 登录应用程序
- 打开档案 x
- 在档案 x 中打开任务 y
- 将 activity z 添加到档案 x 中的任务 y
- 添加activityz 的规划
因此,正如您从上面的示例中看到的,在进行实际测试之前,我总是需要自己完成一定数量的类似步骤。
作为我自己的起点,我开始编写 TestNG classes。一个用于测试用例 1,第二个用于测试用例 2。然后,在每个测试中 class 我实现了许多与测试步骤相对应的测试方法。
请参阅下面的测试用例 1 示例代码:
public class Test_Add_Activity_To_Task_In_Dossier extends BaseTestWeb {
private Dossier d;
private Task t;
@Test
public void login() {
System.out.println("Test step: login");
}
@Test(dependsOnMethods = "login")
public void open_dossier() {
System.out.println("Test step: open dossier");
}
@Test(dependsOnMethods = "open_dossier")
public void open_task() {
System.out.println("Test step: open task");
}
@Test(dependsOnMethods = "open_task")
public void add_activity() {
System.out.println("Test step: add activity");
}
}
这里是测试用例 2 的示例代码:
public class Test_Add_Planning_For_Activity_To_Task_In_Dossier extends BaseTestWeb {
private Dossier d;
private Task t;
@Test
public void login() {
System.out.println("Test step: login");
}
@Test(dependsOnMethods = "login")
public void open_dossier() {
System.out.println("Test step: open dossier");
}
@Test(dependsOnMethods = "open_dossier")
public void open_task() {
System.out.println("Test step: open task");
}
@Test(dependsOnMethods = "open_task")
public void add_activity() {
System.out.println("Test step: add activity");
}
@Test(dependsOnMethods = "add_activity")
public void add_planning() {
System.out.println("Test step: add planning");
}
}
所以你已经注意到,随着要编写的测试用例数量的增加,这种测试结构是不可维护的,因为我现在总是在到达要完成的实际测试之前先重复相同的步骤...
因此我想在这里向社区询问如何才能使所有内容更具可重用性并避免在每个测试用例中一遍又一遍地编写重复步骤
欢迎所有想法!!
我有一个类似的环境,我需要拥有处于正确状态的帐户才能开始我的测试。我制作了一个名为 accelerators 的程序包并打开了一些基于 classes 的进程以将帐户从一个进程移动到另一个进程以使它们处于正确的状态。我的建议是不要将 @Test 注释放在加速器的方法之上。但是要在实际测试中调用那些加速器 classes 和方法。
如果您有更多问题,请随时提出。
所以我编辑了我的答案,因为我不能 post 长评论大声笑我在这里很新。
@Hans Mens 所以我所做的是我创建了 class 和方法作为进程如何作为加速器。在 @BeforeTest 注释中,我调用了我在测试中使用的所有加速器 classes。然后我从 class 扩展了我的测试方法 classes,其中 @BeforeTest 注释 is.That 方式我可以使用我在 @BeforeTest 中调用的所有对象,而无需在测试中调用它们 classes 这样我的测试脚本就干净了。
正如您所提到的,您正在使用页面对象模型。所以我假设您可能已经通过创建一个单独的 class.
为每个页面编写了对象存储库及其操作
因此,在编写测试时,只需从 POM class 调用这些方法即可。例如你的情况:
测试用例 1:
public class Test_Add_Activity_To_Task_In_Dossier extends BaseTestWeb {@Test
public void add_activity() {
//To call below methods , please create object of the classes they belong to .
login();
open_dossier();
open_task();
System.out.println("Test step: add activity");
}
}
测试用例 2:
public class Test_Add_Planning_For_Activity_To_Task_In_Dossier extends BaseTestWeb {
@Test
public void add_planning() {
//To call below methods , please create object of the classes they belong to .
login();
open_dossier();
open_task();
System.out.println("Test step: add planning");
}
}
希望对您有所帮助。
据我了解,您想删除在每个测试用例之前重复做的事情,例如
Login to application
Open dossier x
Open task y within dossier x
您可以使用 @BeforeMethod
,这样它会在每个测试用例之前执行这些先决条件任务(基本上您可以保留每次测试前需要的常见任务)。
@BeforeMethod
public void setUp()
{
login();
open_dossier();
open_task();
}
测试用例 - 1
@Test
public void testAddActivity()
{
add_activity();
}
测试用例 - 2
@Test
public void testAddPlanning()
{
add_planning()
}