Python自动生成测试数据:Faker库的使用

Python022

Python自动生成测试数据:Faker库的使用,第1张

在进行测试时,经常需要使用一些测试数据。如果手动创建数据,就会花费大量的时间,使用faker模块就可以帮助我们自动创建随机模拟数据。

faker是一个开源的python库,安装完成后只需要调用Facker库,就可以帮助我们创建需要的数据。

源码地址: https://github.com/joke2k/faker

faker默认使用的是英语,可以通过设置地域更改语言。

可支持设置的语言如下:

比如设置成中文:f = Faker("zh_CN")

Faker把Provider对象做成了Faker对象的“插件”,Faker通过内置的Provider对象,实现了生成某项数据的能力。

可以通过查看源码内的Provider查看可以哪些方法 https://github.com/joke2k/faker/tree/master/faker/providers

date_time

用于生成时间相关数据,用法如下:

Lorem

生成假文字数据。用法如下:

Address

生成和地址相关的数据

company

生成公司信息

person

生成名字等

生成数字类信息

生成随机集合类型

设置seed

设置seed可以保证每次取到的数字是一样的,添加Faker.seed()实现,用法如下:

基于属性的测试 会产生大量的、随机的参数,特别适合为单元测试和接口测试生成测试用例

尽管早在2006年haskell语言就有了 QuickCheck 来进行”基于属性的测试“,但是目前来看这依然是一个比较小众的领域,参考资料有限,本文如有不足,欢迎指正。

在过去的测试实践中,执行测试时通常需要明确的内容(Value):

这些内容可以通过”判定树“或者”判断表“来表示,然后测试的执行过程变成了这样

可以称为 基于表的测试

在最初,这给了我们测试的方向,但是缺点也非常明显:

你要足够多的"X->Y" 才能可能覆盖到隐蔽的bug。

这里请大家回答几个问题:

如果以上问题的答案不是yes,那么 基于属性的测试 就是你需要掌握的东西!

基于属性的测试和基于表的测试,最大的区别可以这样描述:

vs

于是利用工具生成大量的X类数据,进行测试,并验证结果是否Y类。

值得注意的是:

在不同的语言中有不同的工具来实现,比如:

本文以python为例进行演示:

假设有add函数,接收两个类型整数参数,并返回它们的相加结果

首先写出一个简单的测试用例

正如前面所说,一个这样的用例,根本没信心覆盖全部的场景,例如:

所以接下来怎么办?

改为基于属性的测试

执行结果

由结果可知,工具根据 参数是整数 这一规范,自动生成、执行了大量的测试用例

接口测试和函数的单元测试非常相似:

此外接口文档作为前后端、甚至测试开发的对接窗口,对参数的要求约定的更加细致,

以OpenAPI为例,每个参数可以有以下属性:

于是为接口生成符合要求的参数就变得可行了,举个例子:

这是以unittest为例进行封装的结果,只需要在TestCase中指定openapi的内容(或路径),

启动测试框架时,会自动读取、解析接口文档,并生成测试用例

下面是部分执行日志,可以看到对接口发送了随机参数,并获得返回值

文章来自https://www.cnblogs.com/dongfangtianyu/p/api_test_by_pbt.html

import pandas as pd

import numpy as np

import collections as Counter

from datetime import datetime

df=pd.read_excel("D:\曾海峰\python零一课程\用Python自动生成数据日报!\销售数据明细.xlsx",

parse_dates=['销售日期'])

df.head()#数据预览

df.info()#查看数据属性

"""

计算指标

计算指标设定,设置本文需要计算的指标,指标计算如下:

收入=销量*销售额

单量=销量汇总

货品数=货品数去重

收入环比:本月收入/上月收入-1

单量环比:本月单量/上月单量-1

计算本月相关指标

首先选取本月的数据,本月截止到2021年12月25日的数据,分别计算本月截止12月25日收入、

本月截止12月25日单量、本月截止12月25日货品数。"""

"""shouru1=(the_month['销量']*the_month['销售额']).sum()#本月截止12月25日收入

danliang1=the_month['销量'].sum()#本月截止12月25日单量

huopin1=the_month['货号'].unique()#本月截止12月25日货品数

list_huopin1=len(huopin1.tolist())

print("本月截止到12月25日收入为{:.2f}元,单量为{}个,货品数为{}个".format(shouru1,danliang1,list_huopin1))"""

