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

为什么数据需要 QA 流程

当有人问我做什么工作时,我会说我是一名数据质量保证 (QA) 工程师。他们并不真正理解我的意思。“嗯,我做数据测试,”我试图解释,但常常无济于事。我有一些从事技术和软件开发的朋友,他们不太了解数据测试是什么,为什么它是必要的,或者它在编程世界中的位置。这是可以理解的,因为数据科学是一个全新的领域,即使是每天与数据打交道的人也必须对处理工作方式的任何变化保持开放的态度。

要了解数据测试的工作原理,必须首先了解什么是数据工程。然后就可以研究数据质量以及如何衡量它。

数据工程和分析

要了解数据测试从哪里开始,需要先知道数据是如何设计的,以及它与其他类型的编程(例如软件开发)的不同之处。让我们从什么是数据开始。数据是保存在业务工具中的某种聚合信息。该工具是电子表格还是数据库取决于业务,但创建数据的原始位置才是开始的地方。

源中的原始数据对任何人来说都没有多大用处,这就是数据工程的用处。在数据工程中,将获取数据并使其有用的过程称为提取、转换、加载或 ETL。从源中提取数据后,可以根据业务需求对其进行转换并加载到业务分析工具中。业务分析师和财务分析师有机会使用数据集来创建报告、图表和其他所需的指标来为业务决策提供信息。

T 代表转换,转换可能是数据工程过程中最关键的点。这里以拥有多家商店的零售企业为例。假设有几家老店使用过时的POS系统,而新店则运行更现代的系统。每种类型的 POS 系统中的交易记录和存储方式都不同,存储在不同的数据库中。如果企业主想要查看每周的销售报告,则需要汇总两个系统的交易。

为此,必须有一个转换过程,可以从每个 POS 系统获取交易信息,并以有意义的方式将它们整合在一起。最重要的是,有关交易数据及其与销售报告的关系的问题很快就会出现。这里问一个问题:每个系统中的退货与实际销售如何计算?

接下来更进一步地讨论这个例子。原来的 POS 系统将所有内容存储在与新 POS 系统的数据库不兼容的数据库中,因此无法简单地加入信息。现在,转换阶段必须包括某种数据转换,然后才能将事务整合在一起。最终,企业主只是想在报告中接收汇总的销售信息,这在一开始听起来很简单。

对数据(销售报告)的需求以及将其转换为有意义的内容所需的技术工作(将不同的系统组合在一起)是定义数据集含义的两个关键要素。在例子中,寻找“销售”的含义,然后需要一份关于它的报告,这种模糊且主观的业务定义会让测试数据变得非常棘手。

测量数据质量

现在已经了解了数据和数据工程是什么样子。如果没有某种基准来衡量,就无法定义数据质量,并且通常在测试过程中,基准是各种可报告的指标。那么如何在数据世界中找到可衡量的东西来验证产品呢?

数据质量的六个维度

当前数据验证的行业标准是使用数据质量六个维度的某种形式来测试数据模型、管道、架构等。这些数据质量指标最初是在数据管理协会 (DAMA) 英国分会于 2013 年撰写的名为“数据质量评估的六个主要维度”的数据质量论文中定义的。这六个维度是一个得到广泛认可的系列 用于检查任何给定数据集质量的验证指标。他们帮助数据质量工程师和数据工程师创建可以改进的可衡量的验证指标。

这六个维度是:

  • • 一致性:如果数据跨多个数据库、系统、表和报告进行复制,则数据应该保持不变,从而保持一致。例如,无论在哪里找到客户当前的邮政编码,都应始终为相同的五位数。

  • • 准确性:也许是最模糊的数据质量指标,准确性是相关数据代表现实世界事件或对象的程度。假设表中有一列代表所有客户交易的总美元金额,另一列代表交易总金额。这些值中的每一个都应该能够清楚地追溯到来源,从而可以证明总数对于发生的现实世界交易是准确的。

  • • 有效性:在数据集中的任何给定字段中,可能存在某种数据类型要求。永远不会期望在州字段中看到数字,其中字段限制是美国州(例如 NY、CA 或 IL)的两个字母表示形式。如果该字段中存在整数,则会破坏数据的有效性。

  • • 唯一性:对于数据库中预期的每条唯一记录,应该有一个字段来唯一标识每条给定的记录,例如 在线购物数据库的客户帐号。该帐号的唯一性对于识别单个客户帐户的重复交易可能至关重要。

  • • 完整性:如果缺少任何关键字段,则数据不完整。也许在业务交易记录中,每笔交易都应该有一个时间戳。如果该时间戳丢失,则交易数据集不完整。

  • • 及时性:对每份报告接收新数据的期望是什么?数据的及时性是由业务需求定义的。例如,如果需要每天刷新一个数据集,那么该数据集的及时性测试指标也是每天刷新。

