软件测试总结

104 阅读16分钟

软件测试

  1. 基础部分 :测试常见基本概念,软件生命周期,软件开发模型贺测试模型,设计测试用例的方法,了解测试分类
  2. 测试管理部分 : 测试管理,如何执行测试管理,禅道
  3. 自动化测试部分 : 自动化测试,编写 (非常重要)
  4. 性能测试部分 :性能测试,基础的性能测试如何执行

一:基础部分

1.什么是软件测试(软件测试基本概念)
软件测试就是验证产品特性是否满足用户需求

2.调试和测试区别

目的
调试:发现并解决软件中的缺陷
测试:发现软件中的缺陷

参与角色
调试:开发人员
测试:开发人员,测试人员

执行阶段
调试:编码阶段
测试:贯穿软件的生命周期

注意:自动化测试不能代替手动化测试


1.需求
用户需求:简略的(甲方提出的需求)
软件需求:是用户需求的细化,具体的实现细节成文档(功能需求)

软件需求是用户需求的转化而来的
    
A.为什么需求分析对软件测试人员很重要?
  从软件功能需求出发,无遗漏的识别出测试需求是至关重要的,这将直接关系到用例的测试覆盖率
  对于识别出的每个测试需求点,需要采用具体的设计测试用例的方法来进行测试用例的设计   
B.如何才可以深入理解被测试软件的需求?
  测试工程师在需求分析和设计阶段就开始介入

2.测试用例的概念
测试用例是向被测试系统发起的一组集合
这组集合包含:**测试环境、操作步骤、测试数据、预期结果**等要素。
测试用例解决了两大问题:测什么,怎么测。

3.BUG(软件错误)
软件错误的一般定义: 程序与规格说明之间不匹配 。
注意:以上说法是片面的,准确的来说:当且仅当规格说明是存在的并且正确,程序与规格说明之间的不匹配才是错误。

当且仅当软件需求规格说明书存在并且合理,软件的功能不符合需求规格说明书,就是BUG
如果软件需求规格说明书不存在,那么用户的需求存在并且合理,软件的功能和用户需求不相符就是BUG
需求是测试人员进行软件测试工作的依据

在具体设计测试用例的时候,首先需要搞清楚每一个业务需求对应的多个软件功能需求点,然后分析出

每个软件功能需求点对应的多个测试需求点,然后针对每个测试需求点设计测试用例。

过程如下,业务需求—>软件功能需求点—>测试需求点—>测试用例


软件开发的生命周期:

需求分析-计划-设计-编码-测试-运行维护

开发五大模型

1.瀑布模型

A.特点
每一个阶段比较独立,串行注重前期需求分析,后期系统测试
B.缺点
测试介入晚,导致软件前期的问题,后期测试阶段才发现,失去了错误及时修正的机会
不响应需求的变化
2.螺旋模型

适合项目庞大,复杂,风险性高的项目

A.特点:
注重质量管理,每一个迭代都会进行风险分析
B.缺点:
风险分析投入人力,资源,管理成本,成本较高
3.增量模型,迭代模型

抗风险能力比较强

4.敏捷模型

特点:轻文档,轻流程,重目标,重产出,响应变化

敏捷开发有很多种方式,其中scrum是比较流行的一种。

1.scrum里面的角色
scrum由product owner(产品经理)、scrum master(项目经理)和team(研发团队)组成。 
其中product owner负责整理user story(用户故事),定义其商业价值,对其进行排序,制定发布 计划,对产品负责。 
scrum master 负责召开各种会议,协调项目,为研发团队服务。 
研发团队则由不同技能的成员组成,通过紧密协同,完成每一次迭代的目标,交付产品。 

2.迭代开发
与瀑布不同,scrum将产品的开发分解为若干个小sprint(迭代),其周期从1周到4周不等,但不会超过4 周。参与的团队成员一般是59人。每期迭代要完成的user story是固定的。每次迭代会产生一定的交付。

测试两大模型

软件测试V模型
A.特点
明确标注了测试类型
明确标注了测试阶段与开发阶段的对应关系
B.缺点
测试在编码之后进行
测试介入晚,前期的问题才发现导致前期问题不能及时解决
软件测试W模型
A.特点
开发一个V,软件测试一个V
软件开发的过程和软件测试同步进行保证项目前期的问题能够及时被发现串行
B.缺点
不支持敏捷开发

