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

软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)

接前一篇文章:软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(1)

本文内容参考:

黑盒测试和白盒测试详解-CSDN博客

软件测试中的各种覆盖(Coverage)详解-CSDN博客

特此致谢!

二、白盒测试

1. 基本介绍

白盒测试也称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试,是一种动态分析法。白盒测试主要用于检测软件编码过程中的错误。程序员的编程经验、对编程软件的掌握程度、工作状态(编写代码时的精神状态)等因素都会影响到编程质量,导致代码错误。

软件程序基本的语法错误在程序调试时,就能够比较及时地发现,然后及时进行改正。但是软件程序在运算顺序、逻辑判断以及运行路径上的错误很难发现。在实际的软件程序代码编写上,没有程序员能够保证代码编写结构不出现任何错误,即使是水平很高的程序员也不能保证。白盒测试下,软件程序被看做是一个打开的盒子,盒子里有被测软件的源代码,还能够分析盒子内部的结构,所以这种测试方法能够全面地测试程序代码结构。

白盒测试方法一般遵循以下原则:

  • 保证一个模块中的所有独立路径至少被测试一次。
  • 所有逻辑值均需测试真(true)和假(false)两种情况。
  • 检查程序的内部数据结构,保证其结构的有效性。
  • 在上下边界及可操作范围内运行所有循环。

2. 优缺点

(1)优点

  • 迫使测试人员去仔细思考软件的实现。
  • 可以检测代码中的每条分支和路径。
  • 揭示隐藏在代码中的错误。
  • 对代码的测试比较彻底。
  • 最优化。

(2)缺点

  • 投入成本高、昂贵。
  • 无法检测代码中遗漏的路径和数据敏感性错误。
  • 不验证规格的正确性。

3. 方法

白盒测试方法主要分为语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖以及路径覆盖。

(1)语句覆盖(Statement Coverage)

基本思想是设计若干测试用例,运行被测程序,使程序中的每个可执行语句至少被执行一次。语句覆盖是最基础的覆盖标准。

示例:

def calculate(x):if x > 0:        # 分支语句print("正数") # 语句1else:print("非正数") # 语句2

测试用例:

  • x为1(覆盖语句1)
  • x为-1(覆盖语句2)

覆盖率计算

  • 总语句数:3(if + print + print)

  • 已覆盖:3 → 100%语句覆盖

优缺点:

  • 优点:简单易实现。
  • 缺点:无法检测缺失分支(如没有测试x为0情况)。

(2)分支覆盖(Branch Coverage)

也称判定覆盖。基本思想是设计若干用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均曾被满足。

示例:

def check(score):if score >= 60:    // 分支点return "及格";    // 分支1else:return "不及格";  // 分支2

测试用例

  • score为80(覆盖分支1)
  • score为50(覆盖分支2)
与语句覆盖的关系:
  • 100%分支覆盖 ⇒ 100%语句覆盖

  • 反之不成立

(3)条件覆盖(Condition Coverage)

基本思想是设计若干测试用例,执行被测程序以后,要使每个判断中每个条件的可能取值至少满足一次。

示例:

if (age > 18 && gender == 'M') {  // 两个子条件// do something
}

子条件

  • age > 18(T/F)
  • gender == 'M'(T/F)

测试用例:

用例agegender覆盖条件组合
120'M'T && T
215'F'F && F
320'F'T && F (可选)
415'M'F && T (可选)

(4)判定-条件覆盖

是判定和条件覆盖设计方法的交集,即设计足够的测试用例,使得判断条件中的所有条件可能取值至少执行一次,同时,所有判断的可能结果至少执行一次。

(5)条件组合覆盖

基本思想是设计足够的测试用例,使得程序中每个判断的所有可能的条件取值组合都至少出现一次。

(6)路径覆盖(Path Coverage)

基本思想是设计足够的测试用例,覆盖程序中所有可能的执行路径。路径覆盖是最严格的覆盖标准。

