WEB自动化(selenuim、unittest、POM设计模式、数据驱动与关键字驱动)
web端测试: 对网页的测试
UI测试 = web测试+app测试
web自动化测试:通过代码对网页进行测试
UI自动化测试 = web自动化测试+APP自动化测试
什么WEB项目适合做自动化测试
1. 需求变动不频繁
2. 项目周期长
3. 项目需要回归测试
WEB自动化测试在什么阶段开始
1.4 WEB自动化测试所属分类
按照代码可见度划分:
- 黑盒测试(功能测试)
- 白盒测试(单元测试)
- 灰盒测试(接口测试)
WEB自动化测试属于黑盒测试(功能测试)
二、WEB自动化测试工具选择
2.1 主流的Web自动化测试工具
1. QTP:收费,支持Web,桌面自动化测试
2. Selenium:开源的Web自动化测试工具,免费,主要做功能测试
3. Robot framework:基于Python可扩展地关键字驱动的测试自动化框架,2014停止更新
三、WEB自动化测试的三板斧
● 定位元素
● 交互元素
● 进行断言
四、HTML与JavaScript
数据驱动与
数据驱动:现在主流的设计模式之一(以数据驱动测试)。 ddt模块实现
ddt模块模块的安装 pip install ddt
ddt模块:一个类装饰器+三个装饰器方法
ddt类装饰器 装饰继承unittest.TestCase的类
data装饰器方法 data()装饰器方法把列表、元组、字典作为参数
unpack装饰器方法 实现把复杂的数据实现分解成多个数据
file_data装饰器方法 可以直接接收数据文件(json数据/基于yaml数据文件),实现循环测试8.1.1
# testdatas.yaml # testdatas/testdatas.yaml baseurl: "http://47.107.116.139/shopnc/shop" login: url: /?s=user/loginInfo.html success: - laoban - laoban123 fail: - - laoban - laoban1234 - - admin - admin123 goodsPay: goodsname: Python全栈自动化 passwd: mashang
from ddt import ddt, data, unpack, file_data @ddt class TestLogin(unittest.TestCase): # 传输数据参数(列表、元组、字典),实现数据驱动 # Data("fail").data --> [[['laoban', 'laoban1234'], ['admin', 'admin123']]] @data(*(Data("fail").data[0])) def test_login_fail_error_username(self, data): print(data) self.driver = webdriver.Chrome() loginpage = LoginPage(driver=self.driver) # print(data) loginpage.login(data[0], data[1]) loginpage.sleep(2) # 断言,登录失败, 获取弹框登录失败 ele = loginpage.locator("登录页面", loc=(By.XPATH, "//div[@class='msg']")) self.assertEqual("登陆失败", ele.text)
# login.yaml - - laoban - laoban1234 - - admin - admin123from common import dir_config as Dir from ddt import ddt, data, unpack, file_data @ddt class TestLogin(unittest.TestCase): yaml_file_path = os.path.join(Dir.testdatas_dir, "login.yaml") @file_data(yaml_file_path) def test_login_fail_error_username(self, data): print(data) self.driver = webdriver.Chrome() loginpage = LoginPage(driver=self.driver) # print(data) loginpage.login(data[0], data[1]) loginpage.sleep(2) # 断言,登录失败, 获取弹框登录失败 ele = loginpage.locator("登录页面", loc=(By.XPATH, "//div[@class='msg']")) self.assertEqual("登陆失败", ele.text)
# login.yaml - - laoban - laoban1234 - - admin - admin123# login.yaml - username: laoban password: laoban1234 - username: admin password: admin123from common import dir_config as Dir from ddt import ddt, data, unpack, file_data @ddt class TestLogin(unittest.TestCase): file_name = os.path.join(Dir.testdatas_dir, "login.yaml") @file_data(file_name) @unpack def test_login_fail_error_username(self, username, password): # username 要与字典对应 print(username, password) self.driver = webdriver.Chrome() loginpage = LoginPage(driver=self.driver) loginpage.login(username, password) loginpage.sleep(2) # 断言,登录失败, 获取弹框登录失败 ele = loginpage.locator("登录页面", loc=(By.XPATH, "//div[@class='msg']")) self.assertEqual("登陆失败", ele.text)
8.2
什么关键字驱动?(以关键字函数驱动测试), 关键字驱动又叫动作字驱动
把项目业务封装成关键字函数,再基于关键字函数实现自动化测试,项目业务实现转化为关键字函数
覆盖项目业务 = 用例集合覆盖测试
用例集合 = 一个一个用例实现覆盖测试
覆盖用例 = 多个操作步骤组成=多个关键字函数
操作步骤封装成对应的关键字函数比如:登录用例
登录用例 = 多个操作步骤组成 基于每个操作步骤封装对应的关键字函数
登录用例:
1、打开浏览器 关键字函数 open_browser()
2、加载项目地址 关键字函数 load_url()
3、输入用户名 关键字函数 input()
4、输入密码 关键字函数 input()
5、点击登录 关键字函数 click()
# keywords/library.py from selenium import webdriver class Library: driver = None def open_browser(self, browser): browser = browser.capitalize() self.driver = getattr(webdriver, browser)() # 代表以下功能 # 打开浏览器 # if browser == "chrome": # self.driver = webdriver.Chrome() # # 打开IE,火狐浏览器 # elif browser == "ie": # self.driver = webdriver.Ie() # elif browser == "firefox": # self.driver = webdriver.Firefox() # else: # pass def load_url(self, url): self.driver.get(url) def locator(self, loc): """获取元素的定位""" return self.driver.find_element(*loc) def input(self, loc, value): # 获取元素 ele = self.locator(loc) ele.send_keys(value) def click(self, loc): ele = self.locator(loc) ele.click()# testcases/test_01.py import time import unittest from Code.keywrdFrame.keywords.libary import Library from selenium.webdriver.common.by import By class Test01(unittest.TestCase): def test_login(self): """ 基于关键字驱动 = 调用多个关键字函数 :return: """ # 登录页面的属性 el_username = (By.NAME, "accounts") el_password = (By.NAME, "pwd") el_login = (By.XPATH, "//form[@class='am-form form-validation-username']/div[3]/button") lib = Library() lib.open_browser("chrome") lib.load_url(url="http://101.34.221.219:8010/?s=user/loginInfo.html") lib.input(loc=el_username, value="laoban") lib.input(loc=el_password, value="laoban123") lib.click(loc=el_login) time.sleep(3)
8.3 如何一条用例实现多条用例的覆盖
结合数据驱动: 编辑一条用例,外部导入数据实现循环
用例体:实现不同用例的操作步骤 + 对应的断言如何代码实现:
封装对应的方法,可以执行所有的用例的操作步骤 + 断言# library.py from selenium import webdriver class Library: driver = None def open_browser(self, browser): browser = browser.capitalize() self.driver = getattr(webdriver, browser)() # 代表以下功能 # 打开浏览器 # if browser == "chrome": # self.driver = webdriver.Chrome() # # 打开IE,火狐浏览器 # elif browser == "ie": # self.driver = webdriver.Ie() # elif browser == "firefox": # self.driver = webdriver.Firefox() # else: # pass def load_url(self, url): self.driver.get(url) def locator(self, loc): """获取元素的定位""" return self.driver.find_element(*loc) def input(self, loc, value): # 获取元素 ele = self.locator(loc) ele.send_keys(value) def click(self, loc): ele = self.locator(loc) ele.click() # 封装方法: 可以调用当前类下面的所有的关键字函数 def run(self, keyword, *args): # 打开浏览器 # keyword: open_browser # *args: chrome getattr(self, keyword)(*args) # self.open_browser(browser="chrome") # self.input(loc=(), value="")import time import unittest from Code.keywrdFrame.keywords.libary import Library from selenium.webdriver.common.by import By from ddt import ddt, file_data, data, unpack @ddt class Test01(unittest.TestCase): # 每条用例的数据: 关键字函数 + 测试数据 case_data = [] @data(case_data) # z数据在文件中,从文件中导入 def test_case(self): el_username = (By.NAME, "accounts") el_password = (By.NAME, "pwd") el_login = (By.XPATH, "//form[@class='am-form form-validation-username']/div[3]/button") # 用例体 = 操作步骤 + 断言 # 封装对应的方法,可以执行所有的操作步骤 lib = Library() """ 将参数放入文件中, 通过 case_data传递参数 """ lib.run("open_browser", "chrome") lib.run("load_url", "http://101.34.221.219:8010/?s=user/loginInfo.html") lib.run("input", el_username, "laoban") lib.run("input", el_password, "laoban123") lib.run("click", el_login)关键字参数参考如图