3、Python之Faker:更巧妙的批量数据生成

南宫理的日志录 2024-09-12 17:11:35
引言

在上一篇文章中,我们通过Python的内置模块random,初步实现了测试数据的批量生成,解决了“巧妇难为无米之炊”的窘境。

但是,直接通过random模块进行测试数据的生成,在字段类型的灵活性、便捷性上,还是不太够用。如果要追求生成更加灵活、丰富的测试数据,更加便捷地生成测试数据。可以尝试本文介绍的已经被广泛使用的三方模块Faker。

准备工作

由于Faker是一个三方模块,所以我们在正式使用之前,需要先通过pip进行安装。关于pip最常用的几个命令,在该系列前面序号为1的文章中已经有所提到,不熟悉的,可以翻看一下。

安装Faker

pip3 install faker

注意:根据环境不同,可能是pip。

文档、源码及基本使用

关于Faker模块的源码及基本使用,可以参考:

https://github.com/joke2k/faker

Faker模块的使用基本用法

Faker模块的基础使用可以按照这几步进行:

模块导入

创建并初始化Faker的生成器,可以指定语言环境

根据业务需要,调用生成器对应的方法,获取测试数据

示例代码如下:

Faker的构造方法__init__定义如下:

在进行面向对象编程中,自定义类时,都可以参考进行__init__()函数的定义。第一个参数一定是self,如果学习过其他编程语言,可以类比为this指针。没学过,就简单记一下就行,后续逐步加深理解。

除了self之外的形参,都可以理解为对应属性的初始值,这些形参都是带默认值的形参,所以我们构造Faker构造器时,一个参数不传也是可以的。

多语言环境

构造Faker生成器时,可以传入一个语言环境的列表:

输出结果:

代码中出现了 _ 占位符,因为我们在循环内部,没有使用循环变量的场景,可以通过占位符 _来表示。这是Python提供的一种特殊语法,不习惯的,继续用for i in range(10)也是可以的。

生成唯一值

在实际调用Faker生成器的相关方法生成测试数据时,有时,发现生成的数据是重复的。如果需要生成唯一值,Faker提供了unique属性,来尽量保证生成不重复、唯一的测试数据。

需要注意的是,Faker模块会记录当前已经生成的数据,从而尽量保证生成不重复的数据。如果生成器的方法本身的原因,无法避免保证数据唯一,Faker在重试一定次数后,会抛出UniquenessException异常,从而避免无限重试,以期望获得一个不可能的结果。比如:生成100条人员信息时,生成100个性别数据时,就不可能做到数据的唯一性。

通过unique属性进行测试数据生成时,由于要保存比较当前已经生成过的数据,同时进行多次重试,所以生成大量数据的时候,性能也会受到影响。所以,具体看是业务场景需要吧。

自定义数据Provider

虽然Faker模块提供了很多用于生成测试数据的方法,但是,有时候我们还是有一些自定义的测试数据生成规则的需要。这时候,我们可以用random模块来实现自定义的特定需求。当然,Faker模块也提供了我们进行自定义测试数据Provider类的方法,从而扩展Faker模块的测试数据生成的功能。

如果暂时不熟悉面向对象的相关语法,以下代码实例,可以跳过,通常使用random模块依然能够满足需求。

方法1:通过继承BaseProvider来实现自定义测试数据的生成:

代码中,本质上还是通过上一篇文章中提到的random.sample()取样方法来实现我们需要的测试数据生成的逻辑。

根据业务场景,批量生成测试数据

生成一批有几条简单规则的测试数据:

输出结果:

注意,此时我们只是把测试数据打印输出了,通常情况下,我们应该把数据保存到文件中,或者写入到数据库中,以便于后续的使用。由于我们暂时没有介绍到文件IO或者数据库的操作,可以有个偷懒的写法,通过open()打开一个文件,具体的参数,后续会提到,然后对print语句补充传参:

这里,只需要注意两行代码的变化:

1、以写的方式打开一个名为test_data.csv的文件,如果文件不存在会自动创建,文件打开时有内容会被清空

2、print()函数的扩展用法:

print()函数除了把内容输出到屏幕上之外,还可以通过file命名形参指定别的输出目的地输出流,参数说明如下:

file:表示内容输出的目的地,默认值为sys.out表示标准输出,就是输出到显示器显示出来

flush:表示是否立即将内容刷出到指定目的地,默认值为False,会缓存,不立即刷出

更多参数,可以查看print()函数的定义:

关于print中的sep参数、end参数的作用,可以阅读print()定义,并自己试着编写代码验证,这里就不展开了。

0 阅读:0