将Factory-boy生成的复杂对象转成dict的方法
最近在做接口测试,使用Factory-boy来生成接口对象实例,接着将对象转成dict,最后通过requests发送请求。
对象转成dict,目前知道的方法就是object.__dict__ 。这个方法用于普通对象(这边指的是,属性值都是str和int)还挺方便的,一旦遇到复杂的对象(属性值是其它对象实例)就不适用了。
在网上没有找到适用的代码,所以只能自己写个勉强能用的,目前支持属性值是str 、 int 、object 和 list的情况
1 def objecttodict(obj): 2 dict_o=obj.__dict__ 3 for key, value in dict_o.items(): 4 print(key,type(value)) 5 if isinstance(value, (str,int)):#不处理str,int的情况 6 pass 7 elif value is None: 8 pass 9 elif isinstance(value, list):#处理list的情况 10 valuelist=[] 11 for l in value: 12 if isinstance(l, (str,int)): 13 valuelist.append(l) 14 else: 15 valuelist.append(objecttodict(l)) 16 dict_o[key] = valuelist 17 elif isinstance(value, dict): 18 pass#不处理dict的情况 19 else:#处理普通对象 20 dict_o[key]=objecttodict(value) 21 return dict_o
比如下面结构的对象,可以通过上面的方法转成dict
下面是试验使用的Factory-boy例子
1 import factory.fuzzy 2 from demo_factory_boy.fbobject.user import User 3 from demo_factory_boy.fbobject.school import School 4 from demo_factory_boy.fbobject.home import Home 5 from demo_factory_boy.fbprivader.numpv import NumProvider 6 7 factory.Faker.add_provider(NumProvider) #添加自定义的NumProvider 8 9 class HomeFactory(factory.Factory): 10 class Meta: 11 model = Home 12 13 address = factory.sequence(lambda n: 'address%04d' % n)#factory.sequence 14 name=["hhh",2] 15 16 class SchoolFactory(factory.Factory): 17 class Meta: 18 model = School 19 20 schoolName = factory.sequence(lambda n: 'school%04d' % n)#factory.sequence 21 home=factory.List(factory.build_batch(HomeFactory, 4)) 22 23 24 class UserFactory(factory.Factory): 25 class Meta: 26 model = User 27 28 name = factory.Faker("name", locale="zh_CN")#factory.Faker 29 num = factory.Faker("num") 30 #age = factory.fuzzy.FuzzyInteger(42)#factory.fuzzy.FuzzyInteger 31 age = factory.Faker("random_int",min=18, max=30, step=1) 32 city = factory.Faker("address", locale="zh_CN") 33 phone = factory.fuzzy.FuzzyText("138", 7, "1", "1234567890")#factory.fuzzy.FuzzyText 34 school = factory.SubFactory(SchoolFactory)#factory.SubFactory 35 36 #info=factory.List([SchoolFactory]) 37 info =factory.List(factory.build_batch(SchoolFactory, 4)) 41 42 class Params: 43 shipped = factory.Trait( 44 name=None 45 )
本文来自博客园,作者:月色深潭,交流群:733423266,转载请注明原文链接:https://www.cnblogs.com/moonpool/p/11454902.html