自动化测试工具详解

测试管理工具

jira(付费) tapd(付费) 禅道(免费)
测试管理工具应该具有的基本功能如下:
1、测试需求管理
2、测试用例管理
3、测试过程管理(计划、任务等)
4、缺陷管理
5、报表统计
6、权限管理

禅道

在这里插入图片描述

:项目管理工具,免费,开源,基于敏捷而不限于敏捷的,更适合国情。禅道是第一款国产的开源项目管理软件,它的核心管理思想基于敏捷方法scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

selenium

工具集,自动化测试基于此:预设好一定的条件,让机器去执行,

自动化测试工具

:QTP

jmeter

:性能测试工具,设置/录制脚本,接口测试

loadrunner

:性能测试工具,UI界面录制

接口测试工具

:soupUI,postman

app自动化测试工具

:appium,macaca

selenium的特点

免费,开源
轻量级(安装包小),
支持多语言:ruby,python,java,c#,
支持多平台:windows,mac
支持多浏览器:firefox,ie,chrome,edge,safari,opera
支持分布式测试:selenium grid服务器,可以让不同的浏览器执行不同的脚本,提高效率

自动化适用于什么样的测试?
兼用性测试,回归测试,

selenium1.0

seleniumRC,seleniumIDE,senleniumGRID(用js写的库,js本身有环境沙箱问题,会有拦截,)

selenium2.0

selenium+webdriver(脚本控制webdriver,就相当于乘客坐出租车,乘客是脚本,司机是webdriver,司机驱动车前往目的地)(解决了环境沙箱问题)

selenium3.0

增加了一些新特性,增加了edge safari浏览器的原生内核,可以在上面进行自动化测试。

Webdriver

常见的api:
(1)from selenium import webdriver——要想使用selenium 的webdriver 里的函数,首先把包导进来
(2)browser = webdriver.Firefox()——我们需要操控哪个浏览器呢?Chrome ,当然也可以换成Ie 或Firefox。browser 可以随便取,浏览器首字母要大写,但后面要用它操纵各种函数执行。
(3)browser.find_element_by_id(“kw”).send_keys(“selenium”)——一个控件有若干属性id 、name、(也可以用其它方式定位),百度输入框的id 叫kw ,我要在输入框里输入selenium 。
(4)关闭当前窗口。close方法关闭当前的浏览器窗口,quit方法不仅关闭窗口,还会彻底的退出webdriver,释放与driver server之间的连接。所以简单来说quit是更加彻底的close,quit会更好的释放资源
元素的定位:
id
name
class name
link text
partial link text
tag name
xpath
css selector

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
#id  必须有唯一的id和name查找同理也要是唯一的,id可以唯一的定位到元素
#driver.find_element_by_id("kw").send_keys("边伟涛")
#driver.find_element_by_id("su").click()

#link 查找网页链接
#driver.find_element_by_link_text("新闻").click()

#pritial_link_text 查找部分网页
#driver.find_element_by_partial_link_text("hao").click()

#tag_name
#driver.find_element_by_tag_name("input").send_keys("刘德华")
#driver.find_element_by_tag_name("input").click()

#xpath 从根部查找,直接copy,xpath ,可以唯一的定位到
#driver.find_element_by_xpath("//*[@id='kw']").send_keys("刘德华")
#driver.find_element_by_xpath("//*[@id='su']").click()

#css selecter也是用id定位 直接copy,css selecter,可以唯一的定位到
driver.find_element_by_css_selector("#kw").send_keys("苏炳添")
driver.find_element_by_css_selector("#su").click()
time.sleep(3)
driver.quit()

操作测试对象

前面都是定位元素,定位只是第一步,定位之后需要对这个原素进行操作。鼠标点击呢还是键盘输入,这要取决于我们定位的是按钮还输入框。一般来说,webdriver 中比较常用的操作对象的方法有下面几个:
click 点击对象
send_keys 在对象上模拟按键输入
clear 清除对象的内容,如果可以的话
在这里插入图片描述

