当前位置: 首页 > news >正文

软件测试(平铺版本)

目录

黑盒测试:

定义:

示例:登录功能的黑盒测试

适合使用黑盒测试的情况

几种常见的黑盒测试方法:

1. 等价类划分(Equivalence Partitioning)

2. 边界值分析(Boundary Value Analysis)

3. 决策表测试(Decision Table Testing)

4. 状态迁移测试(State Transition Testing)

5. 场景测试(Scenario Testing)

6. 错误推测(Error Guessing)

常用的黑盒测试工具:

白盒测试:

定义:

示例:成绩计算函数的白盒测试

测试用例

适合使用白盒测试的情况

几种常见的白盒测试方法:

1. 语句覆盖(Statement Coverage)

2. 分支覆盖(Branch Coverage)

3. 路径覆盖(Path Coverage)

4. 条件覆盖(Condition Coverage)

5. 多条件覆盖(Multiple Condition Coverage)

6. 循环覆盖(Loop Coverage)

7. 数据流测试(Data Flow Testing)

常用的白盒测试工具

面试问题:

项目用例类(功能测试):

工作流程类

测试流程


黑盒测试:

定义:

  • 黑盒测试专注于软件的功能性,不考虑内部代码实现。测试人员通过输入和输出来验证软件功能是否符合预期。

应用场景:

黑盒测试用例主要关注软件的功能性,不考虑内部实现。测试用例通常基于需求文档或用户故事来编写。

示例:登录功能的黑盒测试

假设我们在测试一个简单的用户登录功能,功能需求如下:

  • 用户可以输入用户名和密码进行登录。
  • 用户名和密码必须非空。
  • 若输入正确的用户名和密码,用户成功登录,进入主页。
  • 若用户名或密码错误,显示错误信息。
  • 若用户名或密码为空,显示提示信息。

适合使用黑盒测试的情况

  1. 功能验证

    • 当你需要验证软件功能是否符合需求和用户期望时,黑盒测试是理想选择。这包括功能测试、界面测试、用户体验测试等。
  2. 用户视角测试

    • 黑盒测试模拟用户实际操作,不需要了解内部代码,是从用户视角出发进行的测试。
  3. 系统级别的集成测试

    • 当你需要测试不同模块或系统之间的交互时,黑盒测试可以帮助验证集成点是否工作正常。
  4. 回归测试

    • 在软件发生变化或修复缺陷后,黑盒测试常用于回归测试,确保新代码没有引入新的问题。
  5. 验收测试

    • 在项目交付之前进行的最终测试,常用黑盒测试来验证软件是否满足合同或需求文档的所有要求。

几种常见的黑盒测试方法:

1. 等价类划分(Equivalence Partitioning)

**描述**:
将输入数据划分为若干个等价类,每个等价类中的数据在功能上是等效的。测试只需选择每个等价类中的一个代表作为测试用例。

**示例**:
假设有一个输入字段要求用户输入1到100之间的整数。那么可以将输入数据划分为以下等价类:
- 有效等价类:1-100
- 无效等价类:小于1、大于100、非整数输入

2. 边界值分析(Boundary Value Analysis)

**描述**:
边界值分析侧重于测试输入数据的边界值,因为边界值往往是错误的高发区。测试通常选取边界值以及边界值的附近值。

**示例**:
在前述1到100之间的整数输入场景中,边界值可以是:
- 边界值:1, 100
- 边界附近值:0, 2, 99, 101

3. 决策表测试(Decision Table Testing)

**描述**:
决策表是一种系统地表示和分析复杂业务规则的方法,适用于有多种输入条件组合的情况。决策表列出了所有可能的输入条件及其对应的输出。

**示例**:
假设一个登录系统有两个输入条件:用户名和密码。决策表可能如下:
| 用户名有效 | 密码有效 | 输出           |
|------------|----------|----------------|
| 否         | 否       | 登录失败       |
| 否         | 是       | 登录失败       |
| 是         | 否       | 登录失败       |
| 是         | 是       | 登录成功       |

4. 状态迁移测试(State Transition Testing)

**描述**:
状态迁移测试适用于具有不同状态和状态之间转换的软件系统。通过测试不同状态之间的转换,确保系统在不同状态下的行为正确。

