Web自动化测试

霍格沃兹测试开发学社 ceshiren.com

目录

  • PageObject设计思想
  • 企业微信用例梳理
  • PO自动化测试实战演练

PageObject设计思想

为什么需要PageObject设计模式

一个添加成员的步骤:

  1. 登录_login页面
  2. 登录后进入首页_main页面
  3. 点击添加成员_main页面
  4. 填写添加信息_add_member页面
  5. 点击保存_add_member页面
  6. 返回通讯录_add_membe页面
  7. 加断言做验证_contact页面

传统的web测试用例

def test_add_member(self):
   self.driver.get(“https://work.weixin.qq.com/wework_admin/frame#index")
   element_locator = (By.LINK_TEXT, “添加成员")
    WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(element_locator))
    self.driver.find_element(*element_locator).click()
    self.driver.find_element(By.NAME, 'username').send_keys("abc")
    self.driver.find_element(By.NAME, 'english_name').send_keys("abc")
    self.driver.find_element(By.NAME, "acctid").send_keys("abc")
    self.driver.find_element(By.CSS_SELECTOR, '.ww_telInput_zipCode_input input').click()
    self.driver.find_element(By.CSS_SELECTOR, 'li[data-value="853"]').click()
   assert...

如果需要多添加一个步骤

从首页->通讯录->添加成员应该怎么改

  1. 登录_login页面
  2. 进入首页_main页面
  3. 点击通讯录_main页面
  4. 点击添加成员_contact页面
  5. 填写添加信息_add_member页面
  6. 点击保存_add_member页面
  7. 返回通讯录_add_member页面
  8. 加断言做验证_contact页面

传统的web测试用例

对应的自动化测试代码

def test_add_member(self):
   self.driver.get(“https://work.weixin.qq.com/wework_admin/frame#index")
   element_locator = (By.LINK_TEXT, “添加成员")
    WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(element_locator))
    self.driver.find_element(*element_locator).click()
    self.driver.find_element(By.NAME, 'username').send_keys("abc")
    self.driver.find_element(By.NAME, 'english_name').send_keys("abc")
    self.driver.find_element(By.NAME, "acctid").send_keys("abc")
    self.driver.find_element(By.CSS_SELECTOR, '.ww_telInput_zipCode_input input').click()
    self.driver.find_element(By.CSS_SELECTOR, 'li[data-value="853"]').click()
   assert...

传统UI自动化测试用例的问题

  • 无法适应UI变化,UI变化会导致大量的case需要修改
  • 无法清晰表达业务用例场景
  • 大量的样板代码driver find click

PageObject原理以及六大原则

PO设计思想

设计思想

PO六大原则

一定要活学活用,不要死搬硬套 六大原则

原则解读

  • 方法意义
    • 用公共方法代表UI所提供的功能
    • 方法应该返回其他的PageObject或者返回用于断言的数据
    • 同样的行为不同的结果可以建模为不同的方法
    • 不要在方法内加断言
  • 字段意义
    • 不要暴露页面内部的元素给外部
    • 不需要建模UI内的所有元素

实战练习思路

@startmindmap
* HowToDo
** 梳理测试用例
** 构造PO模型
*** 构造页面相关类和方法
*** 实现暂时实际为空
** 编写测试用例
*** 根据业务逻辑编写
*** 链式调用
** 填充具体实现
** 优化用例
*** 封装样板代码
*** 提取页面元素
*** 添加起始页的url
@endmindmap

实战练习-时序图梳理用例

实战练习-添加成员时序图

@startuml
autonumber
participant 企业微信主页面 as main

participant 通讯录页面 as contact

participant 添加成员页面 as add_member

main -> contact: 点击通讯录

main -> add_member: 点击添加成员

contact -> add_member: 点击添加成员

add_member -> contact: 填写成员资料, 点击保存

contact -> contact: 获取成员列表断言
@enduml

实战练习-构造PO模型

  • 构造页面相关类和方法
    • 黄色的方块代表一个类
    • 每条线代表这个页面提供的方法
    • 箭头的始端为开始页面
    • 箭头的末端为跳转页面
  • 实现暂时实际为空

实战练习-编写测试用例

  • 根据业务逻辑编写,添加断言
  • 通过链式调用更加方便描述业务逻辑

实战练习-填充具体实现

实战练习-优化用例类图

实战练习-构造PO模型类图

@startuml

class BasePage{
    _url = null
    finds()
    find()
}

class MainPage{
    str element1
    goto_contact()
    goto_add_member()
}
class ContactPage{
    str element1
    ~ goto_add_member()
    ~ get_list()
}

class AddMemberPage{
    str element1
    ~ add_member()
    ~ add_member_fail()
}

BasePage<|-- MainPage: 继承
BasePage<|-- ContactPage: 继承
BasePage<|-- AddMemberPage: 继承

@enduml


实战练习-优化用例

  1. basepage封装
  2. 添加失败用例检测
  3. 提取页面元素
  4. 封装样板代码
  5. 添加起始页的url