示例:

def func(x, y):if x > 0:       # 分支1y += 1if y < 10:      # 分支2x += 1return x + y

独立路径

  • 分支1=T → 分支2=T
  • 分支1=T → 分支2=F
  • 分支1=F → 分支2=T
  • 分支1=F → 分支2=F
现实挑战:
  • 循环可能产生无限路径 → 通常限制循环次数

  • 复杂度随分支数指数增长(n个分支⇒最多2ⁿ条路径)

优缺点:

  • 优点:可以对程序进行彻底的测试用例覆盖,比前面讲的5种方法覆盖度都要高。
  • 缺点:需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。

至此,对于白盒测试就讲解完了。黑盒测试、白盒测试的全部内容也就讲解完了。

相关文章:

软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试&#xff08;1&#xff09; 本文内容参考&#xff1a; 黑盒测试和白盒测试详解-CSDN博客 软件测试中的各种覆盖&#xff08;Coverage&#xff09;详解-CSDN博客 特此致谢&#xff01; 二、白…...

【背包dp----01背包】例题三------(标准的01背包+变种01背包1【恰好装满背包体积 产生的 最大价值】)

【模板】01背包 题目链接 题目描述 : 输入描述: 输出描述: 示例1 输入 3 5 2 10 4 5 1 4输出 14 9说明 装第一个和第三个物品时总价值最大&#xff0c;但是装第二个和第三个物品可以使得背包恰好装满且总价值最大。 示例2 输入 3 8 12 6 11 8 6 8输出 8 0说明 装第三个物…...

设计模式之状态模式

在日常开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象在不同时刻有不同的状态&#xff0c;不同状态下它的行为也会发生变化。此时&#xff0c;使用大量if...else或switch语句会让代码变得混乱而难以维护。为了更优雅地应对这种问题&#xff0c;状态模式(Stat…...

arXiv论文 MALOnt: An Ontology for Malware Threat Intelligence

文章讲恶意软件威胁情报本体。 作者信息 作者是老美的&#xff0c;单位是伦斯勒理工学院&#xff0c;文章是2020年的预印本&#xff0c;不知道后来发表在哪里&#xff08;没搜到&#xff0c;或许作者懒得投稿&#xff0c;也可能是改了标题&#xff09;。 中心思想 介绍开源…...

Spark处理过程-转换算子和行动算子

计算时机 转换算子 转换算子是惰性执行的&#xff0c;这意味着在调用转换算子时&#xff0c;系统不会立即进行数据处理。这种惰性计算的方式可以让 Spark 对操作进行优化&#xff0c;例如合并多个转换操作&#xff0c;减少数据的传输和处理量。行动算子 行动算子是立即执行的。…...

使用 pgrep 杀掉所有指定进程

使用 pgrep 杀掉所有指定进程 pgrep 是一个查找进程 ID 的工具&#xff0c;结合 pkill 或 kill 命令可以方便地终止指定进程。以下是几种方法&#xff1a; 方法1&#xff1a;使用 pkill&#xff08;最简单&#xff09; pkill 进程名例如杀掉所有名为 “firefox” 的进程&…...

Android学习总结之MMKV(代替SharedPreferences)

Q1&#xff1a;SharedPreferences 为什么会导致 ANR&#xff1f;MMKV 如何从根本上解决&#xff1f; 高频考察点&#xff1a;Android 主线程阻塞原理、SP 同步 / 异步机制缺陷、MMKV 内存映射技术 SP 导致 ANR 的三大元凶&#xff1a; 同步提交&#xff08;commit ()&#xf…...

SWiRL:数据合成、多步推理与工具使用

