自动化测试模型
名词解释
自动化测试库、框架和工具之间的区别:
- 【库】是有代码集合组成的一个产品,供程序员调用,面向对象的代码组织形成的库叫类库,WebDriver就属于库的范畴,它提供了一组操作web页面的类与方法,所有称它为{Web自动化库}
 - 【框架】为解决一个或一类问题而开发的产品,用户一般只需要使用框架提供的类或函数,即可以实现功能,如:unittest框架主要用于实现测试用例的组织和执行,以及测试结果生成,帮助我们完成测试工作,所以把它叫做单元测试框架;
 - 【工具】工具和框架做的事情类型,只是工具会更加抽象,屏蔽了底层的代码,提供了单独操作界面。例如:Selenium IDE和QTP就是自动化测试工具;
 
自动化测试模型
自动化测试模型可以看作【自动化测试框架】和 【工具】设计思想结合;
自动化测试技术的发展,演化为以下几种模型:
- 线型测试
 - 模块化驱动测试
 - 数据驱动测试
 - 关键字驱动测试
 
二、自动化测试模型介绍
1)线性测试
编写对应用程序的操作步骤产生相应的线性脚本,每个测试脚本相对独立,且不产生其他依赖与调用,其实就是单纯的来模拟用户完整的操作场景。
线性测试的优势:每个脚本都是完整且独立的。所以,任何一个测试用例脚本都可以单独执行。
缺点:测试用例的开发和维护成本很高。
- 开发成本很高,测试用例之间可能会存在重复操作,需要为每一个用例去编写重复的操作。例如:每个用例中重复的用户登录和退出操作等。
 - 维护成本很高,用例之间存在重复操作,当这些重复操作发生改变时,就需要逐一对它们进行修改。例如:登录输入框的定位发生了改变,就需要对每一个包含登录的用例进行调整。
 
2)模块化驱动测试
把重复的操作作为独立成公共模块,当用例执行过程中需要用到这一模块操作时则被调用,这样就最大限度消除了重复,从而提高测试用例的可维护性。
- 提高开发效率,不用重复编写相同的操作脚本。例如:已经写好一个登录模块,后续测试用例在需要登录的地方调用即可。
 - 简化了维护的复杂性,例如登录按钮的定位发生了变化,那么只需要修改登录模块的脚本即可,对所有调用登录模块的测试脚本来说不需要任何修改;
 
3)数据驱动测试
虽然模块化驱动测试已经很好解决了脚本的重复问题,但是自动化测试脚本在开发过程中还是发现很多不方便。例如:要测试不同用户的登录,首先用的是张三用户名登录,下一个测试用例要换成“李四”的用户名登录,这种情况下还是需要重复地编写登录脚本,因为虽然登录的步骤相同,但是登录所用的测试数据不同,于是数据驱动测试的概念就为解决这类问题而被提出。
3.1 读取txt文件
txt文件是我们经常操作的文件类型,Python提供了以下几种读取txt;
- read() 读取整个文件;
 - readline() 读取一行数据;
 - readlines() 读取所有行的数据;
 
例子
百度参数化关键字搜索
baidu.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
driver = webdriver.Ie();
url    ="https://www.baidu.com/" ;
driver.maximize_window();
driver.get(url)
driver.implicitly_wait(5)
search_text =[]
with open("user_info.txt","r+") as fr:
     for line in fr:
         if line.strip()=='':continue;
         text,paswod = line.strip().split(",")
         # print(text,paswod)
         search_text.append(text)
         search_text.append(paswod)
# print(search_text)
for text in search_text:
    print(text)
    driver.find_element_by_xpath("//*[@id='kw']").send_keys(text);
    driver.find_element_by_xpath("//*[@id='su']").click();
    sleep(5)
    driver.back();
    sleep(5)
