对基于testng的框架进行测试用例清理的最佳方法

时间:2019-06-17 15:06:05

标签: java testng

我正在使用硒Web驱动程序,testng和Java构建测试框架。在进行框架POC时,我遇到了一个问题。我想在每个测试用例之后执行一些代码,这会将应用程序删除/重置为基本状态。每个测试用例的清理代码可能不同。

假设我有两个名为A和B的模块。在模块A中,我有3个测试用例Test1,test2和Test3。我想为每个测试用例(Test1,Test2和Test3)运行清理。每个测试用例的清理代码可能不同。因此,使用@AfterMethod批注无法解决我的问题。

那么我该如何设计测试类结构?

我已经尝试过以下方法。

方法1:

@Test
public void test1() {
    try {
        System.out.println("test1");
    } catch(Exception e) {
        System.out.println(e);
        takescreenshot();
    } finally {
        System.out.println("clean up for test1");
    }

}

缺点: 1)在每个测试用例中,我都需要遵循一些定义的结构 2)代码重复。 3)如果finally块中发生任何错误,testNG报告将吞下原始错误,并显示在finally块中发生的错误,这是不好的。

方法2: 为每个测试用例创建一个测试类

public class Test2 {

    @BeforeMethod()
    public void preCondition() {
        System.out.println("pre condition");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }

    @AfterMethod()
    public void postCondition() {
        System.out.println("post condition");
    }

}

缺点: 1)需要创建多个类,这是一项开销。 2)测试用例之间没有共享变量(即在两个测试用例中使用变量'var1'可能很困难,因为它们属于不同的类)

方法3: 将模块分为子模块/粒度级别,并结合使用常规清理的测试用例。     @测试     公共无效test2(){         System.out.println(“使用名称创建数据库”);     }

@Test
public void test3() {
    System.out.println("create DB with ID");
}

@AfterMethod
public void tearDown() {
    System.out.println("Delete DB");
}

缺点: 1)不可能每次都拆分为子模块。测试人员在向任何模块添加新的测试用例时需要仔细考虑,以考虑它属于哪个子模块

哪种方法更好?您目前关注的其他结构/方法是什么?

有没有设计测试课程的最佳实践?

2 个答案:

答案 0 :(得分:0)

创建一个单独的类,其中包含执行不同清理任务的所有方法。在测试方法的finally块中相应地调用这些方法。通过这种方式,您可以避免上面提到的所有弊端。

答案 1 :(得分:0)

如果您希望能够清理测试用例,我最好的例子是使用 AfterSuite 或 AfterClass 注释。通过这种方式,您可以让测试类代表功能或测试区域,并且在此测试类中,您可以进行多个测试,这些测试都在测试此功能/测试区域的各个部分。

可以在每个测试类中定义 AfterClass 注释,它可以使用全局变量来保存您希望清理的数据。然后,您可以拥有一个包含各种不同方法的清理类来帮助您清理数据。调用 AfterClass 方法中清理类的方法,同时为它提供适当的变量。

AfterSuite 将是相同的概念在此级别执行,您将清理在整个套件运行期间生成的每个数据。 IMO 不是最理想的,我通常在 Afterclass 中清理。

这里以一些 puesdo 代码为例

测试类:

private AccountUser accountUser;

@AfterClass
public cleanUpAccountUsers() throws Exception {
accountUser.delete();

// or if you have a class that holds a delete functionality for an accountUser then

DataUtils.cleanUpAccountUsers(accountUser);
}

@Test()
public void createAccountUser() {
accountUser = new AccountUser();
// blah blah code for testing account user creation
}

@Test()
public void updateAccountUserInformation() {
// blah blah code to test updating account user information
}

对于上面的示例,您的测试现在可以在一个测试中创建数据,并且现在可以在另一个测试中访问。使用此类完成测试运行后,将执行 AfterClass,您现在可以清理在此测试中生成的数据。