SWiRL&#xff1a;数据合成、多步推理与工具使用 在大语言模型&#xff08;LLMs&#xff09;蓬勃发展的今天&#xff0c;其在复杂推理和工具使用任务上却常遇瓶颈。本文提出的Step-Wise Reinforcement Learning&#xff08;SWiRL&#xff09;技术&#xff0c;为解决这些难题带…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】7.2 PostgreSQL与Python数据交互(psycopg2库使用)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL与Python数据交互&#xff1a;psycopg2库实战指南一、引言&#xff1a;数据交互的桥梁1.1 psycopg2核心优势 二、环境准备与基础连接2.1 安装配置2.1.1 安装psyco…...

【Prompt工程—文生图】案例大全

目录 一、人物绘图 二、卡通头像 三、风景图 四、logo设计图 五、动物形象图 六、室内设计图 七、动漫风格 八、二次元图 九、日常场景图 十、古风神化图 十一、游戏场景图 十二、电影大片质感 本文主要介绍了12种不同类型的文生图技巧&#xff0c;通过加入不同的图像…...

NVM完全指南:安装、配置与最佳实践

发布于 2025年5月7日 • 阅读时间&#xff1a;10分钟 &#x1f4a1; TL;DR: 本文详细介绍了如何完整卸载旧版Node.js&#xff0c;安装NVM&#xff0c;配置阿里云镜像源&#xff0c;以及设置node_global与node_cache目录&#xff0c;打造高效Node.js开发环境。 &#x1f4cb; 目…...

成都养老机器人“上岗”,机器人养老未来已至还是前路漫漫?

近日&#xff0c;成都养老机器人“上岗”引发关注&#xff0c;赛博养老这一概念再次成为人们讨论的焦点&#xff0c;究竟赛博养老未来已来&#xff0c;还是仍需漫长等待&#xff0c;引发诸多思考。 成都研发的养老机器人“上岗”确实标志着智慧养老领域的又一进步&#xff0c;…...

数据中心 第十五次CCF-CSP计算机软件能力认证

总结一下图树算法比如krusal 迪杰斯特拉 prim算法喜欢改变距离定义 或者求别的东西 而拓扑排序喜欢大模拟 本题使用kerusal算法求出最后一条边就可以。 ac代码&#xff1a; #include <iostream> #include <vector> #include <algorithm>using namespac…...

【面试 · 一】vue大集合

目录 vue2 基础属性 组件通信 全局状态管理 vueX 路由 路由守卫 vue3 基础属性 组件通信 全局状态管理 Pinia 路由 路由守卫 vue2、vue3生命周期 setup vue2 基础属性 data&#xff1a;用于定义组件的初始数据&#xff0c;必须是一个函数&#xff0c;返回一个对…...

Java 常用的 ORM框架(对象关系映射)

Java 常用的 ORM&#xff08;对象关系映射&#xff09;框架有以下几种&#xff0c;每种都有其特点和使用场景&#xff1a; Hibernate ● 特点&#xff1a; ○ 完整的 ORM 框架&#xff0c;功能强大。 ○ 支持缓存机制&#xff08;一级缓存、二级缓存&#xff09;。 ○ 支持多种…...

自动化创业机器人:现状、挑战与Y Combinator的启示

自动化创业机器人&#xff1a;现状、挑战与Y Combinator的启示 前言 AI驱动的自动化创业机器人&#xff0c;正逐步从科幻走向现实。我们设想的未来是&#xff1a;商业分析、PRD、系统设计、代码实现、测试、运营&#xff0c;全部可以在monorepo中由AI和人类Co-founder协作完成…...

支持向量机

支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种有监督的机器学习算法&#xff0c;可用于分类和回归任务&#xff0c;尤其在分类问题上表现出色。下面将从原理、数学模型、核函数、优缺点和应用场景等方面详细介绍。 原理 支持向量机的基本思…...

华为昇腾910B通过vllm部署InternVL3-8B教程

前言 本文主要借鉴&#xff1a;VLLM部署deepseek&#xff0c;结合自身进行整理 下载模型 from modelscope import snapshot_download model_dir snapshot_download(OpenGVLab/InternVL3-8B, local_dir"xxx/OpenGVLab/InternVL2_5-1B")环境配置 auto-dl上选择单卡…...