软件测试的生命周期(软件测试的流程)

需求分析-测试计划-测试设计/测试开发-测试执行-测试评估

1.需求分析:验证需求的正确性,合理性;细化需求找出测试项,写测试用例
2.测试计划:测试人数,测试环境,测试时间,测试设备
3.测试设计/测试开发:根据需求,写测试用例
4.测试执行:开发已经完成,执行测试用例,验证功能,验证BUG
5.测试评估:写了多少测试用例,执行了多少,剩余的测试用例数BUG数量,解决的BUG数量。遗留的BUG以及解决方案,测试范围和测试功能。
如何描述一个BUG(软件缺陷)

BUG管理工具,文字形式 :禅道,jira,tapd

1:测试版本号(代码版本信息)
2:测试环境
   web系统
   app:软件设备 安装/ios/windows/鸿蒙/塞班
   硬件设备:手机品牌(系列)电脑品牌
3:测试数据 :更加快速的复现问题
4:测试步骤
5:测试实际结果
6:测试预期结果
7:附件,错误日志,错误截图等等。

注意: BUG的级别一般根据公司的不同而改变

如果因为BUG和开发人员产生冲突
  • 检查,看BUG描述是否清楚
  • 从用户的角度去说服开发人员修改
  • BUG定级要有理有据(根据公司的规范)
  • 不断提升自己的业务水平和技术水平
  • 不要争吵,找产品经理讨论

设计测试用例的万能思路

前提:基于需求设计测试用例

1.功能测试
2.界面测试
3.性能测试
4.兼容性测试
5.易用性测试
6.安全测试

具体的设计测试用例的方法

1.等价类
根据输入(特殊情况考虑输出),把输入划分成若干个等价类,从每一个等价类当中选择测试用例进行测试,如果这个测试用例测试通过,则说这个测试用例代表的等价类测试通过。
有效等价类:符合需求数据规格说明的数据集合
无效等价类:不符合需求规格说明的数据集合

2.边界值
针对输入和输出的边界进行测试用例的设计
边界值要去边界上的值,和边界左右两边的值
tips:等价类和边界值结合在一起进行测试用例的设计

3.错误猜测法
强调对被测试软件的需求理解以及设计实现的细节把握,还有个人的直觉和经验。

4.场景设计法
很多软件不同的场景,是基于不同的事件的触发,不同事件的触发,导致场景走向不同的事件流。
不同的功能点串起来形成一个场景。不同的功能点又有不同的输出,不同的输出导致不同的测试场景。
ATM取款机场景:插入-输入密码-输入取款钱数-取款-退卡
测试用例:
插错银行卡,系统提示“无法识别”

事务:一系列密切相关的操作集合,如果所有操作成功,就说这个事务成功了;如果其中一个操作失败,我们就说这个事务执行失败。

5.因果图(判定表)
测试步骤:
分析出所有的输入和输出
找出输入和输出之间的组合关系
根据关系画出因果图
根据因果图画出判定图
根据判定图写出测试用例

测试分类

1.按照测试对象
2.按照是否查看代码
    A.黑盒测试是只考虑输入输出的测试方式,关注于功能测试;
    B.白盒测试是针对程序内部结构和逻辑进行测试,关注于结构和逻辑的正确性;
    C.灰盒测试是黑盒和白盒的结合,既关注输入输出的正确性,也关注于程序内部的逻辑和正确性。
3.按照开发阶段
    A.单元测试是对软件组成单元进行测试
    B.集成测试是测试多个模块组合在一起的测试,确保系统的正确性和稳定性,可分为自下而上和自上而下两种
    冒烟测试
    C.系统测试是为了检查整个软件系统是否符合业务需求和用户要求,从客户角度出发,不仅仅要发现问题,还要提供优化方案
    回归测试
    D.验收测试是确认软件是否符合业务需求和用户要求的测试,由客户或用户代表执行
4.按照实施组织
5.按照是否运行代码
6.按照算法手工
7.按照地域

自动化测试

### 自动化测试selenium

Selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。

1.定位元素的方式
from selenium import webdriver
import time

#获取被控制浏览器的驱动,Chrome
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