"""计算上月相关指标

同时选取上月同期的数据,数据范围11月1日到11月25日的数据,分别计算上月同期的收入、上月同期的单量、上月同期的货品数。"""

"""shouru2=(last_month['销量']*last_month['销售额']).sum()#本月截止12月25日收入

danliang2=last_month['销量'].sum()#本月截止11月25日单量

huopin2=last_month['货号'].unique()#本月截止11月25日货品数

list_huopin2=len(huopin2.tolist())

print("本月截止到11月25日收入为{:.2f}元,单量为{}个,货品数为{}个".format(shouru2,danliang2,list_huopin2))"""

"""利用函数进行封装

以上我们可以发现规律,计算本月的相关指标数据与计算上月同期的指标数据计算逻辑是一样的,除了数据选取的日期不一样,我们可以自定义一个函数,用于计算相关的数据指标,简化数据计算的流程。"""

def get_month_date(df):

shouru=(df['销量']*df['销售额']).sum()

danliang=df['销量'].sum()

huopin=df['货号'].nunique()

#list_huopin=len(huopin.tolist())

#return(shouru,danliang,list_huopin)

return(shouru,danliang,huopin)

the_month=df[(df['销售日期']>=datetime(2021,12,1))&(df["销售日期"]<=datetime(2021, 12,25))]

shouru1,danliang1,huopin1=get_month_date(the_month)#计算本月数据指标

print("本月截止12月25日收入为{:.2f}元,单量为{}个,货品数为{}个".format(shouru1,danliang1,huopin1))

last_month=df[(df['销售日期']>=datetime(2021,11,1))&(df["销售日期"]<=datetime(2021, 11,25))]

shouru2,danliang2,huopin2=get_month_date(last_month)#计算本月数据指标

print("上月截止11月25日收入为{:.2f}元,单量为{}个,货品数为{}个".format(shouru2,danliang2,list_huopin2))

"""计算环比 构建一个DataFrame,填入具体的计算指标数值,计算环比数据。"""

ribao=pd.DataFrame([[shouru1,shouru2],

[danliang1,danliang2],

[huopin1,huopin2]],

columns=["本月","上月"],

index=['收入','单量','货品数'])

ribao['环比']=ribao['本月']/ribao['上月']-1

ribao['环比']=ribao['环比'].apply(lambda x:format(x,'.2%'))#数据小数转百分数,%2表示保留小数点后2位

ribao

""可以将具体的数据日报导出到本地。""

ribao.to_excel(r'C:\Users\liangfeng\Desktop\数据日报.xlsx',index=False)

df['销售月份']=df['销售日期'].astype(str).str[0:7].str.replace('-','')

df_group=df.groupby("销售月份").aggregate({'销售额':'sum','销量':'sum'})

df_group=df.groupby("销售月份").aggregate({"销售额":"sum","销量":"sum"})

df_group

from pyecharts import options as opts

from pyecharts.charts import Bar, Line

from pyecharts.faker import Faker

v1 = df_group['销售额'].round(2).tolist()

v2 = df_group['销量'].tolist()

bar = (Bar()

.add_xaxis(df_group.index.tolist())

.add_yaxis("销售额", v1 ,category_gap="60%",gap="10%") #设置柱形间隙宽度

.extend_axis(yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} 单"), min_=0,max_=1750))#设置次坐标轴坐标大小

.set_series_opts(label_opts=opts.LabelOpts(is_show=True))#显示数据标签

.set_global_opts(title_opts=opts.TitleOpts(title="21年每月销售额与销量情况"),

datazoom_opts=opts.DataZoomOpts(),#添加滚动条

yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} 元"),min_=0,max_=850000)))#设置主坐标轴坐标大小

line = Line().add_xaxis(df.index.tolist()).add_yaxis("销售量", v2, yaxis_index=1, is_smooth=True)

bar.overlap(line)

bar.render_notebook() ###bar.render(r'C:\Users\尚天强\Desktop\销售日报.html')