Python 设置金字塔1.5测试正确的方法
虽然金字塔文档通常很好,但我找不到如何设置(请注意,基本代码片段缺失!)。也就是说,在哪里放置特定的配置 在_init中,我有main()函数,它包括一些其他模块,其中有一个需要SQLAlchemy。另一个复杂的问题是,身份验证策略依赖于设置,所以所有这些都存在于main中(否则我会创建includeme,不确定它是否与这个问题相关) 首先,我尝试了以下方法(在收集了includeme函数中的所有内容之后): 当然,在sqlalchemy引擎的某个地方,从配置中失败了。 但我知道,我可能可以使用main()并为配置提供test.ini。尽管如此,我还是很喜欢《要点》中包含的所有方法:Python 设置金字塔1.5测试正确的方法,python,integration-testing,pyramid,pytest,Python,Integration Testing,Pyramid,Pytest,虽然金字塔文档通常很好,但我找不到如何设置(请注意,基本代码片段缺失!)。也就是说,在哪里放置特定的配置 在_init中,我有main()函数,它包括一些其他模块,其中有一个需要SQLAlchemy。另一个复杂的问题是,身份验证策略依赖于设置,所以所有这些都存在于main中(否则我会创建includeme,不确定它是否与这个问题相关) 首先,我尝试了以下方法(在收集了includeme函数中的所有内容之后): 当然,在sqlalchemy引擎的某个地方,从配置中失败了。 但我知道,我可能可以使用
class IntegrationTestBase(BaseTestCase):
@classmethod
def setUpClass(cls):
cls.app = main({}, **settings)
super(IntegrationTestBase, cls).setUpClass()
def setUp(self):
self.app = webtest.TestApp(self.app)
self.config = testing.setUp()
super(IntegrationTestBase, self).setUp()
上述代码的部分问题在于设置没有在self.config中结束。如果我使用self.config=testing.setUp(settings=settings)
增强它,测试仍然失败:
AttributeError: 'DummyRequest' object has no attribute 'include'
pyramid_bowerstatic没有机会修改请求等。因此,我需要关心所有第三方模块的突发奇想,而不是使用给定的配置进行开箱即用的集成测试(应用程序本身运行时没有任何问题!),并专注于编写测试
因此,我希望有更好的方法来进行集成测试,包括处理几个包含的包、自定义身份验证策略、事件和其他“魔法”
如果有必要,可以使用Py.test。pytest_金字塔似乎是相关的,但文档中没有任何示例
不完全是,但类似的问题:,尤其是在对答案的评论中
我找到了日语的特别解决方案(目前对我有效):
但问题是,如何可靠地设置集成测试,在所有方面都相当于应用程序,而不查看第三方模块(特定ini文件除外)
更新:这是有问题的电话之一:
视图:
在测试中:
class ViewTests(IntegrationTestBase):
def test_my_view(self):
from myproject.views.main import MainViews
request = self._make_request(self.config) # before was: DummyRequest
info = MainViews(request).my_view()
self.assertEqual(info['project'], 'Myproject')
由于金字塔的体系结构已经很好地解耦,所以可能已经足够满足所有的请求。也就是说,问题可以重新表述为:什么是通用的_make_request函数,它给出的结果与正在运行的应用程序请求相同(带有扩展、tween、添加的请求属性,包括来自第三方模块的属性等)?有现成的工厂吗?IMHO,如果开发人员需要模拟自己的“集成”来测试应用程序的真实性,那么这不是集成测试。我不确定这些是否是唯一的东西,但我想工厂至少应该提供一个包含所有钩子的请求,就像这里提到的:不管是哪个包含的包添加了钩子
更新2:我想到,对于测试环境和运行时环境之间的差异,有一个非常明确的一级近似指标。我比较了视图的正常调用和测试调用的请求。首先,这里是我的_make_请求,它足以添加请求方法,但缺少更多(如下所示):
普通调用具有以下属性(request.\u dict.\u.keys()):
并仅测试调用以下各项:
['environ',
'registry',
'get_bowerstatic_path',
'include']
这清楚地表明,我的方法还不够,我将遇到视图问题,这些视图使用其他请求功能。在上面的_make_请求中,只有最小的视图通过
换句话说,如何获取相同的请求,该请求在功能测试中使用,例如在webtest的TestApp中,但不是执行TestApp.get(…),而是使用该请求调用视图并对callable的返回结果进行断言(不呈现为HTML)?由于RTD上的临时错误,该基本代码片段丢失 这里有一个未包含的代码链接。 [已编辑] 以下是金字塔炼金术支架的两个测试示例。每个都有自己的风格。希望您发现其中一个对您的场景有用
$ $VENV/bin/pcreate -s alchemy tutorial
如果该命令不适用于您,则将详细介绍该命令的必要条件
脚手架包括这些顺便说一句,我很难给你一个合适的答案。对于初学者,我看不出在测试代码中调用
DummyRequest
。你能在你的问题中给出一个完整的可重复的例子吗?谢谢,不过,现在我发现它和我问题中的第一个片段是一样的。它不适用于第三方includeme。也就是说,它至少在某些包含的模块使用config.add_request_方法时不起作用。这是一个好消息,但问题不在于SQLAlchemy:myproject甚至不直接使用它。这是一种安排集成测试的方法,无论第三方模块作为tweens注入,请求方法,无论什么都可以使用。@StivePiercy(重新阅读我的回复)对不起,我不想在开源项目的评论中要求一些东西。如果Pyramid不提供设置集成测试的通用方法(不需要在config.ini和db bootstrap之外进行调整),并且每个项目都应该为第三方组件本身制作夹具,那么这是一个很好的答案。我很惊讶,这就是我问的原因。我已经更新了我的问题,尽管我没有针对我的具体情况寻求答案。我在问是否有一个工厂可以用于生成请求,其中包括与应用程序相同的内容。与功能测试类似,但我不需要WebTest级别。
def _make_request(self, config, path="/"):
from pyramid.request import Request
from pyramid.interfaces import IRequestExtensions
request = Request.blank(path)
extensions = config.registry.getUtility(IRequestExtensions)
request.registry = config.registry
request._set_extensions(extensions)
return request
['traversed',
'virtual_root',
'virtual_root_path',
'subpath',
'request_iface',
'__view__',
'view_name',
'tm',
'environ',
'registry',
'context',
'matched_route',
'get_bowerstatic_path',
'include',
'root',
'matchdict',
'invoke_subrequest']
['environ',
'registry',
'get_bowerstatic_path',
'include']
$ $VENV/bin/pcreate -s alchemy tutorial