# 1.通过元素id定位,并向元素输入相应的内容
# driver.find_element_by_id("kw").send_keys("666")
# 2.通过元素name定义,但是要有唯一的name才可以
# driver.find_element_by_name("wd").send_keys("777")
# 3.通过class name定位
# driver.find_element_by_class_name("s_ipt").send_keys("888")
# 4.通过css进行定位:chrome的F12开发者模式中Element-右键-copy-copy selector来获取
# driver.find_element_by_css_selector("#kw").send_keys("999")
# 5.通过XPath进行定位:chrome的F12开发者模式中Element-右键-copy-copy xpath来获取
# driver.find_element_by_xpath("//*[@id='kw']").send_keys("1010")
# 6.link test进行定位:页面上的文字链接,需要文字唯一且存在,不然会报错
# driver.find_element_by_link_text("图片").click()
# 7.Partial link text定位:通过部分链接定位
driver.find_element_by_partial_link_text("图片").click()

# 通过元素id定位到元素,并进行点击操作
# driver.find_element_by_id("su").click()

time.sleep(5)
# 退出并关闭窗口
driver.quit()
2.操作测试对象
from selenium import webdriver
import time

# 定位之和需要对对象进行操作

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")


# 1.send_keys给操作对象输入文本信息
# driver.find_element_by_id("kw").send_keys("666")
# 2.click点击操作对象
# driver.find_element_by_id("su").click()
# 3.submit提交表单,达到与click一样的效果
# driver.find_element_by_id("su").submit()
# 4.text获取元素文本:输出了文本,但是因为浏览器的防御措施,倒置文本显示不出来
# data = driver.find_element_by_id("bottom_layer").text
# print(data)
# 5.clear去除操作对象的内容
driver.find_element_by_id("kw").send_keys("666")
driver.find_element_by_id("kw").clear() #去除了上面的666
driver.find_element_by_id("kw").send_keys("hhh")
driver.find_element_by_id("su").submit()

# 添加等待:sleep休眠
time.sleep(5)

driver.quit()
3.添加等待
from selenium import webdriver
import time

driver = webdriver.Chrome();
driver.get("https://www.baidu.com/")

driver.find_element_by_id("kw").send_keys("666")
driver.find_element_by_id("su").click()

# 1.固定等待:必须等待参数设定的时间
# time.sleep(3)
# 2.智能等待:最多等待参数设定的时间,但是不一定等够足够这个时间
driver.implicitly_wait(5)

driver.quit()
4.打印消息
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

# 打印
# 1.title打印页面:百度一下,你就知道
print(driver.title)
# 2.打印url:百度的网址
print(driver.current_url)


time.sleep(5)
driver.quit()
5.浏览器的操作
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")


# 五:浏览器的操作
# 1.浏览器最大化:maximize_window()
# driver.maximize_window() #将浏览器以最大的形式展示出来
# time.sleep(2)
# driver.find_element_by_id("kw").send_keys("666")
# driver.find_element_by_id("su").click()
# 2.设置浏览器的宽,高:set_window_size(width, high)
# driver.set_window_size(100,2000) #设置浏览器的长与高
# 3.浏览器的前进,后退
#浏览器的前进
# browser.forward()
#浏览器的后退
# driver.back()
# driver.find_element_by_id("kw").send_keys("666")
# driver.back() #浏览器后退
# driver.forward() #浏览器前进
# driver.find_element_by_id("kw").send_keys("777")
# driver.find_element_by_id("su").click()
# 4.控制浏览器滚动条
# 浏览器滚动条的控制需要依靠js脚本
driver.find_element_by_id("kw").send_keys("666")
driver.find_element_by_id("su").click()
time.sleep(2)
# 将页面滚动条拖到底部
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(2)
# 将滚动条移动到页面的顶部
js = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js)

time.sleep(5)
driver.quit()
6.键盘事件
from selenium import webdriver
from selenium.webdriver.common.keys import Keys #需要引入keys 包
import os,time

# 键盘组合键用法
# send_keys(Keys.CONTROL,'a') #全选(Ctrl+A)
# send_keys(Keys.CONTROL,'c') #复制(Ctrl+C)
# send_keys(Keys.CONTROL,'x') #剪贴(Ctrl+X)
# send_keys(Keys.CONTROL,'v') #粘贴(Ctrl+V)

driver = webdriver.Chrome()
driver.get("http://demo.zentao.net/user-login-Lw==.html")
time.sleep(3)
driver.maximize_window() # 浏览器全屏显示

