最近在做接口测试,使用Factory-boy来生成接口对象实例,接着将对象转成dict,最后通过requests发送请求。

对象转成dict,目前知道的方法就是object.__dict__ 。这个方法用于普通对象(这边指的是,属性值都是str和int)还挺方便的,一旦遇到复杂的对象(属性值是其它对象实例)就不适用了。

在网上没有找到适用的代码,所以只能自己写个勉强能用的,目前支持属性值是str 、 int  、object 和 list的情况

 def objecttodict(obj):
dict_o=obj.__dict__
for key, value in dict_o.items():
print(key,type(value))
if isinstance(value, (str,int)):#不处理str,int的情况
pass
elif value is None:
pass
elif isinstance(value, list):#处理list的情况
valuelist=[]
for l in value:
if isinstance(l, (str,int)):
valuelist.append(l)
else:
valuelist.append(objecttodict(l))
dict_o[key] = valuelist
elif isinstance(value, dict):
pass#不处理dict的情况
else:#处理普通对象
dict_o[key]=objecttodict(value)
return dict_o

比如下面结构的对象,可以通过上面的方法转成dict

下面是试验使用的Factory-boy例子

 import factory.fuzzy
from demo_factory_boy.fbobject.user import User
from demo_factory_boy.fbobject.school import School
from demo_factory_boy.fbobject.home import Home
from demo_factory_boy.fbprivader.numpv import NumProvider factory.Faker.add_provider(NumProvider) #添加自定义的NumProvider class HomeFactory(factory.Factory):
class Meta:
model = Home address = factory.sequence(lambda n: 'address%04d' % n)#factory.sequence
name=["hhh",2] class SchoolFactory(factory.Factory):
class Meta:
model = School schoolName = factory.sequence(lambda n: 'school%04d' % n)#factory.sequence
home=factory.List(factory.build_batch(HomeFactory, 4)) class UserFactory(factory.Factory):
class Meta:
model = User name = factory.Faker("name", locale="zh_CN")#factory.Faker
num = factory.Faker("num")
#age = factory.fuzzy.FuzzyInteger(42)#factory.fuzzy.FuzzyInteger
age = factory.Faker("random_int",min=18, max=30, step=1)
city = factory.Faker("address", locale="zh_CN")
phone = factory.fuzzy.FuzzyText("", 7, "", "")#factory.fuzzy.FuzzyText
school = factory.SubFactory(SchoolFactory)#factory.SubFactory #info=factory.List([SchoolFactory])
info =factory.List(factory.build_batch(SchoolFactory, 4)) class Params:
shipped = factory.Trait(
name=None
)

将Factory-boy生成的复杂对象转成dict的方法的更多相关文章

  1. 编写Python脚本把sqlAlchemy对象转换成dict的教程

    编写Python脚本把sqlAlchemy对象转换成dict的教程 在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操 ...

  2. PHP将对象转换成数组的方法(兼容多维数组类型)

    /** * @author gayayang * @date 2012-8-21 * @todo 将对象转换成数组 * @param unknown_type $obj * @return unkno ...

  3. 把dataset对象转换成list集合方法

    public static List<T> GetList<T>(DataTable table) where T:new() { List<T> list = n ...

  4. python中自定义类对象json字符串化的方法

    1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...

  5. Django自定义对象转成json字符串

    1.定义转换函数:def convert_to_builtin_type(obj): print 'default(', repr(obj), ')' # 把MyObj对象转换成dict类型的对象 d ...

  6. python class对象转换成json/字典

    # -*- encoding: UTF-8 -*- class Student: name = '' age = 0 def __init__(self, name, age): self.name ...

  7. C# Emit动态代理生成一个实体对象

    /// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...

  8. 设计模式---对象创建模式之工厂方法模式(Factory Method)

    前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...

  9. WCF生成客户端代理对象的两种方法的解释

    最近在封装WCF,有一些很好的实践就记录下来,大家可以放心使用,所有代码都已经调试过.如果有高手可以大家探讨一下. 在WCF中有两种不同的方法可以用于创建客户端服务对象,他们分别为: 1. 代理构造法 ...

随机推荐

  1. C++之memset函数

    可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...

  2. LintCode_13 字符串查找

    题目 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始).如果不存在,则返回 -1. 您在真实的面 ...

  3. JDK源码阅读--Object

    在java.lang包下 Object类:是所有类的基类(父类) public final native Class<?> getClass(); 返回这个Object所代表的的运行时类 ...

  4. C++ const修饰不同类型的用法

    const取自constant的缩写,本意是不变的,不易改变的意思 一.修饰普通变量 const int a = 7; int b = a;         //正确 a = 8;           ...

  5. vue 报错:Cannot read property '_wrapper' of undefined

    我的情况是@click="xx" ,而xx函数未定义

  6. Activiti流程变量

    流程变量在整个工作流中扮演很重要的作用 例如:请假流程中有请假天数.请假原因等一些参数都为流程变量的范围.流程变量的作用域范围是流程实例.也就是说各个流程实例的流程变量是不相互影响的. 添加流程变量 ...

  7. Teigha克隆db的blockTableRecord里面的一个实体

    std::vector<OdDbEntityPtr> entities; OdDbBlockTableRecordPtr blkTblRcd = blockId.openObject(); ...

  8. Redis Replication & Sentinel

    实践目标: Redis Replication 一主:192.168.1.104 双从:192.168.1.101 192.168.1.103 Sentinel:192.168.1.102 系统环境: ...

  9. Odoo文档管理/知识管理应用实践 - 上传附件

    测试环境: Odoo8.0 Odoo中的文档管理/知识管理可用于保存采购.销售.生产等一系列业务流程中产生的文件.凭证,可关联到具体的每一笔业务操作:也能用于管理公司的合同.资料,创建知识库以分享内部 ...

  10. Python开发利器Pycharm

    可以新建项目的时候,在下面的小扳手那里创建虚拟化环境.若想安装包,直接file->setting里面找到对应项目,然后添加新的包即可.   视频地址:http://edu.51cto.com/c ...