Bootstrap

web自动化测试-python+selenium+unitest

Web自动化测试工具

1. 主流的Web自动化测试工具
  • QTP: QTP是一个商业化的功能测试工具,收费,支持web和桌面自动化测试。
  • Selenium: Selenium是一个开源的web自动化测试工具,免费,主要做功能测试(本课学习)。
  • Robot Framework: Robot Framework是一个基于Python可扩展地关键字驱动的测试自动化框架。
2. Selenium家族史

Web自动化测试环境搭建

基于Python环境搭建
  1. Python 开发环境
  2. 安装selenium包:
    pip install selenium==3.141.0
    
  3. 安装浏览器
  4. 安装浏览器驱动: 保证能够用程序驱动浏览器,实现自动化测试(可放置在Python安装主目录或项目所在目录)。
示例:通过程序启动浏览器,并打开百度首页,暂停3秒,关闭浏览器

实现步骤:

  1. 导包:
    from selenium import webdriver
    import time
    
  2. 创建浏览器驱动对象:
    • Firefox浏览器:driver = webdriver.Firefox()
    • Chrome浏览器:driver = webdriver.Chrome()
    • Edge浏览器:driver = webdriver.Edge()
  3. 打开Web页面: driver.get("http://www.baidu.com/")
  4. 暂停: time.sleep(3)
  5. 关闭驱动对象: driver.quit()

页面元素定位

1. 如何进行元素定位?
  • HTML页面由标签构成,标签的基本格式如下:
    <tag_name attribute_name1="attribute_value1" attribute_name2="attribute_value2">text</tag_name>
    
  • 示例:
    <input id="username" type="text" name="username" placeholder="用户名" />
    <div id="my_cart">
      <span>我的购物车</span>
    </div>
    
  • 元素定位就是通过元素的信息或元素层级结构来定位元素的。
2. 元素定位方式

Selenium提供了八种定位元素方式:

  • id: element = driver.find_element_by_id(id)
  • name: element = driver.find_element_by_name(name)
  • class_name: element = driver.find_element_by_class_name(class_name)
  • tag_name: element = driver.find_element_by_tag_name(tag_name)
  • link_text: element = driver.find_element_by_link_text(link_text)
  • partial_link_text: element = driver.find_element_by_partial_link_text(partial_link_text)
  • XPath: element = driver.find_element_by_xpath(xpath)
  • CSS: element = driver.find_element_by_css_selector(css_selector)
例:id定位方式
  • id定位就是通过元素的id属性来定位元素,HTML规定id属性在整个HTML文档中必须是唯一的。
  • 前提:元素有id属性
  • id定位方法:element = driver.find_element_by_id(id)
    实现步骤:
  1. 导入selenium包: from selenium import webdriver
  2. 导入time包: import time
  3. 实例化浏览器驱动对象: driver = webdriver.Firefox()
  4. 打开登录页A.html: driver.get(url)
  5. 调用id定位方法: element = driver.find_element_by_id("")
  6. 使用send_keys()方法输入内容: element.send_keys("admin")
  7. 暂停3秒: time.sleep(3)
  8. 关闭浏览器驱动对象: driver.quit()
元素操作、浏览器操作方法

Unitest单元测试框架

什么是Unitest框架
  • 概念:UnitTest是Python自带的一个单元测试框架,用它来做单元测试。
为什么使用UnitTest框架
  1. 能够组织多个用例去执行
  2. 提供丰富的断言方法
  3. 能够生成测试报告
UnitTest核心要素
  1. TestCase
  2. TestSuite
  3. TestRunner
  4. Fixture
案例:蛋糕商城购物系统登录功能自动化测试

实现思路:

  1. 导包: import unittest
  2. 定义测试类: 新建测试类必须继承unittest.TestCase
  3. 定义测试方法: 测试方法名称命名必须以test开头
Unitest断言方法
序号断言方法断言描述
1assertTrue(expr, msg=None)验证expr是true,如果为false,则fail
2assertFalse(expr, msg=None)验证expr是false,如果为true,则fail
3assertEqual(expected, actual, msg=None)验证expected==actual,不等则fail 【掌握】
4assertNotEqual(first, second, msg=None)验证first != second, 相等则fail
5assertIsNone(obj, msg=None)验证obj是None,不是则fail
6assertIsNotNone(obj, msg=None)验证obj不是None,是则fail
7assertIn(member, container, msg=None)验证是否member in container【掌握】
8assertNotIn(member, container, msg=None)验证是否member not in container

生成HTML测试报告

  • HTMLTestReport: UnitTest框架本身不支持生成HTML格式的测试报告,网上有很多类库都可以实现,基本用法都类似,只是生成的HTML报告样式有差别。
  • HTML测试报告生成步骤:
    1. 导包: from htmltestreport import HTMLTestReport
    2. 封装测试套件
    3. 实例化HTMLTestReport对象
    4. 执行测试套件: report.run(suite)

实验

实验目的:
  1. 了解什么是自动化测试及其适用范围。
  2. 掌握使用Selenium进行Web自动化测试的流程和方法。
  3. 自动化测试脚本的编写。
实验环境
  1. Windows操作系统环境;
  2. Python编程环境或Java编程环境;
  3. Selenium自动化测试工具。
实验准备
  1. 准备好Python编程环境或Java编程环境配置;
  2. 安装好Selenium工具。
实验内容
(1)实验脚本示例

以下是使用Python和Selenium完成网上蛋糕商城购物系统登录的脚本示例:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 打开浏览器
driver = webdriver.Chrome()

# 打开商城首页
driver.get("http://www.dangpu.com")

# 定位登录链接并点击
login_link = driver.find_element_by_link_text("登录")
login_link.click()