driver.find_element_by_id("account").clear()
time.sleep(3)
driver.find_element_by_id("account").send_keys("demo")
time.sleep(3)
# tab 的定位相当于清除了密码框的默认提示信息,等同上面的clear()
driver.find_element_by_id("account").send_keys(Keys.TAB)
time.sleep(3)
# 通过定位密码框,enter(回车)来代替登陆按钮
driver.find_element_by_name("password").send_keys(Keys.ENTER)
'''
#也可定位登陆按钮,通过enter(回车)代替click()
driver.find_element_by_id("login").send_keys(Keys.ENTER)
'''
time.sleep(3)
driver.quit()
7.鼠标事件
  • 下面这段代码有一定的问题,但是基本操作没有太大的问题
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")

# 这里有些问题,需要解决
qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右键
ActionChains(driver).double_click(qqq).perform() #双击
# 定位元素的原位置
element = driver.find_element_by_id("s_btn_wr")
# 定位元素要移动到的目标位置
target = driver.find_element_by_class_name("btn")
# 执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
8.定位一组元素
from selenium import webdriver
import time
import os

# 定位一组元素

driver = webdriver.Chrome()

# file_path = "file:///" + os.path.abspath('D:/Java_sprint/cs/selenium2html/checkbox.html')
file_path = "file:///D:/Java_sprint/cs/selenium2html/checkbox.html"
driver.get(file_path)
time.sleep(3)
driver.maximize_window()

# 勾选里面所有的checkbox
# driver.find_element_by_id("c1").click()
# # driver.find_element_by_id("c2").click()
# # driver.find_element_by_id("c3").click()

# 定位一组tag name 都为input的元素
inputs = driver.find_elements_by_tag_name('input')
for input in inputs :
    if input.get_attribute('type') == 'checkbox':
        input.click()
time.sleep(2)
driver.quit()
9.多层框架窗口定位
  • 多层框架的操作
from selenium import webdriver
import time
import os

# 多层框架的操作

driver = webdriver.Chrome()

# url = "file:///" + os.path.abspath("C:\\课件\\我的课件\\测试\\selenium2/locateElement/selenium2html/frame.html")
url = "file:///D:/Java_sprint/cs/selenium2html/frame.html"
driver.get(url)
time.sleep(3)
driver.maximize_window()
# 从默认页面到 f1 框架页面
driver.switch_to.frame("f1")
driver.find_element_by_link_text("click").click()

# 回到默认页面
driver.switch_to.default_content()

# driver.switch_to_frame()


time.sleep(3)
driver.quit()
10.层级定位
from selenium import webdriver
import time
import os
from selenium.webdriver.common.action_chains import ActionChains

# 层级定位
driver = webdriver.Chrome()
# url = "file:///"+os.path.abspath("C:\\课件\\我的课件\\测试\\selenium2/locateElement/selenium2html/level_locate.html")
url = "file:///D:/Java_sprint/cs/selenium2html/level_locate.html"
driver.get(url)

driver.maximize_window()
# 定位link1,点击
driver.find_element_by_link_text("Link1").click()
driver.implicitly_wait(10)
# 定位 Another Action
action = driver.find_element_by_link_text("Another action")
# 高亮显示Another action, 把鼠标移动到 Another action上面
ActionChains(driver).move_to_element(action).perform()

time.sleep(6)
driver.quit()
11.下拉框操作
from selenium import webdriver
import time
import os

# 下拉框操作

driver = webdriver.Chrome()

url = "file:///D:/Java_sprint/cs/selenium2html/drop_down.html"

driver.get(url)
driver.maximize_window()

time.sleep(2)

m = driver.find_element_by_id("ShippingMethod")
# 1.使用xpath进行定位
m.find_element_by_xpath('//*[@id="ShippingMethod"]/option[3]').click()
# 2.定位一组元素,用该元素的特殊属性进行查找
options = driver.find_elements_by_tag_name("option")
# for option in options:
#     if option.get_attribute('value') == '9.03':
#         option.click()
# 3.通过数组的方式进行查找
options[3].click()

time.sleep(3)
driver.quit()

12.alert、confifirm、prompt 的处理
alert点击确认按钮
  • 获得弹框的操作句柄
  • 调用accept方法关闭弹框
from selenium import webdriver
import time
import os
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
url = "file:///D:/Java_sprint/cs/selenium2html/alert.html#"
driver.get(url)
driver.maximize_window()
time.sleep(3)