ZArchiver解压缩工具:高效解压,功能全面

在使用智能手机的过程中&#xff0c;文件管理和压缩文件的处理是许多用户常见的需求。无论是解压下载的文件、管理手机存储中的文件&#xff0c;还是进行日常的文件操作&#xff0c;一款功能强大且操作简便的文件管理工具都能极大地提升用户体验。今天&#xff0c;我们要介绍的…...

ETL介绍

&#xff08;一&#xff09;ETL介绍 “ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;、加载&#xff08;Load&#xff09;至目的端的过程。ETL一词较…...

2025.05.07-华为机考第三题300分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 城市紧急救援队伍协同规划 问题描述 智慧城市建设中,卢小姐负责设计一套紧急救援队伍协同系统。城市被规划为一个 n n n \times n...

缓存菜品-04.功能测试

一.功能测试 redis中的数据已缓存 查询数据时并没有发sql 修改鸡蛋汤价格为5元。 缓存数据没有了 价格修改成功 停售启售是一样的。修改后清理&#xff0c;再次查询又被缓存到redis中。...

跨境电商生死局:动态IP如何重塑数据生态与运营效率

凌晨三点的深圳跨境电商产业园&#xff0c;某品牌独立站运营总监李明&#xff08;化名&#xff09;正盯着突然中断的广告投放系统。后台日志显示&#xff0c;过去24小时内遭遇了17次IP封禁&#xff0c;直接导致黑五促销期间损失23%的预期流量。这并非个案——2023年跨境电商行业…...

day 14 SHAP可视化

一、原理——合作博弈论 SHAP&#xff08;SHapley Additive exPlanations&#xff09;是一种用于解释机器学习模型预测结果的方法&#xff0c;它基于合作博弈论中的 Shapley 值概念。Shapley 值最初用于解决合作博弈中的利益分配问题。假设有 n 个参与者共同合作完成一项任务并…...

处理PostgreSQL数据库事务死锁过程

查询pg_locks表&#xff0c;获取未得到满足的锁信息&#xff1a; select * from pg_locks where granted is false ; --查询得不到锁的&#xff0c;那就是两个互相等待对方持有的锁查询活动的事务会话进程&#xff0c;和上一步的锁的事务对应起来&#xff1a; select * from …...

大数据、物联网(IoT)、平台架构与设计重构大模型应用

结合大数据、物联网(IoT)、平台架构与设计重构大模型应用,需构建一个数据驱动、实时响应、弹性扩展的智能系统。以下从技术架构、数据流、核心模块设计三个维度展开: 一、整体架构设计 分层架构(基于云-边-端协同): [物联网设备层] → [边缘计算层] → [大数据平台层]…...

开发 Chrome 扩展中的侧边栏图标设置实录(Manifest V3)

在开发自己的 Chrome 扩展 Pocket Bookmarks&#xff08;口袋书签&#xff09; 的过程中&#xff0c;我遇到了一个看似简单却颇具挑战的问题&#xff1a;如何在扩展的侧边栏显示自定义图标&#xff1f; 这篇文章记录一下我踩过的坑&#xff0c;以及最终的解决方案。 这里说的侧…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK在Linux系统下设置多个USB相机(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK在Linux系统下设置多个USB相机&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPI SDK在Linux系统下设置USB相机的技术背景Linux系统内核 USB 模块内存的修改内存限制的确定使用 GRUB 引导加载程序修改内存限制使用 U-B…...

zst-2001 历年真题 知识产权

知识产权 - 第1题 发表权有时间限制 其他下面3个没有 c 知识产权 - 第2题 bd是财产权 c 知识产权 - 第3题 b 知识产权 - 第4题 d 知识产权 - 第5题 d 知识产权 - 第6题 d 知识产权 - 第7题 d 知识产权 - 第8题 b是国务院发布的 d没有复制权…...

