当前位置: 首页 > 知识库问答 >
问题:

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

宋涵衍
2023-03-14

我正在使用selenium 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)如果最终块中发生任何错误,testNG报告将吞下原始错误并显示发生在最终块中的错误,这是不好的。

方法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:将模块划分为子模块/粒度级别,并合并使用公共清理的测试用例@Test public void 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个答案

鞠子轩
2023-03-14

如果您想能够清理您的测试用例,我最好的例子是使用AfterSuite或AfterClass注释。这样,您可以让测试类代表功能或测试区域,并且在这个测试类中,您可以有多个测试,它们都在测试这个功能/测试区域的各个部分。

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

AfterSuite将在这个级别执行相同的概念,您将清理整个套件运行期间生成的每一个数据。我不是最理想的,我通常会在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,您现在可以清理在该测试中生成的数据。

逄征
2023-03-14

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

 类似资料:
  • 问题内容: 使用EJB 3 / JPA开始一个新项目,主要是无状态会话Bean和批处理作业。我过去在标准Java Web应用程序上使用过JUnit,它似乎运行得很好。在EJB2中,单元测试很麻烦,需要一个运行中的容器(如JBoss)进行调用。现在我们将在EJB3 / JPA中工作,我想知道公司正在使用什么来编写和运行这些测试。是否仍然认为Junit和JMock具有相关性,或者还有其他较新的框架值得

  • 本文向大家介绍java测试框架的方法,包括了java测试框架的方法的使用技巧和注意事项,需要的朋友参考一下 项目开发过程中使用的单元测试框架有Junit、TestNG以及Mockito,Junit和TestNG使用的比较多,Mockito最近才开始使用。 TestNG与JUnit的相同点 1. 使用annotation,且大部分annotation相同。 2. 都可以进行单元测试(Unit tes

  • WebUI automation testing framework based on Selenium 介绍: pyse基于selenium(webdriver)进行了简单的二次封装,比selenium提供的方法操作更简洁。 起因:   python + selenium 自动化测试写久了发现selenium(webdriver)提供原生的方法并简便,于是,产生了二次封装的想法。想不到太炫酷的名

  • 问题内容: 有人可以帮我这个忙。我正在使用Jersey休息测试框架版本2.21(在Grizzly容器上)编写Rest资源的单元测试。 当我调试测试类时,看到myManager的模拟对象。但是,当调试进入“ MyResouce类”时,myManager对象将变为null并得到NullPointer异常。 尝试过其他人提供的解决方案,但是没有运气。请有人帮我。我将近三天就遇到这个问题。:( 我的资源类

  • 我正在构建一个网络项目,它使用Maven进行构建,并使用泽西进行RESTful API。我使用TestNG和泽西测试框架编写了单元测试,并在内存中运行它们,而不是在网络服务器上。 在我的测试中,我对MySQL数据库进行了JDBC调用,并得到了一些结果。当我使用TestNG for Eclipse插件从Eclipse内部运行时,测试运行良好。但是,当我尝试使用以下两个命令之一从Maven运行时: 或