我正在使用硒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)不可能每次都拆分为子模块。测试人员在向任何模块添加新的测试用例时需要仔细考虑,以考虑它属于哪个子模块
哪种方法更好?您目前关注的其他结构/方法是什么?
有没有设计测试课程的最佳实践?
答案 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,您现在可以清理在此测试中生成的数据。