设备与驱动:UART设备

大部分的嵌入式系统都包括一些I/O设备&#xff0c;例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上模拟数据采样、用于保存数据的Flash/SD卡以及网络设备上的以太网接口等&#xff0c;都是嵌入式系统中容易找到的I/O设备例子。 本专栏主要是分享RT-Thread是如何…...

Linux 服务器静态 IP 配置初始化指南

✅ 第一步&#xff1a;确认网络管理方式 运行以下命令判断系统使用的网络管理服务&#xff1a; # 检查 NetworkManager 是否活跃 systemctl is-active NetworkManager# 检查 network&#xff08;旧服务&#xff09;是否活跃 systemctl is-active network或者检查配置路径&…...

【ROS2】Nav2源码之行为树定义、创建、加载

1、简述 在 Navigation2 里,机器人的导航是一项复杂的任务,包含路径规划、避障、恢复机制等多个子任务。行为树能把这些子任务组织成清晰的层次结构,让机器人可以依据不同的情况做出合理的决策。例如,当机器人在导航途中碰到障碍物时,行为树可以决定是重新规划路径、尝试…...

Redis持久化存储介质评估:NFS与Ceph的适用性分析

#作者&#xff1a;朱雷 文章目录 一、背景二、Redis持久化的必要性与影响1. 持久化的必要性2. 性能与稳定性问题 三、NFS作为持久化存储介质的问题1. 性能瓶颈2. 数据一致性问题3. 存储服务单点故障4. 高延迟影响持久化效率.5. 吞吐量瓶颈 四、Ceph作为持久化存储介质的问题1.…...

如何统一修改word中所有英文字母的字体格式

1.需求分析 我想让整篇论文中的所有英文字母格式都修改为Time New Roman格式。 2.直观操作流程 点击左上角开始 --> 点击替换 --> 点击更多 --> 点击特殊格式 --> 选择查找内容为任意字母(Y) --> 将光标点到替换内容 --> 点击格式 --> 点击字体 --> …...

服务器上机用到的设备

服务器上机通常需要以下硬件设备&#xff1a; 服务器主机&#xff1a; CPU&#xff1a;选择高性能的多核处理器&#xff0c;如英特尔至强&#xff08;Xeon&#xff09;系列或AMD EPYC系列&#xff0c;以满足高并发和多任务处理需求。 内存&#xff08;RAM&#xff09;&#xf…...

【Java ee 初阶】多线程(8)

Synchronized优化&#xff1a; 一、锁升级 锁升级时一个自适应的过程&#xff0c;自适应的过程如下&#xff1a; 在Java编程中&#xff0c;有一部分的人不一定能正确地使用锁&#xff0c;因此&#xff0c;Java的设计者为了让大家使用锁的门槛更低&#xff0c;就在synchronize…...

数字孪生大屏UI设计

近年来,5G、大数据、云计算等新一代信息技术的蓬勃发展,计算机仿真技术与拟真软件的成熟运用,让数字孪生技术开始蔓延渗透到“互联网”相关的产业中。数字孪生大屏给予了可视化的数据直观窗口,其中展现的动态映射与实时数据让业务流转效率得到了有效提升,管理、运营和决策都能高…...

【Java ee 初阶】多线程(9)上

一、信号量Semaphore 本质上就是一个计数器&#xff0c;描述了一种“可用资源”的个数 申请资源&#xff08;P操作&#xff09;&#xff1a;使得计数器-1 释放资源&#xff08;V操作&#xff09;&#xff1a;使得计数器1 如果计数器为0了&#xff0c;继续申请资源&#xff…...

eclipse开发环境中缺少JavaEE组件如何安装

新版本eclipse去掉server了吗&#xff1f;在最近新版本的eclipse里面&#xff0c;确实找不到server模块了&#xff0c;无法配置tomcat等web服务器插件了。我们需要自己手工安装一下javaEE组件才行。 1 1&#xff1a;找到自己当前eclipse版本号码 2&#xff1a;去这个地址&…...