**示例**:
一个简单的自动售货机可以有以下状态:
- 空闲
- 接受硬币
- 选择商品
- 退币
- 出货

状态迁移测试会验证在每个状态下的行为以及状态之间的转换。

5. 场景测试(Scenario Testing)

**描述**:
场景测试通过模拟用户的实际使用场景,来验证软件在真实使用情况下的工作情况。这种方法特别适合用户体验和集成测试。

**示例**:
对于一个电商网站的购物车功能,一个测试场景可能包括:
- 用户登录
- 浏览商品
- 添加商品到购物车
- 修改购物车中的商品数量
- 结算并支付

6. 错误推测(Error Guessing)

**描述**:
错误推测依赖于测试人员的经验和直觉,通过推测可能发生错误的地方来设计测试用例。这种方法常用于发现潜在的隐蔽错误。

**示例**:
测试人员可能会猜测在用户输入特殊字符(如`$`、`%`、`#`)或极端数据(如空字符串、极长字符串)时,系统可能会出现问题。

### 7. 正交排列测试(Orthogonal Array Testing)

**描述**:
正交排列测试是一种系统的测试方法,用于减少测试用例的数量而不降低测试覆盖率。它通过数学模型来选择能覆盖所有参数组合的最小测试集。

**示例**:
假设有三个输入参数,每个参数有三个可能的值。正交排列测试会选择一组测试用例,使得所有参数组合尽可能被覆盖。

常用的黑盒测试工具:

Selenium:用于Web应用的自动化测试。
QTP/UFT:用于功能和回归测试的自动化工具。
Postman:用于API测试。
JMeter:用于性能测试和负载测试。

白盒测试:

定义:

  • 白盒测试关注软件的内部结构和实现,测试人员需要了解代码逻辑,重点在于代码路径、循环和条件。

应用场景:

白盒测试用例关注软件的内部实现,测试代码逻辑、分支和路径。通常基于代码结构编写。

示例:成绩计算函数的白盒测试

假设我们在测试一个计算学生成绩的函数,代码如下:

def calculate_grade(score):if score >= 90:return "A"elif score >= 80:return "B"elif score >= 70:return "C"elif score >= 60:return "D"else:return "F"
测试用例

用例1:成绩为95

  • 用例编号:WBT001
  • 用例名称:成绩为95
  • 前置条件:无
  • 测试步骤
    1. 调用函数calculate_grade,传入参数95
  • 预期结果
    • 返回"A"

适合使用白盒测试的情况

  1. 单元测试

    • 白盒测试广泛用于单元测试,开发人员对代码的每个单元(如函数、方法)进行彻底检查,确保逻辑正确。
  2. 代码覆盖率

    • 当你需要确保代码的所有路径、分支和条件都被测试覆盖时,白盒测试是必不可少的。
  3. 性能优化

    • 在需要进行代码优化或性能调优时,通过白盒测试可以深入了解代码的执行路径和瓶颈。
  4. 安全测试

    • 需要验证内部实现是否存在安全漏洞(如SQL注入、缓冲区溢出)时,白盒测试可以检查代码的潜在风险点。
  5. 复杂逻辑验证

    • 对于包含复杂算法或业务逻辑的代码,白盒测试有助于全面验证逻辑的正确性和健壮性。

几种常见的白盒测试方法:

1. 语句覆盖(Statement Coverage)

**描述**:
语句覆盖测试的目标是确保程序中的每个语句至少被执行一次。通过这种方式,可以发现一些基本的语法错误和异常。

**示例**:
```python
def check_even_odd(num):
    if num % 2 == 0:
        return "Even"
    else:
        return "Odd"
```
测试用例:
- 输入4,得到"Even"
- 输入5,得到"Odd"

2. 分支覆盖(Branch Coverage)

**描述**:
分支覆盖测试的目标是确保程序中每个条件分支(如`if`和`else`)至少被执行一次。通过测试所有分支路径,可以检查条件判断的正确性。

**示例**:
```python
def check_positive_negative(num):
    if num > 0:
        return "Positive"
    elif num < 0:
        return "Negative"
    else:
        return "Zero"
```
测试用例:
- 输入1,得到"Positive"
- 输入-1,得到"Negative"
- 输入0,得到"Zero"