# 定位用户名输入框并输入用户名
username_input = driver.find_element_by_name("username")
username_input.send_keys("admin")

# 定位密码输入框并输入密码
password_input = driver.find_element_by_xpath("//input[@type='password']")
password_input.send_keys("admin")

# 定位登录按钮并点击
login_button = driver.find_element_by_css_selector("button.login-button")
login_button.click()

# 停留5秒
time.sleep(5)

# 关闭浏览器
driver.quit()
(2)定位方式的其他实现方法
  • 使用id属性:find_element_by_id()
  • 使用标签名:find_element_by_tag_name()
  • 使用类名:find_element_by_class_name()
  • 使用链接文本:find_element_by_link_text()
  • 使用部分链接文本:find_element_by_partial_link_text()
  • 使用XPath:find_element_by_xpath()
  • 使用CSS选择器:find_element_by_css_selector()
(3)测试用例设计

以下是登录功能的测试用例设计示例:

测试用例ID测试步骤预期结果实际结果状态(通过/失败)
TC001输入正确的用户名和密码成功登录[填写结果][填写状态]
TC002输入错误的用户名,正确的密码登录失败,提示用户名错误[填写结果][填写状态]
TC003输入正确的用户名,错误的密码登录失败,提示密码错误[填写结果][填写状态]
(4)使用Unittest框架的自动化测试脚本

以下是使用Unittest框架的自动化测试脚本示例:

import unittest
from selenium import webdriver

class TestDangpuLogin(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("http://www.dangpu.com")
    
    def test_login(self):
        # 测试登录功能
        driver = self.driver
        # ...(此处添加登录操作代码)
        self.assertEqual("主页", driver.title)  # 假设登录后页面标题为“主页”

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main(verbosity=2)
提高题(选做)

使用PO(PageObject)模式完成第1题。
Page Object模式是一种设计模式,用于将页面元素和操作封装成一个对象,以提高测试代码的可维护性和可读性。以下是使用PO模式重构上述登录功能的示例:

首先,创建一个页面类,用于封装登录页面的元素和操作:

class LoginPage:
    def __init__(self, driver):
        self.driver = driver

    @property
    def username_input(self):
        return self.driver.find_element_by_name("username")

    @property
    def password_input(self):
        def find_password_input():
            return self.driver.find_element_by_xpath("//input[@type='password']")
        return find_password_input()

    @property
    def login_button(self):
        return self.driver.find_element_by_css_selector("button.login-button")

    def login(self, username, password):
        self.username_input.send_keys(username)
        self.password_input.send_keys(password)
        self.login_button.click()

然后,更新测试类,使用LoginPage类来执行登录操作:

import unittest
from selenium import webdriver
from login_page import LoginPage  # 假设LoginPage保存在login_page.py文件中

class TestDangpuLogin(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("http://www.dangpu.com")
        self.login_page = LoginPage(self.driver)

    def test_login_success(self):
        # 测试登录成功
        self.login_page.login("admin", "admin")
        self.assertIn("主页", self.driver.title)  # 假设登录后页面标题包含“主页”

    def test_login_failure_wrong_username(self):
        # 测试用户名错误
        self.login_page.login("wrong_username", "admin")
        # 此处应添加验证登录失败的逻辑,例如检查错误消息等

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main(verbosity=2)

使用Page Object模式的好处包括:

  • 降低耦合度:页面元素定位器和操作封装在页面类中,测试代码与页面结构分离,减少测试代码对页面结构的依赖。
  • 提高可读性:通过页面类的方法名称即可了解操作的意图,无需深入查找元素定位器。
  • 提高可维护性:当页面元素发生变化时,只需在页面类中更新相应的元素定位器,无需修改测试代码。

实验总结

  1. 请描述自动化测试流程。

  2. 你将如何学习自动化测试技术?

  3. 自动化测试流程

自动化测试流程通常包括以下几个主要步骤:

需求分析

  • 确定测试目标和范围。
  • 理解软件需求以确定哪些测试可以自动化。

测试计划

  • 制定自动化测试策略和计划。
  • 选择适合的自动化测试工具和框架。

环境搭建

  • 安装和配置所需的软件和硬件环境。
  • 包括编程语言环境、测试工具、依赖库等。

测试数据准备

  • 创建或获取测试数据。
  • 确保测试数据的有效性和覆盖面。

脚本开发

  • 编写自动化测试脚本。
  • 使用编码实现测试逻辑和断言。

测试用例设计

  • 设计可自动化的测试用例。
  • 将测试用例与自动化脚本关联。

测试执行

  • 运行自动化测试脚本。
  • 监控测试执行过程,确保脚本按预期运行。

结果验证

  • 检查测试结果是否符合预期。
  • 使用断言来验证输出。

报告生成

  • 生成测试报告,包括通过/失败的测试用例和测试覆盖率。

问题调试

  • 分析失败的测试用例,确定是测试问题还是代码缺陷。
  • 修复问题并重新运行测试。

维护和更新

  • 根据软件更新和需求变更维护和更新测试脚本。

持续集成

  • 将自动化测试集成到持续集成/持续部署(CI/CD)流程中。
  1. 学习自动化测试技术的方法

学习自动化测试技术可以通过以下途径:

在线资源和教程

  • 利用在线教程、博客文章、视频课程等资源学习基础知识。

参加培训和研讨会

  • 参加自动化测试相关的培训课程和研讨会,与行业专家交流。

阅读书籍

  • 阅读有关自动化测试的专业书籍,深入理解理论和实践。

实践项目

  • 通过实际项目练习自动化测试,将理论知识应用于实践。

参与开源项目

  • 加入开源项目,贡献代码,学习他人的测试策略和代码。
;