草庐IT

Flask作为企业级项目的服务端项目在测试骨架蓝图的伪造资源和环境以及出错处理的方法记录

上进小菜猪 2023-03-28 原文

测试骨架

首先,我们将测试文件夹添加到应用程序的根文件夹中。然后创建一个Python文件来存储测试内容(test_flaskr.py)。名称与test_*类似。pytest将自动找到py文件。 接下来,我们创建一个名为client()的pytest固件来配置调试应用程序并初始化一个新数据库:

import os import tempfile import pytest from flaskr import flaskr @pytest.fixture def client(): db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp() flaskr.app.config['TESTING'] = True with flaskr.app.test_client() as client: with flaskr.app.app_context(): flaskr.init_db() yield client os.close(db_fd) os.unlink(flaskr.app.config['DATABASE']) 客户端固件将由每个独立测试调用。它为我们提供了一个简单的应用程序接口,用于向应用程序发送请求和跟踪cookie。 在配置中,TESTING配置标志被激活。通过这种方式,在请求处理期间关闭错误捕获,以便于在测试期间更好地报告错误。 因为SQLite3基于文件系统,所以我们可以轻松地使用tempfile模块创建临时数据库并对其进行初始化。mkstemp()函数返回两个东西:一个低级文件句柄和一个随机文件名。此文件名后面将是我们的数据库名。我们必须将句柄保存到db_Fd以使用os关闭文件。close()函数。 为了在测试后删除数据库,固件关闭并删除文件。

伪造资源和环境

通常,我们会将用户身份验证信息和数据库连接存储到应用程序环境或烧瓶G对象,并在首次使用之前准备好,然后在断开连接时删除。假设在应用程序中获得的当前用户的代码如下:

def get_user(): user = getattr(g, 'user', None) if user is None: user = fetch_current_user_from_database() g.user = user return user

测试 CLI 命令

单击来自测试工具,可用于测试CLI命令。CliRunner独立运行命令,并通过Result对象捕获输出。 Flask提供test_cli_Runner()来创建FlaskCliRunner,以自动将Flask应用程序传输到cli。使用其invoke()方法调用命令,就像在命令行上调用它一样:

import click @app.cli.command('hello') @click.option('--name', default='World') def hello_command(name) click.echo(f'Hello, {name}!') def test_hello(): runner = app.test_cli_runner() # invoke the command directly result = runner.invoke(hello_command, ['--name', 'Flask']) assert 'Hello, Flask' in result.output # or by name result = runner.invoke(args=['hello']) assert 'World' in result.output

线程本地对象

Flask使用线程本地对象(实际上是上下文本地对象,它也支持greenlet上下文)来支持请求、会话和一个可以放置自己东西的附加对象(g)。你为什么这么做?这不是个坏主意吗? 是的,使用线程本地对象通常不是明智的选择,这会在不基于线程概念的服务器上造成问题,并增加大型应用程序的维护难度。然而,Flask不仅是为大型应用程序或异步服务器设计的,而且还希望简化和加速传统web应用程序的开发。

蓝图

与验证蓝图不同,博客蓝图没有url_前缀因此,索引视图将用于/,create将用于/create,依此类推。博客是Flaskr的主要功能,因此将博客索引作为主要索引是合理的。

from flask import ( Blueprint, flash, g, redirect, render_template, request, url_for ) from werkzeug.exceptions import abort from flaskr.auth import login_required from flaskr.db import get_db bp = Blueprint('blog', __name__) 但是,下面的索引视图的端点将被定义为博客索引一些验证视图被分配给普通索引端点。我们使用app add_url_规则()与端点名称“index”和/url相关联,因此url_For('index')或url_For('blog.index'”)将有效,并且将生成相同的/url。 在其他应用程序中,可以在factory_Prefix中为博客蓝图提供URL,并定义一个 独立的索引视图,类似于上一篇文章中的hello视图。在这种情况下,index和blog索引的端点和URL将不同。

把出错信息通过电子邮件发送给管理者

要主动查找和修复错误,可以配置日志记录。handlers SMTPHandler用于在发生一般错误或更高级别错误时发送电子邮件:

import logging from logging.handlers import SMTPHandler mail_handler = SMTPHandler( mailhost='127.0.0.1', fromaddr='[email protected]', toaddrs=['[email protected]'], subject='Application Error' ) mail_handler.setLevel(logging.ERROR) mail_handler.setFormatter(logging.Formatter( '[%(asctime)s] %(levelname)s in %(module)s: %(message)s' )) if not app.debug: app.logger.addHandler(mail_handler) 当产品在远程服务器上运行时,可能不会频繁查看日志信息。WSGI服务器可能会在一个文件中记录日志消息,只有当用户告诉您错误时,您才会查看日志文件。

有关Flask作为企业级项目的服务端项目在测试骨架蓝图的伪造资源和环境以及出错处理的方法记录的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  5. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  6. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  7. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  10. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

随机推荐