stm32之ADC

目录 1.简介2.逐次逼近型ADC3.基本结构4.输入通道5.转换模式6.触发控制7.数据对齐8.转换时间7.校准10.ADC外围电路11.api和结构体11.1 结构体11.2 api1. ADC_DeInit2. ADC_Init3. ADC_StructInit4. ADC_Cmd5. ADC_DMACmd6. ADC_ITConfig7. ADC_ResetCalibration8. ADC_GetReset…...

从电话到V信语音:一款App实现全场景社交脱身

作为一名资深社恐人士&#xff0c;我深知那些无法脱身的社交场合有多煎熬。上周参加一个行业聚会&#xff0c;面对滔滔不绝的陌生人&#xff0c;我如坐针毡却又找不到合适的离场理由。这时我突然想起之前朋友推荐的一款神器应用&#xff0c;它让我得以优雅脱身。今天就来分享这…...

conda init before conda activate

先conda init 然后退出命令窗口&#xff0c;再重新打开命令窗口再conda activate...

MySQL数据库高可用(MHA)详细方案与部署教程

一&#xff1a;MHA简介 核心功能 二&#xff1a;MHA工作原理 三&#xff1a;MHA组件 四&#xff1a;MHA 架构与工具 MHA架构 Manager关键工具 Node工具 五&#xff1a;工作原理与流程 1: 故障检测 2: 故障切换&#xff08;Failover&#xff09; 3 : 切换模式 六&a…...

《Python星球日记》 第44天: 线性回归与逻辑回归

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、引言:回归方法的重要性二、线性回归原理与损失函数1. 线性回归的数学模型2. 损失函数:衡量…...

Flutter TabBar / TabBarView 详解

目录 一、引言 二、基本用法 代码解析 三、主要属性 3.1 TabBar 3.2 TabBarView 四、进阶定制&#xff1a;突破默认样式 4.1 视觉样式深度定制 4.2 自定义指示器与标签 4.3 动态标签管理 五、工程实践关键技巧 5.1 性能优化方案 5.2 复杂手势处理 5.3 响应式布局…...

001 环境搭建

&#x1f984; 个人主页: 小米里的大麦-CSDN博客 &#x1f38f; 所属专栏: Linux_小米里的大麦的博客-CSDN博客 &#x1f381; GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录 Linux 环境搭建全解析&#xff1a;从历史到实践一、Linux 的起源与…...

Spark-core-RDD入门

RDD基本概念 Resilient Distributed Dataset 叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象&#xff0c;是分布式计算的实现载体&#xff0c;代表一个不可变&#xff0c;可分区&#xff0c;里面的元素并行计算的集合。 - Dataset&#xff1a; 一个数据集合&…...

在scala中,转换算子和行动算子有什么区别

在Scala结合Spark编程中&#xff0c;转换算子&#xff08;Transformation&#xff09;和行动算子&#xff08;Action&#xff09;有以下区别&#xff1a; 执行机制 **转换算子**&#xff1a; 具有惰性求值&#xff08;延迟计算&#xff09;特性 。它对RDD&#xff08;弹性分布…...

六级阅读---2024.12 卷一 仔细阅读1

文章 Imagine youre an alien sent to Earth to document the behaviour of the mammals inhabiting the planet. You stumble into a movie theatre thats showing the latest Hollywood horror film. Several dozen humans are gathered together in a dark, undercoated r…...

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)

视频教程请关注 B 站&#xff1a;“嵌入式Jerry”。 一、背景导读&#xff1a;GPU 与 DRM 到底谁负责“显示”&#xff1f; 在嵌入式 Linux 图形系统中&#xff0c;“画面怎么显示出来”的问题&#xff0c;表面看似简单&#xff0c;实则涉及多个内核子系统与用户态组件的协同&…...