前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python分析测试数据实践

Python分析测试数据实践

作者头像
用户5548425
发布2020-02-25 13:58:09
4930
发布2020-02-25 13:58:09
举报
文章被收录于专栏:韩锋频道

Python,被称为一种“胶水”语言。简单易学,快速上手,快速收益。近期因需要分析点数据,又重新拾起来,并快速解决问题。特总结一下,作为工具类语言,Python 还是非常不错的,推荐使用。

1. 背景说明

近期在分析一些测试脚本产生的数据。这些测试脚本会执行大量SQL样本,并将结果输出到日志中。如失败,会打出错误的信息,供事后分析使用。但要从日志中分析出错误,并不容易。一方面,日志的规模很大,还散落在各处;第二方面,不同错误输出的内容各异,格式不太统一;第三,非结构化的数据也很难做进一步分析、乃至指导后续工作。下面举例,说明下其错误的格式。

2. 步骤:结构化数据

要解决这一问题,首先想到的就是解决数据结构化的问题。毕竟分散到日志文件中的数据,处理起来不太方便。如果能将数据结构化,存放到关系结构中,后续就很容易处理了。Python在解决这一问题上,使用正则表达式就可以了。

1).Python中的正则

正则表达式(或RE)是一种小型的、高度专业化的编程语言,它内嵌在python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。

2).正则基础:字符匹配

  • 普通字符

大多数字母和字符一般都会和自身匹配。

  • 元字符

[],指定一个字符集

^,匹配行首。

$,匹配行尾。

3).正则基础:转义

反斜杠后面可以加不同的字符以表示不同特殊意义。

\d 匹配任何十进制数,类似[0-9]

\D 匹配任何非数字字符,类似[^0-9]

\s 匹配任何空白字符,类似[\t\n\r\f\v]

\S 匹配任何非空白字符,类似[^\t\n\r\f\v]

\w 匹配任何字母数字字符,类似[a-zA-Z0-9_]

\W 匹配任何非字母数字字符,类似[^a-zA-Z0-9_]

\[或\\可以用于取消所有的元字符。

4).正则基础:重复

正则表达式第一功能是能够匹配不定长的字符集,另一个功能就是你可以指定正则表达式的一部分的重复次数。

*,指定前一个字符可以被匹配零次或多次,而不是只有一次。

+,表示匹配一或多次,至少出现一次。

?,匹配一次或零次,可以用于标识某字符是可选的

{m,n},至少有m个重复,至多到n个重复。

5).RE模块

re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用它来进行匹配。

>>> import re

>>> r1=r"\d{3,4}-?\d{8}" //电话号码正则

>>> re.findall(r1,"010-12345678")

['010-12345678']

>>> re.findall(r1,"010-1234567")

[]

>>> p_tel=re.compile(r1)

>>> p_tel

<_sre.SRE_Pattern object at 0x2b67cba8d5e0>

>>> p_tel.findall('010-12345678')

['010-12345678']

6).RE函数

re模块也提供了顶级函数调用,如match()、search()、sub()、subn()、split()、findall()等。

7).综合示例

import re

import urllib

def getHtml(url):

page = urllib.urlopen(url)

html = page.read()

return html

def getImg(html):

req = r'src="(.*?\.jpg)" width'

imgre = re.compile("reg")

imglist = re.findall(imgre,"html")

x = 0

for imgurl in imglist:

urllib.urlretrieve(imgurl,'%s.jpg' % x)

x+=1

html = getHtml("http://www.baidu.com")

getImg(html)

经过以上处理,数据已经可以结构化出我们需要的数据项,包括出错误的SQL文件、SQL语句、错误输出内容、预估正确内容、异常信息等。

3. 步骤:收敛数据

虽然我们得到的结构化数据,但分析起来仍不太容易。这主要是因为测试的数据是零散的。举个例子:

Case1: Select * from t1 where a=1;

Case2: Select * from t1 where a=2;

例如上面两个语句都出现了错误,系统会记录为2个。虽然人工是可以判断,其应该是一类问题,但系统无法自动判断。当面对庞大的数据集时,如何快速收敛结果成为一个难点。这里一个解法,就是使用文本相似度,将文本相似度较高的归为一类。Python本身有很多的文本相似度的实现,这里就使用了内置的官方库difflib的类SequenceMatcher方法。

Difflib类原理

原理比较拗口,我直接写上了一段英文解释。

This is a flexible class for comparing pairs of sequences of any type, so long as the sequence elements are hashable. The basic algorithm predates, and is a little fancier than, an algorithm published in the late 1980’s by Ratcliff and Obershelp under the hyperbolic name “gestalt pattern matching.” The idea is to find the longest contiguous matching subsequence that contains no “junk” elements (the Ratcliff and Obershelp algorithm doesn’t address junk). The same idea is then applied recursively to the pieces of the sequences to the left and to the right of the matching subsequence. This does not yield minimal edit sequences, but does tend to yield matches that “look right” to people.

例子:字符串相似度

上面的示例中,相似度越大,约接近数字1。

使用上述方法,尝试多种不同的相似度阈值,找出比较符合预期的结果。这一步之后,我们得到了一类SQL的样本数据,诸如上面的例子会变为

Case1: like “select * from t1 where a=1”,这个case会包含多个类似错误的语句。

4. 步骤:再次收敛数据

上述的结果得出后,得到初步的收敛结果,但结果集仍然很大。下一步可以使用简单的字符串匹配,从大的分类的入手,将结果进一步收敛。例如包含”data type…”为字段类型类的错误等。这个实现方式,通过简单的字符串包含就可以了。

5. 步骤:数据结果输出

将数据规格化、两次分类后,可以将数据结果输出,方便后续查询。这里可以将其录入到数据库中,也可以简单写成一个XLS文件。EXCEL文件,其实一种关系数据的体现。Python里很容易实现。

输出结果

里面包括错误类别,解释及出现的次数。

Python:写入excel示例

6. 步骤:图形化数据

我再往前走一步,有了规格化的数据后,如何更好的展示出来。在EXCEL中,可通过简单的图形展示,就可以发现一些规律。

写在最后: 一小段代码(加起来不到150行),就能将令人眼花缭乱的海量日志,转变为通俗易懂的图表。这就是Python能赋予我们的能力,也是我一直倡导去使用一门语言来辅助自己工作的原因。At last,make a joke!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 韩锋频道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档