本章内容:
- 概念介绍
- 自动化测试模型
一、概念
自动化测试库、框架、工具之间的区别:
- 库是由代码集合成的一个产品,供程序员调用,面向对象的代码组织形成的库叫类库,面向过程的代码组织形成的库叫函数库。
- 框架是为了解决一个互或一类问题而开发的产品,用户一般需要只需要使用框架提供的类或函数,即可实现全部功能。
- 工具与框架所做的事情类似,只是工具会有更高的抽象,屏蔽了底层的代码,一般会提供单独的操作界面供用户操作。
二、自动化测试模型
自动化测试模型可以看作自动化测试框架与工具设计思想的结合。随着自动化测试技术的发展,演化为以下几种模式:
- 线性测试
- 模块化驱动测试
- 数据驱动测试
- 关键字驱动测试
2.1 线性测试
代码按照操作步骤产生相应的线性脚本,每个测试脚本相对独立,且不产生其他依赖与调用。
例子:
需求:百度搜索设置修改为20条
实现代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tian'
__data__ = '2020/4/15 14:24' import time from selenium import webdriver
from selenium.webdriver.support.select import Select #下拉框 driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com") #悬停操作也可以用点击
driver.find_element_by_link_text("设置").click()
time.sleep(2)
driver.find_element_by_link_text("搜索设置").click()
time.sleep(2)
driver.find_element_by_xpath("//input[@id='s1_2']").click() #选中不显示单选框
time.sleep(2)
sel = driver.find_element_by_xpath("//select[@id='nr']")
time.sleep(2)
Select(sel).select_by_value('') #设置结果为20
#保存设置
driver.find_element_by_xpath("//a[@class='prefpanelgo']").click()
#处理弹出弹窗
alert = driver.switch_to_alert()
#获取弹窗中的文本信息
print(alert.text)
#已经记录下您的使用偏好
alert.accept() #接受警告框
优势:每个脚本都是完整且独立的。所以,任何一个测试用例脚本都可以拿出来单独执行。
缺点:开发成本高、维护成本很高
2.2 模块化驱动测试
模块化测试把重复的操作独立成公共模块,当用例执行过程中需要用到这一模块操作时则被调用,这样就最大限度消除重复,从而提高测试用例的可维护性。
- 提高了开发效率,不用重复编写相同的操作脚本,例如:已经写好一个登录模块,后续其他地方只需调用;
- 简化了维护的复杂性,例如:登录按钮的定位发生了变化,那么只需修改登录模块的脚本即可;
例如:
s1.py
from selenium import webdriver
from model import Login
from time import sleep url ="http://www.126.com/"
driver = webdriver.Chrome()
driver.get(url) driver.implicitly_wait(10) driver.title
driver.current_url #调用登录
l = Login(driver) #创建对象
l.login() #调用登录方法
l.assert_login()#调用验证方法
l.logout()#调用退出方法
model.py
import time class Login: def __init__(self,driver): self.driver = driver
def login(self):
driver = self.driver
username = self.user_name
password = self.pass_word
time.sleep(5)
print("登录页面titel,输入用户名和密码",driver.title)
print("登录页面url,输入用户名和密码",driver.current_url)
driver.switch_to_frame('x-URS-iframe') driver.find_element_by_xpath("//input[@name='email']").clear()
driver.find_element_by_xpath("//input[@name='email']").send_keys("XXXOO") #输入账号 driver.find_element_by_xpath("//input[@name='password']").clear()
driver.find_element_by_xpath("//input[@name='password']").send_keys("123456") driver.find_element_by_xpath("//*[@id='dologin']").click()
driver.switch_to_default_content() #退出表单
time.sleep(5) def assert_login(self): driver = self.driver
print("登录成功后",driver.title)
print("登录成功后",driver.current_url) user_name = driver.find_element_by_xpath("//span[@id='spnUid']").text
print("登录成功后用户名:{0}".format(user_name)) def logout(self):
driver = self.driver
driver.close()
2.3 数据驱动测试
虽然模块化驱动测试很好地解决了脚本重复问题,但是自动化测试脚本在开发的过程中还是发现诸多不便
例如:测试不同用户登录,首先用的是“张三”的用户名登录,下一个测试用例要换成“李四”的用户名登录。在这种情况下,还是需要重复的编写登录脚本,因为虽然登录的步骤相同,但是登录所用的测试数据不同。
数据驱动直白点就是数据的参数化,因为输入数据的不同从而引起输出结果的不同;
不管读取的是定义的列表、字典、或者是外部文件(excel、csv、txt、xml等),都可以看作是数据驱动,它的目的就是实现数据与脚本的分离
例一:
s1.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Tian from selenium import webdriver
from model import Login
from time import sleep url ="http://www.126.com/"
driver = webdriver.Chrome()
driver.get(url) driver.implicitly_wait(10) driver.title
driver.current_url username ="test_tx"
password ="135781tian"
#调用登录
l = Login(driver,username,password)
l.login()
l.assert_login()
l.logout()
model.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Tian
import time class Login: def __init__(self,driver,user_name,pass_word): self.driver = driver
self.user_name = user_name
self.pass_word = pass_word def login(self):
driver = self.driver
username = self.user_name
password = self.pass_word
time.sleep(5)
print("登录页面titel,输入用户名和密码",driver.title)
print("登录页面url,输入用户名和密码",driver.current_url)
driver.switch_to_frame('x-URS-iframe') driver.find_element_by_xpath("//input[@name='email']").clear()
driver.find_element_by_xpath("//input[@name='email']").send_keys(username) #输入账号 driver.find_element_by_xpath("//input[@name='password']").clear()
driver.find_element_by_xpath("//input[@name='password']").send_keys(password) driver.find_element_by_xpath("//*[@id='dologin']").click()
driver.switch_to_default_content() #退出表单
time.sleep(5) def assert_login(self): driver = self.driver
print("登录成功后",driver.title)
print("登录成功后",driver.current_url) user_name = driver.find_element_by_xpath("//span[@id='spnUid']").text
print("登录成功后用户名:{0}".format(user_name)) def logout(self):
driver = self.driver
driver.close()