对于任何给定的数据集,数据测试和验证应涵盖每个维度。特别是自动化单元测试,但我们稍后会讨论。

工程过程中的数据测试

现在我们了解了数据质量的六个维度、数据工程的一般工作方式以及数据需求的业务定义的至关重要性,接下来的任务就是将所有这些内容整合在一起以创建测试计划。数据质量工程师是数据工程流程的核心;他们支持工程师的技术工作以提供所需的数据集,并与业务分析师合作验证该数据。

数据 QA 测试的类型

在软件测试领域,有几种常见类型的有用质量测试,可以识别错误、确认工作组件并调查软件的预期行为。这些类型的测试在数据测试领域仍然非常有用,因此如果对这些测试类别有所了解,那么你已经了解了有关数据测试的一些知识。

这些包括但不限于:

  • • 单元测试:嵌入数据建模代码中的小型测试,用于识别基本功能所需的关键代码块内的小断点。例如,也许有一列数据中不应存在 NULL 值。快速单元测试可以检查字段中是否存在 NULL 并确保不存在 NULL。

  • • 集成测试:这些测试寻找程序或数据管道的全部部分而不是其中的一部分来工作。在数据管道示例中,集成测试将检查整个 ETL 流程是否可以从头到尾成功执行。

  • • 冒烟测试:快速测试用于有效检查数据管道中最重要且通常常见的部分是否存在故障。该术语起源于计算机硬件测试,当时第一个初始测试是将机器插入电源并查看是否有任何机械部件产生烟雾。如果没有,则硬件通过测试。然而,如果有烟雾……正如你可以想象的那样,他们会关闭机器并重试。

  • • 回归测试:用于检查程序核心操作的一系列测试,称为“回归”,因为测试套件着眼于代码中永远不应该更改的标准功能部分。通常是在产品发布之前使用的主要套件。就数据而言,回归通常涵盖关键任务转换。

  • • 功能测试:用于检查在当前发布的操作之上添加到程序中的任何新组件(“功能”)的测试。如果新功能对于生产版本至关重要并且应该保持不变,那么这些功能就会添加到回归测试套件中。

这些都是许多软件开发团队定期使用的常见、有用的测试类型。它们可以并且被应用于数据测试。

单元测试作为数据验证的秘密武器

与几乎每个 QA 角色一样,数据 QA 工程应该为工程团队的工作增加价值,并以有用的方式提供反馈。数据质量保证几乎总是从手动测试开始,特别是在拥有遗留数据库和数据仓库技术的企业中。数据 QA 工程师的笔记本电脑上可能有数百个过多的 SQL 脚本。但手动测试仍然需要有效检查数据质量的六个维度,而不成为生产发布的瓶颈。综上所述,数据测试自动化是完全可能的,尤其是在单元测试和断言方面。

根据我的经验,数据 QA 工程师最重要的角色之一是宣传数据管道中内置的单元测试。当数据工程师在数据转换开发期间实施时,单元测试可以在数据 QA 工程师查看数据集之前捕获数据错误。通常,数据工程师不习惯单元测试,因为这更多的是一种软件开发实践,但我并不是唯一一个认为数据工程在文化上需要更多单元测试的人。数据构建工具(dbt)等流行的开源框架具有内置的单元测试,可以防止完整性、唯一性和及时性方面的问题。其他开源验证工具(例如 Great Expectations)在数据管道之上分层了一套数据断言单元测试。