3. 路径覆盖(Path Coverage)

**描述**:
路径覆盖测试的目标是确保程序中所有可能的执行路径都被测试过。这种方法比分支覆盖更严格,因为它不仅检查分支,还检查分支的组合路径。

**示例**:
```python
def complex_condition(a, b):
    if a > 0:
        if b > 0:
            return "A and B are positive"
        else:
            return "A is positive, B is non-positive"
    else:
        return "A is non-positive"
```
测试用例:
- 输入a=1, b=1,得到"A and B are positive"
- 输入a=1, b=-1,得到"A is positive, B is non-positive"
- 输入a=-1, b=1,得到"A is non-positive"

4. 条件覆盖(Condition Coverage)

**描述**:
条件覆盖测试的目标是确保每个条件表达式的每个布尔子表达式都至少取过一次`True`和一次`False`值。这种方法可以发现复杂逻辑中的问题。

**示例**:
```python
def check_conditions(a, b):
    if (a > 0 and b > 0):
        return "Both positive"
    else:
        return "One or both non-positive"
```
测试用例:
- 输入a=1, b=1,得到"Both positive"
- 输入a=1, b=-1,得到"One or both non-positive"
- 输入a=-1, b=1,得到"One or both non-positive"
- 输入a=-1, b=-1,得到"One or both non-positive"

5. 多条件覆盖(Multiple Condition Coverage)

**描述**:
多条件覆盖测试的目标是确保每个条件表达式中所有可能的布尔子表达式组合都被测试过。这种方法比条件覆盖更严格。

**示例**:
```python
def check_multi_conditions(a, b):
    if (a > 0 or b > 0):
        return "At least one positive"
    else:
        return "Both non-positive"
```
测试用例:
- 输入a=1, b=1,得到"At least one positive"
- 输入a=1, b=-1,得到"At least one positive"
- 输入a=-1, b=1,得到"At least one positive"
- 输入a=-1, b=-1,得到"Both non-positive"

6. 循环覆盖(Loop Coverage)

**描述**:
循环覆盖测试的目标是确保程序中的每个循环结构(如`for`、`while`)在不同的循环次数下(如0次、1次、多次)都被测试过。这种方法有助于发现循环相关的错误。

**示例**:
```python
def sum_up_to(n):
    total = 0
    for i in range(n):
        total += i
    return total
```
测试用例:
- 输入n=0,循环执行0次
- 输入n=1,循环执行1次
- 输入n=5,循环执行多次

7. 数据流测试(Data Flow Testing)

**描述**:
数据流测试的目标是检查程序中变量的定义和使用是否正确。它关注变量在代码中的生命周期,从定义、赋值到最后使用。

**示例**:
```python
def compute_sum(a, b):
    sum = a + b  # 定义和赋值
    return sum  # 使用
```
测试用例:
- 输入a=2, b=3,检查sum的定义和使用

常用的白盒测试工具

JUnit:用于Java应用的单元测试框架。
pytest:用于Python应用的单元测试框架。
CUnit:用于C语言的单元测试框架。
Emma、Jacoco**:用于Java的代码覆盖率分析工具。
gcov:用于C/C++代码覆盖率分析。

白盒测试方法多种多样,每种方法都有其特定的目标和适用场景。通过合理选择和组合这些测试方法,可以深入验证软件的内部逻辑和实现,确保代码的质量和可靠性。

面试问题:

项目用例类(功能测试):

通过场景法和等价类划分,详细讲解了如何针对功能点设计测试用例,特别是针对淘宝购物车等常见功能的测试设计。

给你一个功能让你去设计测试用例?

微信发红包?

淘宝购物车?

你发现的最严重的bug

边界值问题?第三方接口问题?

遇见的最印象深刻的bug?

之前的测试因为偷懒只测试了一天的发放数据,没有去跑批,小伙伴们切记,跟时间周期相关的功能一定要多跑几个周期

工作流程类

详细介绍了从需求评审到项目上线的整个测试流程,包括测试计划的制定、测试用例的编写、bug的跟踪和测试报告的编写。

