Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 设置金字塔1.5测试正确的方法_Python_Integration Testing_Pyramid_Pytest - Fatal编程技术网

Python 设置金字塔1.5测试正确的方法

Python 设置金字塔1.5测试正确的方法,python,integration-testing,pyramid,pytest,Python,Integration Testing,Pyramid,Pytest,虽然金字塔文档通常很好,但我找不到如何设置(请注意,基本代码片段缺失!)。也就是说,在哪里放置特定的配置 在_init中,我有main()函数,它包括一些其他模块,其中有一个需要SQLAlchemy。另一个复杂的问题是,身份验证策略依赖于设置,所以所有这些都存在于main中(否则我会创建includeme,不确定它是否与这个问题相关) 首先,我尝试了以下方法(在收集了includeme函数中的所有内容之后): 当然,在sqlalchemy引擎的某个地方,从配置中失败了。 但我知道,我可能可以使用

虽然金字塔文档通常很好,但我找不到如何设置(请注意,基本代码片段缺失!)。也就是说,在哪里放置特定的配置

在_init中,我有main()函数,它包括一些其他模块,其中有一个需要SQLAlchemy。另一个复杂的问题是,身份验证策略依赖于设置,所以所有这些都存在于main中(否则我会创建includeme,不确定它是否与这个问题相关)

首先,我尝试了以下方法(在收集了includeme函数中的所有内容之后):

当然,在sqlalchemy引擎的某个地方,从配置中失败了。 但我知道,我可能可以使用main()并为配置提供test.ini。尽管如此,我还是很喜欢《要点》中包含的所有方法:

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上的临时错误,该基本代码片段丢失

这里有一个未包含的代码链接。

[已编辑]

以下是金字塔炼金术支架的两个测试示例。每个都有自己的风格。希望您发现其中一个对您的场景有用

  • 如果安装了Pyramid,则可以从alchemy脚手架创建示例项目

    $ $VENV/bin/pcreate -s alchemy tutorial
    
    如果该命令不适用于您,则将详细介绍该命令的必要条件

    脚手架包括这些

  • 我们正在开发一个新的分支来更新这个框架,目标是在Pyramid1.7中合并。这是它的名字

    如果您签出该分支,并运行教程步骤,您可以看到完整的上下文

  • [已编辑]

    这里还有一个地方可以看:


    顺便说一句,我很难给你一个合适的答案。对于初学者,我看不出在测试代码中调用
    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