自动化

自动化是数据质量领域的一个关键原则,也是数据质量六个维度的执行。例如,结合使用单元测试和数据完整性测试,数据质量工程师可以编写一个小型、快速的自动化测试来检查关键字段中的任何 NULL 值。数据管道中以各种方式检查关键数据质量维度的自动化测试越多,数据工程师要做的工作就越少。

如果数据工程师不用生成表并每次使用 SQL 和数据库连接查看它,而是拥有一个内置的回归测试套件来为她运行日常检查,会怎么样?这些是数据质量工程师所做的有用的自动化基础和测试工程。

总结

数据测试是一个每天都在增长和变化的独特领域。没有太多被广泛接受的数据质量标准,甚至像数据质量的六个维度这样的标准也存在争议。机器学习和人工智能 (AI) 等更多数据科学领域正在不断发展,并创造了验证数据准确性、一致性、完整性等的新方法。

我们所知道的是,目前的数据质量在很大程度上取决于所请求的数据集的主观含义以及数据管道末端人员的需求。这使得很难找到正确的基准来测试和提高数据质量,但仍然可以利用对有用测试类型和数据质量维度的了解来验证每天使用的数据。随着对如何使用数据的理解不断发展,数据质量指标和对数据测试的理解也会不断发展。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:

为什么数据需要 QA 流程

当有人问我做什么工作时,我会说我是一名数据质量保证 (QA) 工程师。他们并不真正理解我的意思。“嗯,我做数据测试,”我试图解释,但常常无济于事。我有一些从事技术和软件开发的朋友,他们不太了解数据测试是什么&#…...

Spring Boot 学习之路 -- 基础认知

前言 最近因为业务需要,被拉去研究后端的项目,代码框架基于 Spring Boot,对我来说完全小白,需要重新学习研究…出于个人习惯,会以 Blog 文章的方式做一些记录,文章内容基本来源于「 Spring Boot 从入门到精…...

JavaScript --json格式字符串和对象的转化

json字符串解析成对象 &#xff1a; var obj JSON.parse(str) 对象转化成字符串&#xff1a;var str1 JSON.stringify(obj1) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…...

LabVIEW提高开发效率技巧----采用并行任务提高性能

在复杂的LabVIEW开发项目中&#xff0c;合理利用并行任务可以显著提高系统的整体性能和响应速度。并行编程是一种强大的技术手段&#xff0c;尤其适用于实时控制、数据采集以及多任务处理等场景。LabVIEW的数据流编程模型天然支持并行任务的执行&#xff0c;结合多核处理器的硬…...

裸土检测算法实际应用、裸土覆盖检测算法、裸土检测算法

裸土检测算法主要用于环境保护、农业管理、城市规划和土地管理等领域&#xff0c;通过图像识别技术来检测和识别地表上的裸露土壤。这种技术可以帮助管理者实时监控裸土面积&#xff0c;及时采取措施&#xff0c;防止水土流失、环境污染和生态退化。 一、技术实现 裸土检测算…...

深入剖析链表反转:多语言实现与高级语法特性20240924

深入剖析链表反转&#xff1a;多语言实现与高级语法特性 引言 在数据结构与算法的学习中&#xff0c;链表是基础结构之一&#xff0c;尤其在动态内存分配和操作中体现了它的重要性。今天&#xff0c;我们将通过反转单链表这一经典算法题&#xff0c;从不同编程语言的角度进行…...

【数据结构初阶】链式二叉树接口实现超详解

文章目录 1. 节点定义2. 前中后序遍历2. 1 遍历规则2. 2 遍历实现2. 3 结点个数2. 3. 1 二叉树节点个数2. 3. 2 二叉树叶子节点个数2. 3. 3 二叉树第k层节点个数 2. 4 二叉树查找值为x的节点2. 5 二叉树层序遍历2. 6 判断二叉树是否是完全二叉树 3. 二叉树性质 1. 节点定义 用…...

力扣189 轮转数组 Java版本

文章目录 题目描述代码 题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4…...

RMAN异机恢复数据库记录

