我正在使用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)不可能每次都拆分到子模块。测试人员在向任何模块添加新的测试用例时,需要仔细考虑它属于哪个子模块
哪种方法会更好?您目前遵循的任何不同结构/方法?
设计测试类的最佳实践?
如果您想能够清理您的测试用例,我最好的例子是使用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,您现在可以清理在该测试中生成的数据。
创建一个单独的类,其中包含执行不同清理任务的所有方法。在测试方法的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运行时: 或