赵佳乐SMILE 发表于 2015-3-3 16:03:37

【佳乐Selenium】DAY-8 分层


加班什么的最无聊了,尤其是形式主义的加班~~

反正闲着 就补补小日记吧

其实这个工作用了2天,而且是整整的两天

在做了2个模块 就感觉到必须要分层啦

小何老师给我讲了一下 要分
Test层:存放测试脚本
Page层:存放测试页面
Tools层:存放其他辅助测试的 (暂不考虑)
Logic层:逻辑脚本

这个过程很痛苦,有多苦只有自己能知道

业务场景:登录-申请任务-查询任务-选择任务-审核任务-退出

改善前:
一、页面和逻辑杂在一起
二、写了1个大方法 testng跑出来的结果只有一个,并不是按着上面的几个环节,逐个环节判断测试结果
三、每个class都传入driver参数,其实driver只用一次

改善后:
一、先把WebElement 声明出来 下面在调用,如果页面变动 只需维护上面的部分 不用从逻辑代码里找需要修改哪里
二、重构脚本 复用了链接里面的父类Page和父类TestCase
TestCase 根据需要进行调整

      public static void setDriver(){

            /* 设定 chrome webdirver 的位置 */
            System.setProperty("webdriver.chrome.driver", "C:/chromedriver.exe");

            /* 启动 chrome 浏览器 */
            driver = new ChromeDriver();

            /* 浏览器最大化 */
            driver.manage().window().maximize();
      }

还要理解一下testNG的执行顺序
在TestNG里面 使用 dependsOnMethods


三、终于明白static 的意思了 之前背书的时候死记着 用static关键字声明的,那么属于类的属性和方法永远只在内存中存在一份,
实际用了才知道因为没加static导致driver的空指针问题,这辈子都记住了

http://www.myext.cn/other/a_20273.html


贴一小段的代码

====================为每一个页面做一个Page====================

/**
*首页
*/
public class HomePage extends Page {
/**
*URL常量,很少用到,一般在起始页用,有时放到配置文件里去统一管理
*/
private static final String URL="http://*";


public HomePage init(){
    DriverManager.getDriver().get(URL);
    return this;
}

//用户名
@FindBy(name="j_username")
private WebElement yonghuming;
//密码
@FindBy(name="j_password")
private WebElement mima;

//登录按钮
@FindBy(xpath="//*[@id='form1']/div/button")
private WebElement denglu;


public void login (String username,String password)

{
    //用户名
    yonghuming.sendKeys(username);

    //密码
    mima.sendKeys(password);

    //登录按钮
    denglu.click();
}


//注销按钮
@FindBy(className="logout")
private WebElement logout;

public void logout(){

    //注销
    logout.click();   

    DriverManager.quitDriver();

}

}
====================testNG====================

public class testApplyTask extends TestCase{

    @Test
    public void login() {

      HomePage home = new HomePage();      
      home.init();
      home.login("用户名","密码");
    }

    @Test(dependsOnMethods = { "login" })
    public void applyTask() {

      ApplyTaskPage action=new ApplyTaskPage();      
      action.ApplyTask(“任务名称”);      
    }
}
====================testNG XML====================


<test name="testApplyTask" preserve-order="true">
    <classes>
      <class name="com.testNG.testApplyTask"/>
         <methods>
            <include name="login" />
            <include name="applyTask" />
            <include name="logout" />

            </methods>
    </classes>
</test>





Myayiba 发表于 2015-3-13 08:23:01

请问 Logic层:逻辑脚本 这里的逻辑脚本指的是什么? 或者说逻辑脚本与Test层的测试脚本有什么不同

bayer04 发表于 2018-8-10 10:12:54

整体的学习思路目前看起来是对的,不过关于分层的描述还是太粗略,建议跟我一样的初学者们参考这篇资料:
Page Factory Based Selenium Automation Framework
https://www.codeproject.com/Articles/1006514/Page-Factory-Based-Selenium-Automation-Framework
页: [1]
查看完整版本: 【佳乐Selenium】DAY-8 分层