全新的API测试方法

apitist的Python项目详细描述


Build StatusPyPI versionDownloads

养蜂人

全新的API测试方法

主要特点:

  • 为请求库添加挂钩
  • 默认挂钩:
    • 测井
    • 结构化/非结构化数据

安装

在命令行中运行以下命令:

pip install apitist

如果要使用预定义的随机类型,请安装其他要求:

^{pr2}$

默认挂钩

  • RequestDebugLoggingHook-使用DEBUG级别记录请求内容
  • RequestInfoLoggingHook-用级别信息记录请求内容
  • prerequestdebugginghook-用级别DEBUG记录准备好的请求内容(例如,您将在URL中看到查询参数)
  • prerequestinfologginghook-用级别信息记录准备好的请求内容
  • ResponseDebugLoggingHook-使用调试级别记录响应内容
  • ResponseInfoLoggingHook-用级别信息记录响应内容
  • RequestAttrsConverterHook-将data字段中的attrs类转换为json
  • RequestDataclassConverterHook-将data字段中的dataclass类转换为json
  • ResponseAttrsConverterHook-将structure(type)函数添加到requests.Response类中,它将构造 根据给它的属性类响应
  • ResponseDataclassConverterHook-将structure(type)函数添加到requests.Response类中,它将构造 根据给它的dataclass类的响应

示例用法

fromapitistimportPrepRequestInfoLoggingHook,ResponseInfoLoggingHookfromapitistimportsessions=session()PrepRequestInfoLoggingHook.formatter="Best formatter {req.method}{req.url}"s.add_prep_request_hook(PrepRequestInfoLoggingHook)s.add_response_hook(ResponseInfoLoggingHook)s.post("https://httpbin.org/post",params={"q":"test"})

自定义挂钩

fromrequestsimportRequest,PreparedRequest,Responsefromapitistimportsession,RequestHook,PreparedRequestHook,ResponseHooks=session()classReqHook(RequestHook):defrun(self,request:Request)->Request:print(request.url)returnrequestclassPrepReqHook(PreparedRequestHook):defrun(self,request:PreparedRequest)->PreparedRequest:print(request.url)returnrequestclassRespHook(ResponseHook):defrun(self,response:Response)->Response:print(response.url)returnresponses.add_request_hook(ReqHook)s.add_prep_request_hook(PrepReqHook)s.add_response_hook(RespHook)s.get("https://ya.ru",params={"q":"test"})

与构造函数一起工作

importattrimporttypingfromapitistimport(converter,RequestConverterHook,ResponseConverterHook,session,)classExampleType:test=None@attr.sclassExampleStructure:test:ExampleType=attr.ib()@attr.sclassTestResponse:args:typing.Dict=attr.ib()data:str=attr.ib()files:typing.Dict=attr.ib()form:typing.Dict=attr.ib()headers:typing.Dict=attr.ib()json:ExampleStructure=attr.ib()origin:str=attr.ib()url:str=attr.ib()s=session()s.add_hook(RequestConverterHook)s.add_hook(ResponseConverterHook)defstructure_example_type(data,type_):example=ExampleType()example.test=datareturnexampledefunstructure_example_type(data):returndata.testconverter.register_hooks(ExampleType,structure_example_type,unstructure_example_type)t=ExampleType()t.test="test"struc=ExampleStructure(t)res=s.post("https://httpbin.org/post",data=struc).structure(TestResponse)print(res.structured.json.test.test)# test

使用随机数据发生器

首先创建一个random类的实例:

fromapitistimportRandomerrand=Randomer()

现在,您可以为不同类型添加自定义挂钩:

rand.add_type(str,lambda:str(random.random()))rand.add_type(float,lambda:random.random())

或使用add_types

types={str:lambda:str(random.random()),float:lambda:random.random()}rand.add_types(types)

现在可以为给定类型或任何attrs类创建随机对象 定义的类型:

importattrimportdataclassesimporttypingrand.object(str)# '0.6147789314561384'rand.object(float)# 0.4664297665239271@attr.sclassData:value1:str=attr.ib()value2:typing.List[str]=attr.ib()value3:typing.Tuple[float]=attr.ib()@dataclasses.dataclassclassDataclass:value1:strvalue2:typing.List[str]value3:typing.Tuple[float]print(rand.object(Data))# Data(#   value1='0.491058956716827',#   value2=['0.6568036485871975'],#   value3=(0.8603579349502298,)# )# Also works for dataclassesprint(rand.object(Dataclass))# Data(#   value1='0.491058956716827',#   value2=['0.6568036485871975'],#   value3=(0.8603579349502298,)# )

最好与Faker一起使用。 只需为str定义不同的子类,并为它们添加不同的钩子。 这样,您就可以为不同的str字段创建不同的数据。在

另外,与RequestConverterHookResponseConverterHook一起使用 您可以轻松地创建随机的json对象,这些对象将被发送到服务器。在

预定义的随机类型

fromapitistimportRandomerfromapitist.randomimportUsername,FirstName,LastName,Datefromdataclassesimportdataclass@dataclassclassLoginModel:username:Usernamepassword:str@dataclassclassBookingDates:checkin:Datecheckout:Date@dataclassclassBookingModel:firstname:FirstNamelastname:LastNametotalprice:intdepositpaid:boolbookingdates:BookingDatesadditionalneeds:strrand=Randomer()rand.add_predefined(locale="es-ES")rand.object(LoginModel)# LoginModel(#   username='wfeliu',#   password='VjHoHtLSjdoxXhtitaXU'# )rand.object(BookingModel)# BookingModel(#   firstname='Pedro',#   lastname='Luz',#   totalprice=931,#   depositpaid=True,#   bookingdates=BookingDates(checkin='1972-08-29', checkout='1971-05-19'),#   additionalneeds='EFggHSpnzRSJATKtUmOm'# )

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Spring启动启用HTTPS   actionscript 3 java中的这个[“var”+“name”]   java只匹配给定集合中一个字符的一个匹配项   java Hibernate:防止角色表中出现多个相同的条目   javajersey+Spring注入servlet请求   java HtmlEditor javafx失去焦点   java Apache Wicket AjaxRequestTarget ListView组件未刷新或更新   mysql java。无法将lang.String转换为java。sql。时间戳   java将巨大的整数文件(在一行中)拆分为具有内存限制的已排序块   安卓如何完全关闭proguard?   安装Eclipse和Android SDK后的java“无AVD可用”消息   java动态显示图像视图   java在Spring中还有哪些WebsocketClient实现?   java Glassfish需要很长时间才能重新启动   使用Java简单串行连接器将pc与arduino连接   java如何在camel文件组件配置中结合readLockCheckInterval和maxMessagesPerPoll?   单击Android时的java预览图像   java如何将字节数组转换为ByteArrayOutputStream