之前的测试因为偷懒只测试了一天的发放数据,没有去跑批,小伙伴们切记,跟时间周期相关的功能一定要多跑几个周期

测试流程

产品组织开发和测试进行需求评审(熟悉需求或提意见),
制定测试计划(什么人、怎么测试、测试多久),
开发完成接口后制作接口测试,
功能测试(提BUG、修复BUG),
专项测试(弱网测试、兼容测试、安全测试、回归测试)
编写测试报告
线上发布后再进行线上验证测试
注:功能测试可展开为:

有效情况、无效情况(商品限购后还是否能继续添加),边界值测试

**处理开发不认可的bug**:提供了不同情况下的应对策略,如通过演示bug、与开发领导沟通或寻求产品明确需求等方法。
- 📈 **应对产品需求变更**:讨论了在不同时间点遇到需求变更时的应对措施,包括建议延期发布、在测试报告中记录变更影响等。

测试技术类

相关文章:

软件测试(平铺版本)

目录 黑盒测试&#xff1a; 定义: 示例&#xff1a;登录功能的黑盒测试 适合使用黑盒测试的情况 几种常见的黑盒测试方法&#xff1a; 1. 等价类划分&#xff08;Equivalence Partitioning&#xff09; 2. 边界值分析&#xff08;Boundary Value Analysis&#xff09; …...

树控件QTreeWidget

树控件跟表格控件类似&#xff0c;也可以有多列&#xff0c;也可以只有1列&#xff0c;可以有多行&#xff0c;只不过每一行都是一个QTreeWidgetItem&#xff0c;每一行都是一个可以展开的树 常用属性和方法 显示和隐藏标题栏 树控件只有水平标题栏 //获取和设置标题栏的显…...

Python酷库之旅-第三方库Pandas(139)

目录 一、用法精讲 626、pandas.plotting.scatter_matrix方法 626-1、语法 626-2、参数 626-3、功能 626-4、返回值 626-5、说明 626-6、用法 626-6-1、数据准备 626-6-2、代码示例 626-6-3、结果输出 627、pandas.plotting.table方法 627-1、语法 627-2、参数 …...

昇思学习打卡营学习记录:CycleGAN壁画修复

按照提示&#xff0c;运行实训代码 进入实训平台&#xff1a;https://xihe.mindspore.cn/projects 选择“jupyter 在线编辑器” 启动“Ascend开发环境” &#xff1a;Ascend开发环境需要申请&#xff0c;大家可以申请试试看 启动开发环境后&#xff0c;在左边的文件夹中&am…...

南京大学《软件分析》李越, 谭添——1. 导论

导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…...

使用seata管理分布式事务

做应用开发时&#xff0c;要保证数据的一致性我们要对方法添加事务管理&#xff0c;最简单的处理方案是在方法上添加 Transactional 注解或者通过编程方式管理事务。但这种方案只适用于单数据源的关系型数据库&#xff0c;如果项目配置了多个数据源或者多个微服务的rpc调用&…...

浏览器指纹