submit 提交对象的内容,如果可以的话(submit和click的作用一样)
在这里插入图片描述

text 用于获取元素的文本信息
在这里插入图片描述

添加等待

1,固定等待:
在这里插入图片描述
2,智能等待:
driver.implicitly_wait(10) 会在10秒内网页加载好了就继续访问
关于固定等待和智能等待:就相当于两个人同时过桥,一个走路一个跑步,先过桥的还得在桥头等待另一个
打印title及url
打印title:要添加time.sleep(6),让页面加载完成在这里插入图片描述在这里插入图片描述

打印url:

url+driver.current_url
print(url)

浏览器操作

我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行。
浏览器最大化:driver.maximize_window()
设置浏览器得宽,高:driver.set_window_size(400,1000)
操作浏览器的前进、后退:

#浏览器的后退
driver.back()
time.sleep(6)
#浏览器的前进
driver.forward()
控制滚动条
拖到最低端:
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
拖到最顶端:
js2="var q=document.documentElement.scrollTop=0"
driver.execute_script(js2)
键盘事件
使用键盘里的TAB键来选择
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:89/zentao/user-login.html")
driver.maximize_window()
driver.find_element_by_id("account").send_keys("admin")
driver.find_element_by_id("account").send_keys(Keys.TAB)
driver.find_element_by_name("password").send_keys("Aa54321abc")
time.sleep(3)
driver.find_element_by_id("submit").click()

time.sleep(3)
driver.quit()

使用键盘组合键来操作

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:89/zentao/user-login.html")
driver.maximize_window()
driver.find_element_by_id("account").send_keys("admin")
driver.find_element_by_id("account").send_keys(Keys.TAB)
driver.find_element_by_name("password").send_keys("Aa54321ab")
time.sleep(3)
password=driver.find_element_by_name("password")
password.send_keys(Keys.CONTROL,'a')
time.sleep(3)
password.send_keys(Keys.CONTROL,'x')
time.sleep(3)
password.send_keys("Aa54321abc")
time.sleep(3)
driver.find_element_by_name("password").send_keys(Keys.ENTER)
driver.find_element_by_id("submit").click()

time.sleep(3)
driver.quit()

鼠标事件

context_click() 右击
double_click() 双击

#双击
 ActionChains(driver).double_click(su).perform()
#右击
ActionChains(driver).context_click(su).perform()

定位一组元素
from selenium import webdriver
import time
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('checkbox.html')
dr.get(file_path)
定位所有的input,需要遍历
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()

多层框架
多层框架或窗口的定位:
switch_to_frame()
switch_to_window()
对于一个现代的web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一
个难题。
有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中,
seelnium webdriver 提供了一个switch_to_frame 方法,可以很轻松的来解决这个问题。
switch_to_frame(name_or_id_or_frame_element):
可以简单记忆一下,如果这个frame有name和id属性那么就用这两个属性就好,如果没有的话可以先用
find_element_by_xxx方法找到这个frame元素,然后把这个元素传进去,这也是可行的。
下拉框处理
from selenium import webdriver
import os,time
driver= webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('drop_down.html')
driver.get(file_path)
time.sleep(2)
#先定位到下拉框
m=driver.find_element_by_id("ShippingMethod")
#再点击下拉框下的选项 xpath定位
m.find_element_by_xpath("//option[@value='10.69']").click()
time.sleep(3)
driver.quit()

(1)或者获取一组元素,然后遍历比较
(2)options[3].click() 使用数组的方式也可以定位,要注意下标

alert弹出框的处理

1,先用id定位,

from selenium import webdriver
from time import sleep
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('alert.html')
dr.get(file_path)
#点击链接弹出alert
dr.find_element_by_id('tooltip').click()
sleep(2)
alert = dr.switch_to_alert()
alert.accept()
sleep(2)
dr.quit()

