【问题标题】:What is the good way of writing Cucumber Framework写黄瓜框架的好方法是什么
【发布时间】:2020-06-04 14:03:50
【问题描述】:

我是Cucumber的新手,我正在设计框架。写框架的好方法是什么。

到目前为止,我已经设计了这样的框架(页面对象模型)

Feature File
Given User is on home screen

Step Definition file
@Given("^User is on home screen$")
public void User_is_on_home_screen(String Username,String Pwd)
{
     lp.enterDetails(Username,Pwd)
}

Page related java files (Includes all Methods by page wise,which is called by respective step definition files).    
public class login{
/**
Locators
**/
public void enterDetails(String Username,String Pwd){      
/**
steps
**/
}

我的问题是我们能否在相应的页面定义文件中包含这些方法,而不是创建单独的 java 文件并将所有页面定位器存储在一个 java 文件中

Feature File
Given User is on home screen

Step Definition file
@Given("^User is on home screen$")
public void User_is_on_home_screen(String Username,String Pwd)
{
 public void enterDetails(String Username,String Pwd){      
/**
steps
**/ 
}

Page Locators java file (Includes all page locators
public class Locators{
     /**
  All Locators
**/
}

哪一个是标准和高效的?

【问题讨论】:

    标签: java selenium frameworks cucumber


    【解决方案1】:

    是的,您可以在黄瓜中使用依赖注入,并使用依赖向您的步骤定义注入页面对象类

            <dependency>
                <groupId>info.cukes</groupId>
                <artifactId>cucumber-core</artifactId>
                <version>${cucumber.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>info.cukes</groupId>
                <artifactId>cucumber-java</artifactId>
                <version>${cucumber.version}</version>
                <scope>test</scope>
            </dependency>
    

    看起来像这样:

    public class BaseStep {
    
        private DeviceServiceImpl deviceService;
        private DashboardScreen dashboardScreen;
        public BaseStep() {
            this.deviceService = new DeviceServiceImpl(Hooks.driver);
            this.dashboardScreen = new DashboardScreen(Hooks.driver);
        }
    
        @Then("^I install application$")
        public void iInstallApplication() {
            dashboardScreen.scroll();
        }
    
        @Given("^I enable all network activity$")
        public void iEnableAllNetworkActivity() {
    
        }
    }
    

    在那段时间你已经找到了页面上的所有元素:

    /**
     * @author Tomash Gombosh
     */
    public class DashboardScreen extends AbstractScreen {
        private static final AppElement SIGN_IN_BUTTON = new AppElement(
                "Sign in button",
                By.id(String.format("%s:%s", ApplicationProperties.ANDROID_APP_PACKAGE, "id/right_link")),
                ScrollTo.NO,
                true);
        private static final AppElement SIGN_UP_BUTTON = new AppElement(
                "Sign Up Button",
                By.id(String.format("%s:%s", ApplicationProperties.ANDROID_APP_PACKAGE, "id/sign_button")),
                ScrollTo.NO,
                true);
    
        public DashboardScreen(final AppiumDriver<MobileElement> driver) {
            super(driver);
        }
    
        @Override
        public boolean isDisplayed() {
            waitToBeVisible(SIGN_IN_BUTTON);
            scrollService.scrollDown();
            return allRequiredElementDisplayed();
        }
    
        public void tapLogin() {
            isDisplayed();
            tap(SIGN_IN_BUTTON);
        }
    
        public void tapSignIn() {
            tap(SIGN_UP_BUTTON);
        }
    
        public void scroll() {
            scrollService.scrollDown();
        }
    }
    
    

    这对您有帮助吗?还是需要更多解释?

    【讨论】:

    • 是的,我已经做了一些。但我的问题是哪种方式更容易维护代码,哪种方式更标准。我在我的问题中提到了两种编写代码的方式。
    • 第一个带有测试方法的将更具可维护性,因为您拥有独立的应用程序逻辑和测试逻辑。并且只在步骤定义中重用它的方法。因为某些步骤定义可以使用页面对象类中的 3-4 种方法。如果你将它写在步骤定义中,你将拥有一个庞大且难以维护的类。
    猜你喜欢
    • 2012-03-10
    • 2016-10-14
    • 2021-12-07
    • 1970-01-01
    • 2018-06-27
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多