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

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第三方库


热门话题
java为什么大摇大摆的ui不显示带注释的REST方法?   soapweb服务概念。(来自WSDL的Java或来自Java的WSDL)   java Junit测试日志语句   java如何使Sonar与XMLInputFactory和woodstox库注册的实现兼容?   java无法启动活动组件信息{com.example.countryselect/com.example.countryselect.OfferSelect}   java在2d数组中递增对象   java在序列化和反序列化期间如何调用构造函数?   JavaFx:在按钮内设置布尔值并将其取出   java GWT如何异步发送表单?   java编译错误。木卫一。必须捕获或声明IOException错误   java无法解释的长时间停止在G1 Collector中的并发标记步骤期间世界暂停   java计算J2EE应用程序中对象的出现次数   Java使用相同的变量名和值定义字符串常量   java Samsung键盘退格不适用于SearchView   java将Spring Web应用程序部署到JBoss WebApplicationContext异常   java在加载jsp时试图调用servlet   Vertx JDBC NoSuchMethodError’java。sql。连接io。农业的。应用程序编程接口。交易交易整合。getConnection()   JAVAutil。scanner使用scanner读取Java文件