用于访问烧瓶应用程序的请求会话的适配器

requests-flask-adapter的Python项目详细描述


Build Status

目的

flask adapter是一个请求适配器,它允许用户使用请求调用flask app端点,而无需运行flask服务器。

它的主要用途包括构建集成测试和客户端测试,而不必借助于多线程/多处理/在另一个shell/docker中运行实例来生成一个正在运行的flask应用程序。通过这样做,您可以调用希望与客户机一起测试的端点。它还可以作为flask测试客户机的替代品,在unittests中解锁众所周知的、广受欢迎的请求接口,因为上帝知道我喜欢测试中的那些json.loads(res.data.decode('utf-8'))语句。

使用FlaskAdapter作为测试客户端

您可以通过两种方式将flask测试客户端替换为请求接口。

第一种方法是导入请求烧瓶适配器会话,它基本上是请求会话的子类会话,但允许注册应用程序。

fromrequests_flask_adapterimportSessionfrommy_production_codeimportsetup_my_appfrompytestimportfixture@fixturedefsession():app=setup_my_app()Session.register('http://my_app',app)returnSession()deftest_it_runs_my_test(session):result=session.get("http://my_app/my_endpoint",params={'some':'params'})assertresult.json()=={'nailed':'it'}

如果您不想或者由于某种原因不能依赖于requests_flask_adapter.Session,您还可以使用requests_flask_adapter helper函数对请求会话进行monkey-patch。目前,它在很大程度上依赖于导入顺序,因此在导入测试会话之前,请确保对其进行修补。

fromrequests_flask_adapter.helpersimportpatch_requestspatch_requests([('http://patched_app',app),('http://another_patched_app',another_app)])

在测试中,您现在可以运行导入请求的代码。session

deftest_it_runs_code_that_imports_requests():result=my_code_that_imports_requests_and_does_something()assertresult==[':ok_hand:']

使用flaskadapter进行客户机测试

类似地,flaskadapter对于测试用请求编写的客户机非常有效。 再一次,不用运行flask应用的实时服务器。

fromrequests_flask_adapterimportSessionfrommy_production_codeimportsetup_my_app,Userfrommy_clientimportClientfrompytestimportfixture@fixturedefclient():app=setup_my_app()Session.register('http://my_app',app)returnClient(base_url='http://my_app',session=Session(),# monkeypatch if your client isn't accepting another session.auth=('Scanlan','b3st_b4rd_Exandr!a'),)deftest_it_gets_a_user_list(client):users=client.users()assertusers==['vex','vax']deftest_it_can_upload_a_timesheet(client):withopen('data/timesheet.xls','r')asfh:client.upload_timesheet(fh)user=User.query.get(1)assertuser.hours_worked_this_month==8

使用flaskadapter进行跨应用程序集成测试

仅仅因为我需要放大这个自述文件来验证这个项目,我就把“集成测试”作为它的功能之一。 当然,这些集成测试要求您能够访问要测试的flask应用程序的源代码。

举个例子。

假设您的团队拥有并维护以下代码库:

  • 这是一个webshop应用程序,它还可以跟踪上个小时的销售、用户访问量和其他统计数据。通过应用程序中的终结点可以访问这些统计信息。
  • 一个ETL脚本,它定期运行并从您的Webshop收集实时统计信息。
  • 存储由ETL脚本提取的数据的TimeSeries数据库

使用存储在TimeSeries数据库中的数据,您有一个每月运行一次的报告脚本,用于确定高峰时段、最受欢迎的产品和时段、对哪些产品感兴趣的用户数量、哪些产品处于趋势中或不在趋势中等。

鉴于这些代码库仍在积极构建中,您希望确保将来的实现不会在整个链中引入回归。

fromdatetimeimportdatetime,timedeltafrompytestimportfixturefromrequests_flask_adapterimportSessionfrommy_webshop_appimportappasfeeder_appfrommy_timeseries_database_appimportappastimeseries_app,Seriesfrommy_etl_projectimport(ETLWorker,FeederClient,TSWriter,ConfigLoader)from.helpersimportpopulate_webshopSession.register('http://feeder_app',feeder_app)Session.register('http://timeseries_app',timeseries_app)populate_webshop(feeder_app)@fixturedeffeeder_client():config=ConfigLoader(location='environ')returnFeederClient(base_url='http://feeder_app',session=Session(),username=config['feeder_username'],password=contig['feeder_password'])@fixturedefwriter():config=ConfigLoader(location='environ')returnTSWriter(base_url='http://timeseries_app',session=Session(),username=config['writer_username'],password=contig['writer_password'])deftest_it_can_go_end_to_end(feeder_client,writer)now=datetime.now()worker=ETLWorker(feeder=feeder_client,writer=writer,)worker.run()result=Series.sum('my_serie_name',start=now,end=now+timedelta(days=1))assertresult==42

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

推荐PyPI第三方库


热门话题
如何获得@sign,以便在Java代码中键入@override?   java Facebook登录不起作用,我忘了什么?   json如何在java中从MongoDB Atlas获取特定字段?   java如何在Android上的JNI中实现委托/协议(在iOS上)?   java为什么这个循环多次的程序在循环后有一个“println”时需要花费时间?   java无法使组合框正常工作   JavaCQ5。如何为作者显示列表发布者?版本5.5   java我可以要求泛型参数具有泛型参数吗?   JavaOKHTTP无法获取整个JSON   数组Java:用字符减去字符意味着什么?   java为什么Eclipse content assist无法从部分方法名生成方法存根?   java使用线程在Android Studio中一次加载一个多位图   java遍历二叉树并返回一个值