目录
按照执行方式分类
静态测试
动态测试
按照测试方法
灰盒测试
按照测试阶段分类
单元测试
集成测试
系统测试
冒烟测试
回归测试
按照执行方式分类
静态测试
所谓静态测试就是不实际运行被测软件,只是静态地检查程序代码, 界面或文档中可能存在错误的过程.
不以测试数据的执行而是对测试对象的分析过程, 仅通过分析或检查源程序的设计, 内部结构, 逻辑, 代码风格和规格等来检查程序的正确性.
常见的静态测试有代码走查, 代码扫描工具等.
动态测试
动态测试, 指的是实际运行被测程序, 输入相应的测试数据, 检查实际输出结果和预期结果是否相符的过程. 所以判断一个测试是否属于静态还是动态, 唯一的方式就是看是否运行了程序.
大多数软件测试工作都是动态测试.(毕竟很少人跟葫芦娃二娃一样, 眼睛比较好(doge), 眼过千遍不如手过一遍).
按照测试方法
之前在测试用例中讲了黑盒测试和白盒测试, 这里就不讲了, 呃呃呃....真的很喜欢摸鱼......
灰盒测试
灰盒测试, 是介于白盒测试和黑盒测试之间的一种测试, 灰盒测试多用于集成阶段, 不仅关注输入, 输出的正确性, 同时也关注程序内部的情况.
但是灰盒测试没有白盒测试详细和完整, 黑盒测试是覆盖产品范围最广的测试, 因此回合测试甚至不能替代黑盒测试, 否则需要很大的代价, 设计非常多的用例.
面试题: 你知道的测试方法有哪些?哪种用的比较多?
常见的测试方法有黑盒测试, 白盒测试和灰盒测试. 开发人员主要用白盒测试和灰盒测试, 测试人员主要用白盒测试和灰盒测试, 相比于白盒测试, 黑盒测试用的更多一些.
按照测试阶段分类
单元测试
与编码同步进行, 针对软件最小组成单元进行测试, 主要采用白盒测试方法, 从被测对象的内部结构出发设计测试用例.
到底怎么才算"最小单元"呢? 最小单元是认为定义的, 一个方法, 一个类都可以理解为"最小单元".
测试阶段: 编码后或编码前.
测试对象: 最小模块.
测试人员: 白盒测试工程师或者开发工程师.
测试依据: 代码和注释 + 详细设计文档.
测试方法: 白盒测试.
测试内容: 模块接口测试, 局部数据结构测试, 路径测试, 错误处理测试, 边界测试.
下面根据这个冒泡排序, 我们设计一个简单的单元测试:
import java.util.*;public class Main {public static void bubbleSort(int[] arr) {int n = arr.length;for(int i = 0; i < n; i++) {for(int j = 0; j < n - i - 1; i++) {if(arr[j] > arr[j + 1]) {int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}public static void main(String[] args) {//排序无序数组Test01();//排序有序数组Test02();//排序空数组Test03();//排序重复数字的数组Test04();}private static void Test04() {int[] act_array1 = {1, 1, 29, 12, 12, 9, 9};int[] act_array2 = {1, 1, 9, 9, 12, 12, 29};//排序无序数组bubbleSort(act_array1);//判断两个数组内容是不是一样boolean isSame = Arrays.equals(act_array1, act_array2);if(isSame == false) {System.out.println("测试不通过");} else {System.out.println("测试通过");}}private static void Test03() {int[] act_array1 = {};int[] act_array2 = {};//排序无序数组bubbleSort(act_array1);//判断两个数组内容是不是一样boolean isSame = Arrays.equals(act_array1, act_array2);if(isSame == false) {System.out.println("测试不通过");} else {System.out.println("测试通过");}}private static void Test02() {int[] act_array1 = {1, 2, 3, 4, 5};int[] act_array2 = {1, 2, 3, 4, 5};//排序无序数组bubbleSort(act_array1);//判断两个数组内容是不是一样boolean isSame = Arrays.equals(act_array1, act_array2);if(isSame == false) {System.out.println("测试不通过");} else {System.out.println("测试通过");}}private static void Test01() {int[] act_array1 = {64, 34, 25, 12, 22, 11, 90};int[] act_array2 = {11, 12, 22, 25, 34, 64, 90};//排序无序数组bubbleSort(act_array1);//判断两个数组内容是不是一样boolean isSame = Arrays.equals(act_array1, act_array2);if(isSame == false) {System.out.println("测试不通过");} else {System.out.println("测试通过");}}
}
细心的伙伴可能发现了, 这个程序跑出来是错的.(我偷偷把j++写成i++了, 没想到吧hhhhh)
java中也有很多单元测试框架, 如JUnit, JUnit提供了非常多注解和断言函数, 有效提升单元测试脚本的效率.
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;public class JUnitTest2 {@Testpublic void testBubbleSort() {//测试用例: 正常情况下的冒泡排序int[] arr = {5, 3, 9, 1, 5};int[] expected = {1, 3, 5, 7, 9};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}@Testpublic void testBubbleSortEmptyArray() {//测试用例: 空数组的冒泡排序int[] arr = {};int[] expected = {};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}@Testpublic void testBubbleSortAlreadySorted() {//测试用例: 已经排序后的数组, 排序时应保持不变.int[] arr = {5, 3, 9, 1, 7};int[] expected = {1, 3, 5, 7, 9};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}
}
运行结果:
发现排序正确的没有信息, 而排序不正确的则报错了(呃呃...实际上是我把用例故意写错了)
集成测试
集成测试也称联合测试(联调), 组装测试, 将程序模块采用适当的集成策略组装起来, 对系统的接口及集成后的功能进行正确性检测的测试工作. 集成的主要目的是检查软件单位之间的接口是否正常.
测试阶段: 一般单元测试之后进行.
测试对象: 模块间的接口.
测试人员: 白盒测试工程师或开发工程师.
测试依据: 单元测试的模块+概要设计文档.
测试方法: 黑盒测试和白盒测试相组合.
测试内容: 模块之间的数据传输, 模块之间的冲突, 模块组装功能的正确性, 全局数据结构, 单模块缺陷对系统的影响.
系统测试
对通过集成测试的系统进行整体测试, 验证系统功能性和非功能性需求的实现.
测试阶段: 集成测试通过之后
测试对象: 整个系统(软, 硬件)
测试人员: 黑盒测试工程师
测试依据: 需求规格说明文档
测试方法: 黑盒测试
测试内容: 功能, 界面, 可靠性, 安全性, 性能, 兼容性, 易用性.
冒烟测试
这一术语来自硬件行业. 对一个硬件组件进行更改或修复以后, 直接给设备加电. 如果没有冒烟, 则该组件就通过了测试. 在软件中, "冒烟测试"这一术语描述的是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程. 在检查了代码后, 冒烟测试是确定和修复软件缺陷最经济有效的方法. 冒烟测试设计用于确认代码中的更改会按预期运行, 且不会破坏整个版本的稳定性.
冒烟测试的对象是每一个新编译的需要正式测试的软件版本, 目的是确认软件主要功能和核心流程正常, 在正式进行系统测试之前执行. 冒烟测试一般在开发人员开发完毕后提交给测试人员来进行测试时, 先进行冒烟测试, 保证基本功能正常, 不阻碍后面的测试.
如果冒烟测试通过, 则测试人员开始进行正式的系统测试, 如果不通过,则测试人员可以让开发人员重新修复代码直到冒烟测试通过, 再进行系统测试.
在生活中,
购买一个电视, 首先会通电, 查看电视是否正常运行.
购买一个水杯, 首先会装水, 查看水杯是否漏水.
回归测试
回归测试是指修改了旧代码之后, 重新进行测试以确认修改没有引入新的错误或导致其它代码产生错误.
在整个软件测试的过程中占有很大的工作量比重, 软件开发的各个阶段都会进行多次回归测试. 随着系统的庞大, 回归测试的成本越来越大, 通过选择正确的回归测试策略来改进回归测试的效率和有效性有很大意义.
回归测试主要由人工测试和自动化测试进行.
在实际工作中, 回归测试需要反复进行, 当测试者一次又一次地完成相同的测试时, 这些回归测试将会变得非常厌烦, 而在大多数回归测试需要手工完成的时候尤其如此, 因此, 需要通过自动测试来实现重复的和一致的回归测试. 通过测试自动化可以提高回归测试效率. 为了支持多种回归测试策略, 自动测试工具应该是通用和灵活的, 以便满足达到不同回归测试目标的要求.
写到这电脑没电了, 下一期更.