引言 先看下 官网 给的定义。 WebAssembly (abbreviatedWasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server …...

W外链平台有什么优势?

W外链作为一种短网址服务&#xff0c;具备多项功能和技术优势&#xff0c;适用于多种场景&#xff0c;以下是其主要特点和优势&#xff1a; 短域名与高级设置&#xff1a;W外链提供了非常短的域名&#xff0c;这有助于提高用户体验&#xff0c;使其在社交媒体分享时更加便捷。…...

深入理解Spring Cache:加速应用性能的秘钥

一、什么是Spring Cache&#xff1f; Spring Cache是Spring框架中的一部分&#xff0c;它为应用提供了一种统一的缓存抽象&#xff0c;可以轻松集成各种缓存提供者&#xff08;如Ehcache、Redis、Caffeine等&#xff09;。通过使用Spring Cache&#xff0c;开发者可以在方法上…...

C语言入门基础题(力扣):完成旅途的最少时间(C语言版)

1.题目&#xff1a; 给你一个数组 time &#xff0c;其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。 每辆公交车可以 连续 完成多趟旅途&#xff0c;也就是说&#xff0c;一辆公交车当前旅途完成后&#xff0c;可以 立马开始 下一趟旅途。每辆公交车 独立 …...

基于LORA的一主多从监测系统_0.96OLED

关联&#xff1a;0.96OLED hal硬件I2C LORA 在本项目中每个节点都使用oled来显示采集到的数据以及节点状态&#xff0c;OLED使用I2C接口与STM32连接&#xff0c;这个屏幕内部驱动IC为SSD1306&#xff0c;SSD1306作为从机地址为0x78 发送数据&#xff1a;起始…...

C#系统学习路线

分享一个C#程序员的成长学习路线规划&#xff0c;希望能够帮助到想从事C#开发的你。 我一直在想&#xff0c;初学者刚开始学习编程时应该学些什么&#xff1f;学习到什么程度才能找到工作&#xff1f;才能在项目中发现和解决Bug&#xff1f; 我不知道每位初学者在学习编程时是…...

UI开发:从实践到探索

UI开发&#xff1a;从实践到探索 参考博客文章&#xff1a;https://blog.jim-nielsen.com/2024/sanding-ui/ 在现代web开发中&#xff0c;用户界面&#xff08;UI&#xff09;的重要性不言而喻。一个优秀的UI不仅能提升用户体验&#xff0c;还能直接影响产品的成功。 UI开发…...

操作系统 | 学习笔记 | 王道 | 3.1 内存管理概念

3 内存管理 3.1 内存管理概念 3.1.1 内存管理的基本原理和要求 内存可以存放数据&#xff0c;程序执行前需要先放到内存中才能被CPU处理—缓和cpu和磁盘之间的速度矛盾 内存管理的概念 虽然计算机技术飞速发展&#xff0c;内存容量也在不断扩大&#xff0c;但仍然不可能将所有…...

Unity射线之拾取物体

实现效果&#xff1a; 可以移动场景内物品放置到某个位置。通过射线检测&#xff0c;点击鼠标左键&#xff0c;移动物体&#xff0c;再点击左键放下物体。 效果&#xff1a; 移动物体 实现思路&#xff1a; 通过射线检测&#xff0c;将检测到的物体吸附到摄像机前的一个空物…...

Python的numpy库矩阵计算(数据分析)

一、创建矩阵 import numpy as np#创建矩阵anp.arange(15).reshape(3,5) bnp.arange(15,30).reshape(3,5) 使用arrange和reshape创建的二维数组就可以看成矩阵。 此时a和b存储的是&#xff1a; [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] [[15 16 17 18 19]…...

R语言的基本语句及基本规则

0x01 赋值语句 使用 “<-” 或 “” 进行赋值。例如&#xff1a; x <- 5 # 将数值 5 赋值给变量 x y 10 # 另一种赋值方式0x02 输出语句 使用 print() 函数输出内容。例如&#xff1a; print("Hello, R!") print(x)0x03 注释语句 任何在 #之后的内容在…...

网络受限情况下安装openpyxl模块提示缺少Jdcal,et_xmlfile

1.工作需要处理关于Excel文件内容的东西 2.用公司提供的openpyxl模块总是提示缺少jdcal文件,因为网络管控,又没办法直接使用命令下载&#xff0c;所以网上找了资源&#xff0c;下载好后上传到个人资源里了 资源路径 openpyxl jdcal et_xmlfile 以上模块来源于&#xff1a;Py…...

【算法】- 查找 - 散列表查询(哈希表)

文章目录 前言一、哈希表的思想二、哈希表总结 前言 散列技术&#xff1a;在记录的存储位置和它的关键字之间建立一个确定的对应关系f&#xff0c;使得每个关键字key对应一个存储位置f(key) 哈希表&#xff1a;采用散列技术将记录存储在一块连续的存储空间中&#xff0c;这块连…...

货币政策工具

本文为个人学习笔记&#xff0c;内容源于教材&#xff1b;整理记录的同时也作为一种分享。 1. 简介 货币政策工具作为央行实现货币政策目标的经济手段&#xff0c;以期达到最终目标&#xff0c;即物价稳定&#xff0c;充分就业&#xff0c;经济增长&#xff0c;国际收支平衡。…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...