场景&#xff1a;数据库服务器宕机&#xff0c;无法恢复 处理&#xff1a;使用备份资料进行异地恢复 1.此处环境为同平台、同版本&#xff08;操作系统版本可以不同&#xff0c;但数据库版本需相同&#xff09;&#xff0c;源机器和目标机器具有相同的目录结构。 2.目标机器只…...

JVM 调优篇7 调优案例4- 线程溢出

一 线程溢出 1.1 报错信息 每个 Java 线程都需要占用一定的内存空间&#xff0c;当 JVM 向底层操作系统请求创建一个新的 native 线程时&#xff0c;如果没有足够的资源分配就会报此类错误。报错信息&#xff1a;java.lang.outofmemoryError:unable to create new Native Thr…...

C++类与对象(三)

目录 1.再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2.STATIC成员 2.1 概念 2.2 特性 3.C中成员初始化的新玩法 4.友元 4.1 友元函数 4.2 友元类 5.内部类 6.再次理解封装 7.再次理解面向对象 本次内容大纲&#xff1a; 1.再谈构造函数 …...

云栖实录 | 阿里云 OpenLake 解决方案重磅发布:多模态数据统一纳管、引擎平权联合计算、数据共享统一读写

新一轮人工智能浪潮正在重塑世界&#xff0c;以生成式 AI 为代表的技术快速应用&#xff0c;推动了数据与智能的深化融合&#xff0c;同时也给数据基础设施带来了全新的变革与挑战。面向 AI 时代的数据基础设施如何构建&#xff1f;底层数据平台架构在 AI 时代如何演进&#xf…...

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…...

对网页聊天项目进行性能测试, 使用JMeter对于基于WebSocket开发的webChat项目的聊天功能进行测试

登录功能 包括接口的设置和csv文件配置 ​​​​​​ 这里csv文件就是使用xlsx保存数据, 然后在浏览器找个网址转成csv文件 注册功能 这里因为需要每次注册的账号不能相同, 所以用了时间函数来当用户名, 保证尽可能的给正确的注册数据, 时间函数使用方法如下 这里输入分钟, 秒…...

《程序猿之设计模式实战 · 适配器模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

Elasticsearch案例

目录 一、创建索引 二、准备数据 三、环境搭建 &#xff08;1&#xff09;环境搭建 &#xff08;2&#xff09;创建实体类 &#xff08;3&#xff09;实现Repository接口 四、实现自动补全功能 五、实现高亮搜索关键字功能 &#xff08;1&#xff09;在repository接口中…...

SpringBoot 项目如何使用 pageHelper 做分页处理 (含两种依赖方式)

分页是常见大型项目都需要的一个功能&#xff0c;PageHelper是一个非常流行的MyBatis分页插件&#xff0c;它支持多数据库分页&#xff0c;无需修改SQL语句即可实现分页功能。 本文在最后展示了两种依赖验证的结果。 文章目录 一、第一种依赖方式二、第二种依赖方式三、创建数…...

GSR关键词排名系统是针对谷歌seo的吗?

是的&#xff0c;GSR关键词排名系统专门针对谷歌SEO&#xff0c;具体通过外部优化手段快速提升关键词排名。不同于传统的SEO策略&#xff0c;GSR系统并不依赖于对网站内容的调整或内部优化&#xff0c;完全通过站外操作实现效果。这意味着&#xff0c;用户不需要花费精力在网站…...

HarmonyOS Next开发----使用XComponent自定义绘制

XComponent组件作为一种绘制组件&#xff0c;通常用于满足用户复杂的自定义绘制需求&#xff0c;其主要有两种类型"surface和component。对于surface类型可以将相关数据传入XComponent单独拥有的NativeWindow来渲染画面。 由于上层UI是采用arkTS开发&#xff0c;那么想要…...

什么是电商云手机?可以用来干什么?

随着电商行业的迅速发展&#xff0c;云手机作为一种创新工具正逐渐进入出海电商领域。专为外贸市场量身定制的出海电商云手机&#xff0c;已经成为许多外贸企业和出海电商卖家的必备。本文将详细介绍电商云手机是什么以及可以用来做什么。 与国内云手机偏向于游戏场景不同&…...

