gpt4 book ai didi

java - 如何扩展具有参数化@BeforeMethod 的类

转载 作者:行者123 更新时间:2023-12-04 10:57:48 26 4
gpt4 key购买 nike

我要延期基类 来自所有测试用例类。
对于某些测试用例,我想使用管理员凭据登录,而对于某些测试用例,我想使用客户登录。

以前此代码运行正常,因为 launchBrowserAndLogin() 方法没有任何参数。

有没有办法用参数扩展类?

这是我的代码:

public class BaseClass {

public BaseClass() {
}

@BeforeMethod
public void launchBrowserAndLogin(String userType) {
if(userType.equals("Admin")) {
launchBrowserAndUrl(Constants.ADMIN_URL);
login(Constants.ADMIN_USER_NAME, Constants.ADMIN_USER_PASSWORD);
}
if(userType.equals("Customer")) {
launchBrowserAndUrl(Constants.CUSTOMER_TEST_URL);
login(Constants.CUSTOMER_USER_NAME, Constants.CUSTOMER_USER_PASSWORD);
}
}

@AfterMethod
public void tearDown() {
TestDriver.getDriver().quit();
}
}


public class AssignEditDeleteRoleAccessibilityTest extends BaseClass {

CreateUser newUser = new CreateUser();
RoleAssignmentAccessValidation roleAccessValidation = new RoleAssignmentAccessValidation();

@DataProvider(name = "AssignEditDeleteRoleAccessibilityTest")
public static Object[] roleNames() {
return new Object[] {Constants.AGENCY_ASSISTANT_ROLE_NAME, Constants.OPS_MANAGER_ROLE_NAME};
}

@Test ( priority=1, dataProvider = "AssignEditDeleteRoleAccessibilityTest")
public void assignRoleAccessTest(String roleName) {

newUser.createUserAssignRoleAndLogin(roleName);

boolean isAssignRoleOptionAvailable =roleAccessValidation.assignRoleAccess();

assertEquals(isAssignRoleOptionAvailable, false);
}
}

现在我收到错误:

FAILED CONFIGURATION: @BeforeMethod launchBrowserAndLogin org.testng.TestNGException: Can inject only one of <ITestContext, XmlTest, Method, Object[], ITestResult> into a @BeforeMethod annotated launchBrowserAndLogin.

最佳答案

如果这是我的代码,我会拆分 BaseClass进入 AdminClassCustomerClass -- 这既可以解决问题,也有助于更好地组织测试,因为现在您将知道被测场景是否为 CustomerAdmin基于测试用例类扩展的类的 View :

public class CustomerClass {

public CustomerClass() {
}

@BeforeMethod
public void launchBrowserAndLogin() {
launchBrowserAndUrl(Constants.CUSTOMER_TEST_URL);
login(Constants.CUSTOMER_USER_NAME, Constants.CUSTOMER_USER_PASSWORD);
}

@AfterMethod
public void tearDown() {
TestDriver.getDriver().quit();
}
}

和管理类:
public class AdminClass{

public AdminClass() {
}

@BeforeMethod
public void launchBrowserAndLogin() {
launchBrowserAndUrl(Constants.ADMIN_URL);
login(Constants.ADMIN_USER_NAME, Constants.ADMIN_USER_PASSWORD);
}

@AfterMethod
public void tearDown() {
TestDriver.getDriver().quit();
}
}

然后,您的测试用例类可能如下所示:
public class AssignEditDeleteRoleAccessibilityTest extends CustomerClass{ // or AdminClass

CreateUser newUser = new CreateUser();
RoleAssignmentAccessValidation roleAccessValidation = new RoleAssignmentAccessValidation();

@DataProvider(name = "AssignEditDeleteRoleAccessibilityTest")
public static Object[] roleNames() {
return new Object[] {Constants.AGENCY_ASSISTANT_ROLE_NAME, Constants.OPS_MANAGER_ROLE_NAME};
}

@Test ( priority=1, dataProvider = "AssignEditDeleteRoleAccessibilityTest")
public void assignRoleAccessTest(String roleName) {

newUser.createUserAssignRoleAndLogin(roleName);

boolean isAssignRoleOptionAvailable =roleAccessValidation.assignRoleAccess();

assertEquals(isAssignRoleOptionAvailable, false);
}
}

这将解决您的错误,但我承认这也是个人意见和个人设计偏好的问题—— test fixture 的概念(这就是 BaseClass/ AdminClass/ CustomerClass 各自代表的内容)可以以多种不同的方式实现。我个人认为,在组织和可维护性方面,为每个“开始”场景设置一个固定装置会更好——如果 AdminClass变得更加复杂,此代码将从 CustomerClass 中排除。 .

另一种选择是保留 BaseClass ,但删除 @BeforeMethodlaunchBrowserAndLogin()方法。然后,你可以写 CustomerClassAdminClass延长 BaseClass (以便 @AfterMethod 被继承)。然后, CustomerClassAdminClass()可以实现自己的版本 launchBrowserAndLogin() ,并且测试用例类看起来仍与此示例相同。

还有其他方法可以解决这个问题,这只是个人在设计和可维护性方面的偏好问题。

即使这不是您的首选答案,但希望这至少可以为您提供一种用于 future 思考的替代方法。

关于java - 如何扩展具有参数化@BeforeMethod 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59074219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com