# 定位元素,点击,使得弹出框出现
driver.find_element_by_id("tooltip").click()
time.sleep(3)

# 定位弹出框/获得弹出框的操作句柄
alert = driver.switch_to.alert
time.sleep(3)

# 关闭alert
alert.accept()

time.sleep(5)
driver.quit()
  • 向alect框中输入信息
from selenium import webdriver
import time
import os
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
url = "file:///D:/Java_sprint/cs/selenium2html/send.html"
driver.get(url)
driver.maximize_window()
time.sleep(3)

driver.find_element_by_tag_name("input").click()
time.sleep(3)
# 先获得弹出框的操作句柄
alert = driver.switch_to.alert
# 向alert框输入消息
alert.send_keys("20岁")

time.sleep(4)
# 关闭信息展示弹框
alert.accept()

time.sleep(6)

driver.quit()
12.DIV对话框的处理
from selenium import webdriver
import time
import os
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
url = "file:///D:/Java_sprint/cs/selenium2html/modal.html"
driver.get(url)
driver.maximize_window()
time.sleep(3)

# 点击click 出现弹框
driver.find_element_by_link_text("Click").click()
time.sleep(3)

# 点击div 框框里面的click me,让弹出框内容发生变化
div1 = driver.find_element_by_class_name("modal-body")
div1.find_element_by_link_text("click me").click()
time.sleep(4)

# 定位div 在定位具体的button
div2 = driver.find_element_by_class_name("modal-footer")
# 使用数组的方式定义
buttons = driver.find_elements_by_tag_name("button")
buttons[0].click()
time.sleep(6)

driver.quit()


13.上传文件操作
from selenium import webdriver
import time
import os

# 上传文件

driver = webdriver.Chrome()
url = "file:///D:/Java_sprint/cs/selenium2html/upload.html"
driver.get(url)
driver.maximize_window()
time.sleep(3)

# 上传文件,send_keys-文件的绝对路径
driver.find_element_by_name("file").send_keys("D:/Java_sprint/cs/selenium2html/upload.html")

time.sleep(6)
driver.quit()

性能测试

性能测试,就是通过性能测试工具模拟正常、峰值及异常负载状态下对系统的各项性能指标进行测试的活动。

性能测试指标

1. 响应时间:系统对用户请求做出回应所需要的时间
2. 吞吐量:单位时间内**系统能够完成的工作量**,它衡量的是**软件系统服务器的处理能力**。 
3. 并发用户数:并发用户数是指同一时间请求和访问的用户数量。
4. `TPS` (Transaction per Second):指系统每秒钟能够处理的事务和交易的数量,它是衡量系统处理能力的重要指标。
5. 点击率:点击率是指用户每秒向 Web 服务器提交的 HTTP 请求数,这个指标是 Web 应用特有的一个性能指标,通过点击率可以评估用户产生的负载量,并且可以判断系统是否稳定。点击率只是一个参考指标,帮助衡量 Web 服务器的性能。
6. 资源利用率:资源利用率是指软件对系统资源的使用情况,包括CPU利用率、内存利用率、磁盘利用率等,资源利用率是分析软件性能瓶颈的重要参数。

性能测试的测试过程😎

测试计划- 测试需求(性能测试的指标)- 录制性能测试脚本- 运行性能测试场景- 根据测试数据分析指标- 优化系统的性能

性能测试的类型
  1. 负载测试
  2. 压力测试
  3. 并发测试
  4. 配置测试
  5. 可靠性测试
  6. 容量测试

测试简历的书写

测试技能:
  1. 掌握软件测试的流程,和软件测试的基本概念。
  2. 掌握黑盒测试的方法,比如等价类,边界值,因果图等。
  3. 掌握selenium工具,常见的webdriver API
  4. 掌握unittest框架的使用,并且有实战经验
  5. 掌握数据驱动DDT
  6. 了解性能测试的基本概念,知道性能测试的各项指标。
  7. 掌握测试用例编写方法,并且有实战经验 项目
项目测试

1,对XX项目的界面,功能,兼容性,易用性测试等。写测试用例,Excel表格2,对项目的XX功能进行了自动化测试,用于迭代回归测试。 如果做性能测试了 3,对项目的XX功能做了性能测试,并发量,运行时间,指标为∶lPS:谷叮里:………如果进行了单元测试 4,在开发过程中对XX单元模块使用Junit框架进行了单元测试。