unittes框架

单元测试框架,是做黑盒测试的,而junit也是单元测试,但是是进行白盒测试的,是进行ui界面的测试,用来测试代码逻辑
测试固件:
setUp()方法:初始化,可以放一些初始化操作
TearDown()方法:UI功能测试后的清理工作
(方法的开头都是 test_开头)
测试套件:把不同脚本中的的测试用例组合在一起执行

  • addTest-把测试脚本中的用例一个一个的添加进来
  • makeSuite和TestLoader:把整个测试脚本中的所有测试方法都添加到测试套件中

HTMLReport:测试报告,
setUp(self)中self代表自己的实例参数,在方法的一个参数,调用这个方法的时候可以不传参
def test_hao(self): 写出每个功能的测试用例,清晰简明
每运行一次测试用例时测试固件(setup,teardown)都要运行一次

from selenium import webdriver
import unittest
import time
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import NoSuchElementException

class Baidu1(unittest.TestCase):
    def setUp(self):
      self.driver=webdriver.Chrome()
      print("setup")   #每执行个代码块,测试固件都要运行一次
      self.url="https://www.baidu.com/"
      self.driver.maximize_window()
      time.sleep(3)

    def tearDown(self):
      self.driver.quit()

    def test_hao(self):  #必须要以test开头
     driver=self.driver
     driver.get(self.url)
     time.sleep(3)
     driver.find_element_by_link_text("hao123").click()
     time.sleep(6)

    def test_baidusearch(self):
        driver=self.driver
        driver.get(self.url)
        time.sleep(3)
        driver.find_element_by_id("kw").send_keys("苏炳添")
        driver.find_element_by_id("su").click()
        time.sleep(6)

    if __name__=="__main__":
          unittest.main(verbosity=1)  
 #可以增加verbosity参数,例如unittest.main(verbosity=2)
在主函数中,直接调用main() ,在main中加入verbosity=2 ,这样测试的结果就会显示的更加详细。
这里的verbosity 是一个选项, 表示测试结果的信息复杂度,有三个值:
0 ( 静默模式): 你只能获得总的测试用例数和总的结果比如总共100个失败,20 成功80
1 ( 默认模式): 非常类似静默模式只是在每个成功的用例前面有个“ . ” 每个失败的用例前面有个“F”
2 ( 详细模式): 测试结果会显示每个测试用例的所有相关的信息

addTest() 的应用
测试套件:当有多个或者几百测试用例的时候, 这样就需要一个测试容器( 测试套件) ,把测试用例放在该容器中进行执行,unittest 模块中提供了TestSuite 类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例加入到测试套件中。

import unittest,csv
import os,sys
import time
#导入testbaidu1,testbaidu2
import testbaidu1
import testbaidu2
#手工添加案例到套件,
def createsuite():
suite = unittest.TestSuite()
#将测试用例加入到测试容器(套件)中
suite.addTest(testbaidu1.Baidu1("test_baidusearch"))
suite.addTest(testbaidu1.Baidu1("test_hao"))
suite.addTest(testbaidu2.Baidu2("test_baidusearch"))
return suite
if __name__=="__main__":
suite=createsuite()

makeSuite()
makeSuite可以实现把测试用例类内所有的测试case组成的测试套件TestSuite ,unittest 调用makeSuite的时候,只需要把测试类名称传入即可。可以把多个测试用例的脚本传到测试套件

suite=unittest.TestSuite()
suite.addTest(unittest.makeSuite(testbaidu1.Baidu1))
suite.addTest(unittest.makeSuite(testbaidu2.Baidu2))
return suite

TestLoader()

suite1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)
suite = unittest.TestSuite([suite1, suite2])
return suite

