软件测试
定义:使用人工和自动手段来运行或测试某个系统的过程 目的:以最小的人力、物力和时间找出软件中潜在的错误和缺陷
原则
- 软件测试是为了证明有缺陷存在
- 测试中不能进行穷尽测试
- 软件测试应该尽早介入
- 28原则,用户大多只使用得到软件20%的功能,这20%应该重点测试,80%的bug都出现在这20%功能上
- 所有程序都存在缺陷,要么没发现,要么不影响功能
- 不同项目应该使用不同测试方法,如娱乐软件和管理系统
- 妥善保存所有测试文档,以备后期可能使用的情况
标准
- 国际标准:ISO25010
- 国内标准:GBT18905
测试基本要求
- 外观界面测试
- 易用测试
- 兼容性测试
- 安全性测试
- 性能测试
- 功能测试(重要)
bug由来:以前计算机很大,美国军事计算机(马克一号)钻进了一只虫子,被电死了,尸体使计算机出现问题了问题。
测试流程:
-
需求分析 阅读产品文档、分析需求点、参与需求评审、快速熟悉项目 -
测试计划和测试方案 测试计划:测试范围、进度安排、人力物力安排、整体测试策略、风险评估、分析规避(5W) 测试方案:被测试目标、选取测试工具、测试方法、测试重点 -
测试用例设计 边界值、等价类… -
测试用例执行 -
评估阶段、测试报告
开发模式
瀑布模型、增量模型、快速模型、螺旋开发模型、迭代开发模型、敏捷开发模型
测试模型
V模型
- 优点:每一个阶段都清晰明了,便于控制开发的每一个过程,既包含单元测试又包含系统测试
- 缺点:测试介入较晚,对于前期的一些缺陷无法发现和修改测试和开发串行,总用时较长
W模型
- 优点:测试伴随软件的整个生命周期,测试于开发是独立并行运行
- 缺点:对需求和测试技术要求高,适用于中大型企业
软件测试分类
图是盗的,具体是谁的忘了[doge]
测试用例
**特性:**有效性、可复用性、易组织性、可评估性、可管理型
测试用例八大要素
-
测试用例编号 编号由字符和数字组合成的字符串.用例编号具有唯一性、容易识别 -
测试项目/模块 测试的项目属于哪个项目或者被测试的需求、被测的模块、被测的单元等等 -
预置条件 前测试用例需要的前提条件,如果前提条件不满足.则后面的测试步骤不能进行或者得不到预期结果 -
测试输入 测试用例执行过程中需要加工的外部信息.根据测试用例的具体条件有手工输入、数据库等 -
预期输出 测试用例的预期输出结果.包括返回值内容、界面响应结果等. -
操作步骤 执行当前测试用例需要经过的操作步骤,需要明确的给出一个步骤的描述,测试用例执行人员可以根据该步骤完成测试用例执行 -
测试用例标题 对测试用例的简单描述。用概括的语言描述该测试用例的测试点。每个测试用例的标题不能够重复,因为每个测试用例的测试点是不一样的。 -
级别 高级别:保证系统基本功能、核心业务、重要特性、实际使用频率比较高的用例 中级别:重要程度介于高和低之间的测试用例 低级别:实际使用的频率不高,对系统业务功能影响不大的模块或功能的测试用例
其他要素:
- 用例的设计者:能准确找到测试用例的设计人员,对用例修改时能方便找到人员
- 用例设计日期:方便检查用例的设计进度
- 对应的开发人员:出现bug后能及时找到相应的人员进行修复
- 测试结果:执行用例最后执行的结果,包括:pass、fail、block
- 测试类型:功能、性能、压力等等
测试用例设计原则
明确性、代表性、简洁性
测试方法
等价划分法(常用、重要的黑盒测试方法)
定义:把所有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据作为测试用例。使用等价类划分方法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。它将不能穷举的测试过程进行合理分类,从而保证设计出来的测试用例具有完整性和代表性。
类型划分:
-
有效等价类 有效等价类是指对对于程序的规格说明来说是合理的、有意义的输入数据构成的集合.利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能. -
无效等价类 无效等价类指对程序的规格说明是不合理的、无意义的输入数据所构成的集合。对于具体的问题,无效等价类至少应有一个,也可能有多个。利用无效等价类可校验程序对于无效数据的处理能力.检测程序的健壮性、容错能力
设计测试用例步骤
- 确定需求
- 确定有效等价类和无效等价类
- 对每条等价类设计测试用例
案例
边界值法(黑盒测试方法)
定义:边界值分析法就是对输入或输出边界值进行测试的.也是一种黑盒测试.边界值分析法通常作为等价类划分法的补充.其测试用例来自等价类的边界;长期的经验得知.大量的错误是发现在输入或输出范围的边界上,而不是发生再输入输出范围的内部,因此针对各种边界情况设计测试用例,可以查出更多错误.
**和等价划分法区别:**等价划分法可以选等价范围内任意一个数据做代表,边界值法要求每个边界值都作为测试条件,而且边界值法纪要考虑输入条件也要考虑输出条件
常见边界值:
如区间[12,33],12和33都为上点,小于12大于13为离点,分为内的是内点
- 边界点(上点):输入范围内的边界点
- 离点:离边界点最近的点
- 内点:输入范围内任意一个点
步骤:
- 明确需求
- 确定有效和无效等价类
- 明确输入条件的边界值
- 编写测试用例
因果图法
定义:因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况
特点:
- 考虑输入条件的相互制约及组合关系
- 考虑输出条件对输入条件的依赖关系
图字母含义
E:约束、I:包含、M:强制、O:唯一、R:要求
步骤
- 找出所有的原因,原因即输入条件或输入条件的等价类。
- 找出所有的结果,结果即输出条件。
- 明确所有输入条件之间的制约关系以及组合关系。哪些条件不能组合到一起,哪些条件可以组合到一起
- 明确所有输出条件之间的制约关系以及组合关系。哪些输出结果不能同时输出,哪些输出结果可以同时输出
- 找出什么样的输入条件组合会产生哪种输出结果。
- 把因果图转换成判定表/决策表。
- 为判定表/决策表中的每一列表示的情况设计测试用例。
案例
系统需求
系统只接收50或100元纸币,一次只能使用一张纸币,一次充值金额只能为50元或100元; 若输入50元纸币,并选择充值50元,完成充值后退卡,提示充值成功; 若输入50元纸币,并选择充值100元,提示输入金额不足,并退回50元; 若输入100元纸币,并选择充值50元,完成充值后退卡,提示充值成功, 找零50元;若输入100元纸币,并选择充值100元,完成充值后退卡,提示充值成功; 若输入纸币后在规定时间内不选择充值按钮,退回输入的纸币,并提示错误; 若选择充值按钮后不输入纸币,提示错误
分析
输入:
- 输入50元
- 输入100元
- 选择充值50元
- 选择充值100元
- 条件1和条件2是不能组合
- 条件3和条件4是不能组合
- 条件1和条件3可以组合
- 条件1和条件4可以组合
- 条件2和条件3可以组合
- 条件2和条件4可以组合
- 条件1234是可以单独出现的
输出:
- 完成充值退卡
- 提示充值成功
- 找零
- 提示错误
- 结果1和结果2 是不能组合
- 结果2和结果4不能组合
- 结果1和结果2必须组合
- 结果123可以组合
- 结果3和结果4是可以组合
- 结果4可以单独出现
判断表法
定义:判定表也称决策表,是分析和表达多逻辑条件下执行不同操作的工具。它能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。因此,利用判定表能够设计出完整的测试用例集合。在一些数据处理问题当中,某些操作的实施依赖于多个逻辑条件的组合,即:针对不同逻辑条件的组合值,分别执行不同的操作。判定表适合于处理这类问题。
使用场景
适合于有多个输入和对个输出,输入和输出之间有相互的组合关系,输入输出之间有相互的制约和依赖关系
组成
- 条件桩(Condition Stub):列出了问题得所有条件。通常认为列出的条件的次序无关紧要。
- 动作桩(Action stub):列出了问题规定可能采取的操作。这些操作的排列顺序没有约束。
- 条件项(Condition Entry) :列出针对它左列条件的取值。在所有可能情况下的真假值。
- 动作项(Action Entry) :列出在条件项的各种取值情况下应该采取的动作。
步骤:
- 明确规则个数
- 列出所有条件桩和动作桩
- 填入条件项
- 填入动作项到初始判断表
- 简化合并相似规则
正交表法
**定义:**正交表法也叫正交实验法或者正交排列法.就是使用最小的测试过程集合获得最大的测试覆盖率.
步骤
- 根据需求把空间即其取值列举出来
- 根据空间和空间的取值个数,选择一个合适的正交表
- 根据控件的个数,选择正交表的次幂,也就是正交表中包含的最大值,例如.4个控件,选择4次幂
- 根据控件取值个数,选择正交表的底.,也就是正交表包含的最大值,例如,每个控件有3个取值,底是3
- 把控件及其取值映射到正交表中
- 把控件名字分别映射到正交表的列名位置
- 把正交表中每一列的数字分别用对应的控件取值替代
- 根据正交表,编写测试用例
场景法
**定义:**从起点,通过一系列操作步骤(事件),达成某一结果,到终点的过程测试。场景法主要用于冒烟测试。在通过了场景测试后,再通过其他方法进行更为细腻的测试。
流程分析法
**定义:**流程分析法主要是针对测试场景类型属于流程测试场景的测试项下的测试子项进行设计,是从白盒测试设计方法中的路径覆盖分析法借鉴过来的一种方法。在白盒测试中,路径就是指函数代码的某个分支组合,路径覆盖法需要构造足够的用例覆盖函数的所有代码路径。路径覆盖法:把所有测试条件写成测试用例,白盒是根据代码分支分析写测试用例在黑盒测试中,若将软件系统的某个流程看成路径的话,则可以针对该路径使用路径分析的方法设计测试用例。黑盒测试是看文档来写测试用例.,不需要看代码
使用场景:一般用于测试非常重要的系统(ATM机,医疗设备)
步骤
- 详细了解需求;
- 根据需求说明或界面原型,找出业务流程的各个页面以及各页面之间的流转关系;
- 画出业务流程;
- 写用例,覆盖所有的路径分支。
错误推断法
定义:错误推测法是:基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。
**基本思想:**根据经验.列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例。
**使用场景:**适用于项目时间比较短促,任务比较繁重的情况下,而且测试经验较多。
测试用例设计方法总结
测试用例本质(基本需求)
- 理解需求、反映需求,忠于需求
- 需求会变化,则测试用例也应该是活的,变化的
- “及时响应变更比遵循计划更有价值”
原则
- 根据程序的重要性和一旦发生故障带来的损失,来确定测试等级和测试重点
- 认真选择测试策略。用尽可能少的测试用例发现尽可能多的错误。测试用例不足则会导致风险的增大;测试过度导致资源的浪费。需要找到平衡点
方法选取
- 先关注主要功能也业务流程、业务逻辑是否正确实现,考虑场景法
- 需要输入数据的地方,考虑等价类划分法
- 在任何情况行都使用边界值法
- 如果程序的功能中包含输入条件的组合情况,则选取因果图和判定表法
- 对于配置类软件,需要考虑参数的组合情况,考虑使用正交排列法
- 对照程序逻辑,如果发现没有达到要求的覆盖标准。适当补充更多的测试用例
- 采用错误推断法,追加其他测试用例
缺陷报告原则
5C原则
- 准确:每个组成部分的描述准确不会引起误解。
- 简洁:只包含必不可少的信息,不包括任何多余的内容。
- 清晰:每个组成部分的描述清晰,易于理解。
- 完整:包含复现该缺陷的完整步骤和其他本质信息。
- 一致:按照一致的格式书写全部缺陷报告。
一个缺陷一个报告
移动测试
**定义:**测试手机程序
测试方面:
- 功能测试
- 安装卸载测试
- 升级测试
- 兼容性测试
- 网络切换、中断测试
- 使用中来电话、短信
- 横竖屏切换
- 健壮性:耗电量、流量消耗、崩溃回复
若无法连接:
- adb kill-server
- adb start-server
查看设备:
进入手机终端:
获取信息:
- adb shell getprop ro.build.version.release [获取手机Android版本]
- adb shell dumpsys window windows | findstr mFocusedApp [获取手机当前运行的程序和界面的名称]
其他:
文件传输:
- adb push 电脑上的文件 手机上的位置
- adb pull 手机上的位置 电脑上的文件
软件安装卸载
- adb install 电脑上的apk路径 安装应用
- adb uninstall 应用的包名
获取其他信息
- adb shell am start -w 包名/.启动名
基础操作API
driver
- close_app()关闭打开的应用
- quit()断开连接(后续不能发送指令了)
- install_app('apk在电脑的绝对路径)安装应用
- remove_app('应用的包名")卸载应用
- is_app_installed("‘应用的包名’)判断应用是否安装
- push_file(目标位置, base64编码的内容)
- pull_file(来源位置)返回值是base64编码的内容
- page_source 获取界面xml源码
- find_element… …
- find_elements…
- current_package获取当前操作的应用的包名
- current_activity 获取当前操作的界面的名称
element
- text 获取元素文本内容
- click()点击元素对应位置
- get_attribute(属性名称)获取属性值
- location获取元素左上角的坐标(相对于屏幕的左上角)
- size获取元素的宽高(字典)
单元测试
测试函数、类、或者函数能不能运行成功
pytest
自动发现规则
- 模块:从测试目录中递归寻找以test开头或者test结尾的py文件
- 类:再从符合条件的模块中查找以Test开头的类,且没有初始化"__ init__"方法
- 函数和方法:符合条件的模块或者类中以test开头的函数或方法
- 其他:会执行unittest定义的测试用例类
说明1
默认不显示程序中打印的信息,如果需要显示则添加-s参数
- py文件中:pytest.main([’-s’])
- 控制台中:pytest -s
说明2
不指定文件会默认执行所有测试文件,需要指定
- py文件中:pytest.main(["-s", “test_py2.py”])
- 控制台中:pytest -s test_py2.py
参数配置:
# 在py文件根目录创建pytest.ini文件
[pytest]
# 选项
addopts = -s
# 测试模块所在目录
testpaths = ./
# 测试模块文件名规则
python_files = test_*.py *test.py
# 测试类名称规则
python_classes = Test*
# 测试函数或者方法的名称规则
python_functions = test_*
标记
@pytest.mark.skip(reason='跳过')
@pytest.mark.xfail(raises=ZeroDivisionError)
参数化
@pytest.mark.parametrize(["a", "b"], [(1, 2), (10, 20), (20, 30), (30, 40), (40, 50), (50, 60), (60, 70), (70, 80)])
def test_a(a, b):
print("test_a===============")
assert a+b > 100
夹具:在测试之前和之后执行,用于固定测试环境,及清理回收测试资源
import pytest
def setup_module(args):
print('setup_module', args)
def teardown_module(args):
print('teardown_module', args)
def setup_function(args):
print('setup_function', args)
def teardown_function(args):
print('teardown_function', args)
def test_func_a():
print('----', 'test_func_a')
def test_func_b():
print('----', 'test_func_b')
class TestOne():
TAG = "~(o..o)~"
def setup_class(self):
print('=====', self.TAG + 'setup_class')
def teardown_class(self):
print('=====', self.TAG + 'teardown_class')
def setup_method(self):
print('+++++', self.TAG + 'setup_method')
def teardown_method(self):
print('+++++', self.TAG + 'teardown_method')
def test_1(self):
print('------', self.TAG + 'test_1')
def test_2(self):
print('------', self.TAG + 'test_2')
if __name__ == '__main__':
pytest.main(["-s", "test_py7.py"])
定义夹具
import pytest
@pytest.fixture()
def before():
print("before")
@pytest.fixture()
def login():
print("login")
return "user"
@pytest.mark.usefixtures("before")
def test_1():
print("test_1()")
def test_2(login):
print("test_2()", login)
@pytest.fixture(params=[1, 2, 3])
def init_data(request):
print("request", request.param)
return request.param
def test_Data(init_data):
assert init_data > 2
if __name__ == '__main__':
pytest.main(["-s", "test_py8.py"])
插件
生成html测试报告
pip install pytest-html
pytest --html=存储路径/report.html
[pytest]
addopts = -s --html=./report.html
指定执行顺序
pip install pytest-ordering
@pytest.mark.run(order=x)
失败重测:对于有外部依赖,可能会失败的函数,在失败后多试几次
pip install pytest-rerunfailures
[pytest]
addopts = -s --reruns 5
selenium
web应用程序测试工具
chormedriver下载:https://npmmirror.com/mirrors/chromedriver?spm=a2c6h.24755359.0.0.6d446093r5sxuZ
|