Python 2 和 Python 3的差异

Python 2 和 Python 3 之间有许多差异&#xff0c;Python 3 是 Python 语言的更新版本&#xff0c;目的是解决 Python 2 中的一些设计缺陷&#xff0c;并引入更现代的编程方式。以下是 Python 2 和 Python 3 之间的一些主要区别&#xff1a; 文章目录 1. print 语句2. 整除行为…...

Leetcode 第 139 场双周赛题解

Leetcode 第 139 场双周赛题解 Leetcode 第 139 场双周赛题解题目1&#xff1a;3285. 找到稳定山的下标思路代码复杂度分析 题目2&#xff1a;3286. 穿越网格图的安全路径思路代码复杂度分析 题目3&#xff1a;3287. 求出数组中最大序列值思路代码复杂度分析 题目4&#xff1a;…...

spring 注解 - @NotEmpty - 确保被注解的字段不为空,而且也不是空白(即不是空字符串、不是只包含空格的字符串)

NotEmpty 是 Bean Validation API 提供的注解之一&#xff0c;用于确保被注解的字段不为空。它检查字符串不仅不是 null&#xff0c;而且也不是空白&#xff08;即不是空字符串、不是只包含空格的字符串&#xff09;。 这个注解通常用在 Java 应用程序中&#xff0c;特别是在处…...

深入理解华为仓颉语言的数值类型

解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 在编程过程中&#xff0c;数据处理是开发者必须掌握的基本技能之一。无论是开发应用程序还是进行算法设计&#xff0c;了解不同数据类型的特性和用途都至关重要。本文将深入探讨华为仓颉语言中的基本数…...

WPF 的TreeView的TreeViewItem下动态生成TreeViewItem

树形结构仅部分需要动态生成TreeViewItem的可以参考本文。 xaml页面 <TreeView MinWidth"220" ><TreeViewItem Header"功能列表" ItemsSource"{Binding Functions}"><TreeViewItem.ItemTemplate><HierarchicalDataTempla…...

使用Go语言的互斥锁(Mutex)解决并发问题

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在并发编程中,由于存在竞争条件和数据竞争,我们需要将某些代码片段设定为临界区,并使用互斥锁(Mutex)等同步原语来保护这些临界区。本文将详细介绍Go语言标准库中Mutex的使用方法,以及如何利用它来解决实际…...

Android平台Unity3D下如何同时播放多路RTMP|RTSP流?

技术背景 好多开发者&#xff0c;提到希望在Unity的Android头显终端&#xff0c;播放2路以上RTMP或RTSP流&#xff0c;在设备性能一般的情况下&#xff0c;对Unity下的RTMP|RTSP播放器提出了更高的要求。实际上&#xff0c;我们在前几年发布Unity下直播播放模块的时候&#xf…...

网络:TCP协议-报头字段

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 文章目录 前言一、TCP协议格式16位源端口号 和 16位目的端口号4位首部长度16位窗口大小32位序号 和 32位确认序号6种标记位 和 16位紧急指针 总结 前言 本文是我对于TCP协…...

JAVA基础:HashMap底层数组容量控制,TreeMap底层存取机制,位运算符,原码反码补码

List常用实现类 List集合常用的实现类有3个 &#xff0c; ArrayList , LinkedList , Vector ArrayList 类似于我们之前的ArrayBox 底层使用数组存储元素&#xff0c; 插入删除的效率低&#xff0c;检索的效率高 当底层数组存储容量不足时&#xff0c;会进行扩容&#xff0c;…...

【Redis】Redis 缓存设计:抗住百万并发量的最佳实践

目录 1. Redis 缓存设计原则1.1 高可用性1.2 数据一致性1.3 读写分离 2. 缓存策略2.1 常用缓存策略2.1.1 缓存穿透2.1.2 缓存雪崩2.1.3 缓存击穿 2.2 额外缓存策略2.2.1 更新策略2.2.2 预热策略2.2.3 侧写缓存 3. Redis 架构设计3.1 单机 vs 集群3.2 Redis 集群示例架构 4. 性能…...