汽车之家测试架构师王公瑾谈大数据测试及自动化实践

王公瑾:大家好,我叫王公瑾,来自于汽车之家新车电商事业部,今天给大家分享的主题是大数据测试及自动化实践,大概会从以下五个方面,来给大家分享大数据测试的一些肤浅经验:

大数据过程概述

实时处理类测试

数仓与ETL测试

数据挖掘和分析

自动化落地实践

大数据过程概述

先了解一下大数据的整体过程,大数据分为四个阶段:

数据采集

数据仓库和ETL、实时计算

数据挖掘和分析

数据应用

通过技术的抽象,我们相应地把测试分成三类:

实时处理类测试:一般涵盖数据采集,实时计算等过程,这种类型的测试特点在于开发会使用各种框架架构中间件,在架构设计的测试方面会比较复杂

SQL和类SQL测试:测试会应用sql、hql、sparksql等对数据进行处理、验证和比对

算法类测试:对包括预测、关联分析等等算法的评估

实时处理类测试

架构设计中常见问题分析

消息队列:

是否持久化,非持久化需要考虑服务中断数据丢失的问题

消息队列持久化和其他中间件持久化的组合策略

路由机制

消费端的ACK机制,ACK时关注数据丢失,NACK关注阻塞

应用层:

消费速度与回告问题

错误与重试

线程池问题

NOSQL:

热数据使用和TTL

原子操作SETNX/INCREASE实现分布式锁,应用于数据去重清洗等

线程池问题

关系型数据库:

各种锁的问题,包括行锁上升到表锁

写入速度

测试策略

测试数据完整性:

接入层测试,防止接入丢失

接入层测试,保障接入规范

应用层测试,防止处理丢失

测试因架构设计中的降级、分流、异常重试等导致的数据乱序,对最终结果一致性的影响

测试竞争数据:

原子数据竞争测试:增加并发量级,缩小特征量级

填充数据竞争测试:增加并发量级,增加特征量级

不要忽略分布式测试

吞吐量、性能、疲劳:

验证处理能力

验证资源消耗

验证是否有内存溢出、线程异常崩溃、死锁等问题

实时处理测试过程举例

我们会先制定一个特征集策略,可能是源于一些业务需求,当然也有可能源于我们去做一些并发的策略,会在脚本的前置操作里边做数据清洗,把我们的持久化储存和缓存等等清理掉,然后我们会把特征加入到内存,用多线程或者是协程的方式去随机的对数据进行生成和灌入,这里要注意的是生产速度一定要大于消费速度,不然的话是很难测出问题的。还有如果你使用了消息队列中间件的时候,一定要检查消费速率和有没有数据的积压。其实很多开发对分布式中间件的使用不太了解,可能会做一些奇怪的设计,比如说会从中间件里边快速的大量的把数据拿到线程池和线程安全的队列,其实这里边有俩问题,一是数据被快速拿到线程安全的队列中,在中间件里边看不到真实的消费速度,如果你线程安全的队列长度是五千的话至少压到大于五千的数据才会在中间件积压,这样我们才看到有问题。另外一个问题,一旦服务重启的话,存储在内存中的数据必然丢失。我们很难去预测开发到底是怎么做设计和实现的。所以最后最关键是会写很多用例来测试数据的正确性。

数据仓库和ETL

然后说一下数仓和ETL测试,说到数仓,这个技术很早以前就有,但是直到HIVE出现,才降低了门槛。

了解下数仓的分层,每家公司数仓分层规范、命名和缩写都不太一样,这里边我觉得测试最能发挥作用的地方是在于业务层,即面向主题域的星型建模,测试了解业务,回去按一些规则去发现建模过程的一些业务实现问题:

面向过程还是面向结果:举个例子,比如说我的产品经理告诉我,想知道每家店铺每天新进的客户有多少,开发非常直面地按产品的意思写了个语句,对顾客表按商家按天来做分组,并且获取顾客数。实际上业务应该去想顾客会不会变化,比如五年前有一个顾客买了车,现在会不会还买,测试会询问产品,这样的顾客算不算新进顾客,最终可能产品会发现数据的维度从结果提取变成过程提取。

独立维度还是组合维度:比如维度是省市区中的区,但是收集上来的数据,都只到省市,那么区是一个默认值,默认值都相同,这就意味着单独的区是不能成为维度的,而应该使用concat将省市区变成一个组合维度。

维度二义性:一个维度的值尽量为一类含义。

维度的一意多值:大部分常见的问题为数据库默认值和程序默认值不一致导致的。

说到ETL,我们认为是一个脚本测脚本、结果测结果的过程。除了hive常用的hql,我们还涉及到一些UDF的操作。写脚本的时候,你即使不关心数据倾斜导致的效率低的问题,也需要了解参数调优的一些东西。

数据挖掘和分析

因为公司业务的保密性,我自己写了一个验证码识别的算法,以此来举例算法应该如何评估。

首先看一下左上角的SUBE,这是我们汽车之家主站的简单的验证码,这个验证码我写了两种算法去识别。

第一种算法:左侧的算法,是做大量图形的操作。刚才有同学问OCR的一些技术,我们直接拿图片识别的话,是很难识别出来的,需要把图片处理成好识别的状态:去边+降噪->切割(等切或MSER)->旋转+投影做正->识别。

第二种算法:端对端算法。通过pytorch+cnn,通过大量训练生成pkl进行识别。

那这两种算法到底哪个好,哪个不好,我们去评估这个事情非常容易,Selenium大家都会,我们进入登录页面,下载验证码图片,并分别调用两种服务返回验证码,看看他们的正确率,当然评估正确率是一个持续的过程,如下图

可以看出不同算法在不同时期各有优劣

自动化落地实战

因为我们做AI大数据时间不是很长,自动化现在也是处于一个持续丰富的阶段。

以上就是我的分享,谢谢大家。

本文来自:2018中国首届云测试峰会,举办方:Testin 云测

Testin,让应用更有价值:www.testin.cn

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181119A1607E00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券