discover()
discover 是通过递归的方式到其子目录中从指定的目录开始, 找到所有测试模块并返回一个包含它们对象的TestSuite ,然后进行加载与模式匹配唯一的测试文件,discover 参数分别为discover(dir,pattern,top_level_dir=None)
在一个文件夹中,以某种格式命名的所有脚本里面的所有测试用例都添加进来?
可以使用discover()

#手工添加案例到套件,
def createsuite():
discover=unittest.defaultTestLoader.discover('../test',pattern='test*.py',top_level_dir=None)
print discover
return discover

测试用例的默认执行顺序为:0-9.A-Z。

忽略测试用例的执行:@unittest.skip(u’The function was canceled, neglects to perform thecase’)
unittest断言
判断预计的结果和实际的结果是不是相同
assertEqual(arg1, arg2, msg=None) 验证arg1=arg2,不等则fail,相等则None
assertNotEqual(arg1, arg2, msg=None) 验证arg1 != arg2, 相等则fail

HTML报告
测试报告的生成?
1,首先要引入HTMLTestRunner.py文件到python的安装目录下
2,然后要明白生成的测试报告要放哪
3,解决测试报告的命名问题(以时间命名防止重复)
4,生成测试报告,

# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time
import HTMLTestRunner
#手工添加案例到套件,
def createsuite():
discover=unittest.defaultTestLoader.discover('../test',pattern='test*.py',top_level_dir=None)
print discover
return discover
if __name__=="__main__":
curpath=sys.path[0]
#取当前时间
now=time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
if not os.path.exists(curpath+'/resultreport'):
os.makedirs(curpath+'/resultreport')
filename=curpath+'/resultreport/'+now+'resultreport.html'
with open(filename,'wb') as fp:
#出html报告
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'测试报告',description=u'用例执行
情况',verbosity=2)
suite=createsuite()
runner.run(suite)

异常捕捉和数据截图
用例不可能每一次运行都成功,肯定运行时候有不成功的时候。如果可以捕捉到错误,并且把错误截图保存,这将是一个非常棒的功能,也会给我们错误定位带来方便。
1,错误截图的存储位置
2,解决重复命名的问题
3,截图

def saveScreenShot(self,driver,file_name):
if not os.path.exists('./image'):
os.makedirs('./image')
now=time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time()))
#截图保存
print(now)
driver.get_screenshot_as_file('./image/'+now+'-'+file_name)
time.sleep(3)

bug:
测试版本,测试环境,测试数据,测试步骤,测试预期结果,实际结果,其他(日志,错误截图)

loaderunner1-性能测试

2008年北京奥运会,全球同时售卖奥运票,结果导致售票系统崩溃,导致停售三天。

在这里插入图片描述
启动:先在loadruner的安装目录下启动StartServer服务,然后启动User Generator

录制脚本:添加项目的url,点击开始录制,设置集合点,然后登录操作,点击结束录制,录制成功脚本,

设置3个用户登录,并发数为3,然后开始跑这个脚本

进入Controller:设置初始化用户并发数和线程数,然后自动生成测试报表。
在这里插入图片描述
在这里插入图片描述

为什莫要做性能测试?

  • 看系统是否能够很快的相应用户的请求
  • 看系统是否可以处理预期的访问量并且有盈余能力
  • 程序是否可以处理业务所需要的事务数量

性能测试术语

并发数
系统用户数:注册了该系统的用户数
在线用户数:在某一时刻登录了这个系统的用户数
并发用户数:某一时刻向系统发送请求的用户数量
广义的并发用户数量:某一时刻向系统发送请求的用户数量,这些用户请求可以是不同的操作引起的
狭义的并发用户数:某一时刻向系统发送请求的用户数量,这些用户必须是针对同一个操作向系统发送请求
有一个系统有1000个系统用户,都在线,有300个用户在进行查询操作,150个用户在进行浏览,150个进行删除,300个进行登录后啥都没干,100个进行信息修改,问并发用户数是多少?
广义并发用户数量:550(没有浏览操作) 狭义:300(查询),150(删除),100(修改)
响应时间
又叫请求响应时间:TTLB(time to last byte)
对请求作出响应所需要的时间
网络传输(请求)时间+服务器处理(一层或多层)时间+网络传输(响应)时间。
响应时间=用户反应时间+网络传输时间+后台服务器处理时间+数据库服务器处理时间(一来一回)
在这里插入图片描述