driver.close();
user_info.txt
python,java
c,javascript
c#,HTML
3.2、读取csv文件
读取一组多数据时使用csv,通过WPS表格或Excel创建表格,文件另存为CSV格式进行保存。
import csv   #导入csv包
#读取本地csv文件,list类型
date = csv.reader(open('info.csv','r+)
#循环输出每一行信息
for user in date:
    print(user)
例子:
目录结构:
bbs目录:
mailTest.py
public.py
user_info.txt
mailTest.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import  webdriver
from selenium.webdriver import ActionChains
from public   import  Login
from time import sleep
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
if __name__ == '__main__':
    driver = webdriver.Chrome();
    url    ="http://xxooo/bbs/forum.php"
    driver.implicitly_wait(10)
    # # 获取首页窗口句柄
    sreach_windows = driver.current_window_handle;
    driver.get(url)
    # # 创建Login类对象user
    driver.maximize_window()
    user_dict ={}
    user_dict.values()
    # 调用登录模块
    with open("user_info.txt",'r+') as fr:
        for line in fr:
            if line.strip()=='':continue;
            username ,password = line.strip().split("|");
            # print(username,password)
            user_dict[username] =password;
    # print(user_dict)
    for line ,password in user_dict.items():
        print(line ,password)
        user = Login(driver,line,password)
        user.user_login();
        # user.user_logout();
public.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
class Login:
    def __init__(self,driver,username,password):
        self.driver   = driver;
        self.user     = username;
        self.password = password;
        print(self.user)
        print(self.password)
    # 登录
    def user_login(self):
         sleep(5)
         self.driver.find_element_by_xpath(".//*[@id='ls_username']").send_keys(self.user)
         self.driver.find_element_by_xpath(".//*[@id='ls_password']").send_keys(self.password)
         self.driver.find_element_by_xpath(".//*[@id='lsform']/div/div/table/tbody/tr[2]/td[3]/button").click();
         print("我是登录")
         self.driver.find_element_by_xpath(".//*[@id='um']/p[1]/a[5]").click()
         sleep(10)
    # 退出
    def user_logout(self):
        print("退出啊")
        self.driver.find_element_by_xpath(".//*[@id='um']/p[1]/a[5]").click()
        sleep(10)
        self.driver.close()
例二、163邮箱登录、发邮件
目录结构:
email163目录
EmaiTest.py
public163.py
EmaiTest.py
from selenium import webdriver from time import sleep from public163 import Login def write_email(driver): driver.find_element_by_class_name("oz0")[1].click(); sleep(2); # 收件人 driver.find_element_by_class_name("nui-editableAddr-ipt").clear(); driver.find_element_ty_class_name("nui-editableAddr-ipt").send_keys("xxxxxxxxx@qq.com") ; #主题 driver.find_element_by_class_name("nui-ipt-input").clear(); driver.find_element_by_class_name("nui-ipt-input").send_keys("自动化测试发的邮件啊") #正文 sleep(3) frame = driver.find_element_by_class_name("APP-editor-iframe"); driver.switch_to_frame(frame); driver.find_element_by_xpath("//body[@class='nui-scroll']").click(); driver.find_element_by_xpath("//body[@class='nui-scroll']").send_keys("2017年写的新代码测试发送啊 "); driver.switch_to_default_content(); #点击发送 driver.find_element_by_xpath(".//div[@class='nui-toolbar-item']/div[1]/span[2]").click(); if __name__ == '__main__': driver = webdriver.Chrome(); driver.maximize_window(); driver.implicitly_wait(10) url ="http://mail.163.com" ; driver.get(url); sleep(5) # 首页未登录页面title title = driver.title; print(title) # 首页未登录url now_url = driver.current_url; print(now_url); # 创建公共模块Login对象; user_obj = Login(driver); # 登录 user_obj.user_login() # 打印登录后title title = driver.title(); print(title) # 打印登录后url now_url = driver.current_url; print(now_url); #获取登录后的用户名 urser=driver.find_element_by_id("spnUid").text; print("\033[1;31m登录成功{0}\033[0m".format(urser)) # 发邮件 write_email(driver); # 退出 user_obj.user_logout()
public163.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import  webdriver;
from time import sleep
class Login:
    def __init__(self,drive):
        self.drive = drive;
    # 登录方法
    def user_login(self):
        self.drive.switch_to_frame("x-URS-iframe") ;
        self.drive.find_element_by_name('email').clear();
        # 输入邮箱账号
        self.drive.find_element_by_name('email').send_keys('13580xxxxxx')
        sleep(3);
        self.drive.find_element_by_name('password').clear();
        self.drive.find_element_by_name('password').send_keys('xxooxxoox');
        self.drive.find_element_by_id("dologin").click()
        sleep(3)
        # 登录后,退出表单操作;
        self.drive.switch_to_default_content()
    #退出方法
    def user_logout(self):
        self.drive.find_element_by_link_text("退出").click();
        self.driver.quit();
                
            
        
浙公网安备 33010602011771号