自动化测试模型
概念
自动化测试模型可以看作自动化测试框架与工具设计的思想。自动化测试不仅仅是单纯写写脚本运行就可以了,还需要考虑到如何使脚本运行效率提高,代码复用、参数化等问题。自动化测试模型分为四大类:线性模型,模块化驱动测试、数据驱动、关键词驱动。
- 线性模型
线性脚本中每个脚本都相互独立,且不会产生其他依赖与调用,其实就是简单模拟用户某个操作流程的脚本。
#案例一:在帝国软件主页自动登录和退出操作
from selenium import webdriver
from time import sleep
driver=webdriver.Firefox()
driver.get("http://XXXX")
#输入用户名
driver.find_element_by_name('username').clear()
driver.find_element_by_name('username').send_keys('51zxw')
#输入密码
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('123456')
#点击登陆
driver.find_element_by_name('Submit').click()
sleep(3)
#退出
driver.find_element_by_link_text('退出').click()
sleep(2)
driver.switch_to_alert().accept()
sleep(3)
driver.quit()
#案例二:在百度主页根据定位元素并输入值
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#根据id=kw定位元素,并输入python
driver.find_element_by_id("kw").send_keys("python")
sleep(1)
#清除输入框内容
driver.find_element_by_id("kw").clear()
sleep(1)
#根据name=kw定位元素,并输入python
driver.find_element_by_name("wd").send_keys("python")
sleep(2)
#根据id=su定位元素,并点击
driver.find_element_by_id("su").click()
sleep(3)
driver.quit()
- 模块驱动
线性模型虽然每个用例都可以拿出来独立运行,但是用例之间重复代码很多,开发、维护成本高。其实把重复的操作代码封装为独立的公共模块,当用例执行时需要用到这部分,直接调用即可,这就是模块驱动的方式。比如登录系统、退出登录、截图函数等等。*
from selenium import webdriver
from time import sleep
class Login():
def user_login(self,driver):
driver.find_element_by_link_text('账号密码登录').click()
driver.find_element_by_name('username').clear()
driver.find_element_by_name('username').send_keys('51zxw')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('123456')
driver.find_element_by_name('Submit').click()
def user_logout(self,driver):
driver.find_element_by_link_text('退出').click()
sleep(2)
driver.switch_to_alert().accept()#点击确认退出按钮
if __name__=='__main__':
driver = webdriver.Firefox()
driver.get("http://localhost/")
driver.implicitly_wait(10)#隐式等待10秒
Login().user_login(driver)
Login().user_logout(driver)
# 可以直接调用已有的登录模块,代码更简洁
#以下为直接调用登录模块
# from LoginClass import * #导入模块中所有的方法也可以只导入登录或者退出的方法如:from LoginClass import user_login
driver = webdriver.Firefox()
driver.get("http://localhost/")
driver.implicitly_wait(10)
Login().user_login(driver)
Login().user_logout(driver)
- 数据驱动
模块驱动的模型虽然解决了脚本的重复问题,但是需要测试不同数据的用例时,模块驱动的方式就不很适合了。
数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。 装载数据的方式可以是列表、字典或是外部文件(txt、csv、xml、excel),目的就是实现数据和脚本的分离。
from selenium import webdriver
from time import sleep
class Login():
def user_login(self,driver,username,password):
driver.find_element_by_name('username').clear()
driver.find_element_by_name('username').send_keys(username)
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys(password)
driver.find_element_by_name('Submit').click()
def user_logout(self,driver):
driver.find_element_by_link_text('退出').click()
sleep(2)
driver.switch_to_alert().accept()
#以下为数据驱动调用——实现多个账户登录
from selenium import webdriver
from Loginpara import *
from time import sleep
driver=webdriver.Firefox()
driver.get("http://localhost")
driver.implicitly_wait(10)
Login().user_login(driver,'51zxw',123456)
sleep(3)
Login().user_logout(driver)
Login().user_login(driver,'51zxwPro',123456)
sleep(3)
Login().user_logout(driver)
sleep(3)
driver.quit()
- 关键字驱动
通过关键字的改变引起测试结果的改变叫关键字驱动测试。 selenium IDE也是一种传统的关键字驱动的自动化工具,Robot Framework 是一个功能更强大的关键字驱动测试框架
from selenium import webdriver
import time
class KeyTest():
def __init__(self, br=None):
if "IE" == br:
self.driver = webdriver.Ie()
elif "Firefox" == br:
self.driver = webdriver.Firefox()
else:
self.driver = webdriver.Chrome()
def open(self, url):
self.driver.get(url)
def send_keys(self, text):
try:
self.driver.find_element_by_id('kw').send_keys(text)
except:
print("click fail!")
raise
def click(self, id):
try:
self.driver.find_element_by_id(id).click()
except:
print("click fail!")
raise
def sleep(self, times):
time.sleep(int(times))
def quit(self):
self.driver.quit()
if __name__ == '__main__':
dr = KeyTest()
# 打开浏览器
dr.open('http://www.baidu.com')
# 输入"自动化测试"
dr.send_keys('自动化测试')
# 点击搜索
dr.click('su')
dr.quit()