事物的响应时间
完成一个事务所需要的时间,(系统平均事务的响应时间)
每秒事务通过数 (tps)
平均来说,每秒事务的通过数是一定的。比如:地铁站进站的检票机只能进入额定的人数,所以系统的通过数,之和系统本身有关,于乘客人数无关
点击率
每秒服务器处理的http请求的个数
衡量我们系统服务性能的。这里的点击并不是鼠标的一次点击,一次点击可能有多次HTTP请求
吞吐量
服务器每秒处理的信息量 btyes/s tps http/s
单位时间内系统处理的客户请求的数量,直接体现软件系统的性能承载能力
思考时间
用来模拟用户在实际操作时的真实思考时间
资源利用率
不同的系统资源的使用情况:cpu,gpu,硬盘,网络带宽,内存,电源使用情况

性能测试模型

曲线拐点模型
在这里插入图片描述
地铁模型
系统处理能力是一定的。
例:某地铁有三个刷卡机,一台刷卡机进站需要1秒,
1个人,1s
2个人,1s
3个人,1s
6个人,2s
9个人,1.7s
地铁站拥挤,每个人拿了很多东西,需要调优,增加地铁的发车次数,增加闸机数
性能测试分类的介绍
做性能测试的前提?
1,要了解系统性能要做什莫类型的性能测试
2,根据具体需要做的性能测试类型去设计性能测试场景
(1)基准测试
主要是为了获取系统的性能的各项指标,作为一个基准
一个新的开发系统,或者一个不了解的系统,先做一个基准测试
(2)狭义性能测试
是通过模拟生产运行的业务压力量和使用场景组合,测试系统的性能能否满足生产系统要求。该测试是一种正常的测试,主要是测试系统正常使用时是否满足要求。
(3)负载测试
负载测试是在被测系统上不断增加压力,直到各项指标达到饱和,例如“响应时间”超过预定指标或者某种资源使用已经达到饱和状态。这种测试方法可以找到系统的处理极限,为系统调优提供数据。查看拐点和定位瓶颈
(4)并发测试
不断地给系统增加用户,查看系统在不同的用户数量级别下系统性能指标的表现,寻找系统的拐点。
并发测试的例子:软硬件环境一定,数据库环境一定,进行模糊查询,100个用户来同时访问模糊查询,响应时间为2.8s,再增加50个用户,此时响应时间为2.9s,再增加50个,此时响应时间为3.1s,而此时规定响应时间不能超过3s,这时就找到了响应事件对应得用户数的拐点
(5)容量测试
不断的给系统的数据库增加数据量,查看系统在不同的数据量下,系统指标的表现,并寻找拐点
容量测试的例子:用户数一定,不断地给数据库添加数据量,查看系统指标的表现,查看拐点。
(6)压力测试
是用空间换时间,高于系统的负载的情况下,运行系统一段时间,查看系统的各项性能指标的表现,看系统是否会因为高负载情况下出现资源分配不均等问题。
(7)配置测试
在不同的软硬件配置下,查看系统各项指标的表现,找到系统系统表现最佳时对应的系统软硬件配置。
(8)可靠性测试
时间换空间,在低于系统最高负载下长时间运行系统,看系统是否会出现问题,例如资源利用率为70%时运行1个星期。
(9)失效恢复测试
(10)大数据量的测试

性能测试的实施与管理

性能测试前期准备
测试工具引入
测试方案
测试设计与开发
测试执行与管理
测试分析与调优
测试报告

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值