欢迎来到赛兔子家园

自动化测试模型

名词解释

自动化测试库、框架和工具之间的区别:

  • 【库】是有代码集合组成的一个产品,供程序员调用,面向对象的代码组织形成的库叫类库,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();

 

posted on 2017-02-28 15:59  赛兔子  阅读(180)  评论(0)    收藏  举报

导航