如何扩展已参数化@BeforeMethod的类

问题描述 投票:1回答:1

我想从所有测试用例类扩展BaseClass。对于某些测试用例,我想使用管理员凭据登录,对于某些用例,我要使用客户登录。

以前,此代码正常运行,因为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);
    }
}

现在我遇到错误:失败的配置:@BeforeMethod launchBrowserAndLoginorg.testng.TestNGException:只能将其中之一注入@BeforeMethod注释的launchBrowserAndLogin。

java selenium automation testng
1个回答
0
投票

[我认为您应该将BaseClass分成AdminClassCustomerClass之类的东西-这既可以解决您的问题,也可以帮助您更好地组织测试,因为现在您将知道该情况受测的是CustomerAdmin视图:

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并存。

即使这不是您的首选答案,也希望这至少为您提供了另一种思考未来的方法。

© www.soinside.com 2019 - 2024. All rights reserved.