【问题标题】:Setting up Pyramid 1.5 testing the right way设置 Pyramid 1.5 测试的正确方式
【发布时间】:2015-11-18 09:42:04
【问题描述】:

虽然 Pyramid 文档通常非常好,但我找不到如何设置 integration tests for a Pyramid 1.5 application(请注意缺少基本代码片段!)。也就是说,在哪里放置特定的配置。

在 __init__ 我有 main() 函数,其中包括一些其他模块,其中有一个需要 SQLAlchemy。另一个复杂因素是身份验证策略取决于设置,因此所有内容都存在于 main 中(否则我会做 includeme,不确定它是否与这个问题相关)。

起初我尝试了以下方法(在将我可以收集的内容收集到 includeme 函数中之后):

class ViewTests(unittest.TestCase):
    def setUp(self):
        self.config = testing.setUp()
        self.config.include('myproject.includeme')

这当然在 sqlalchemy engine_from_config 的某个地方失败了。 但后来我有found,我可能可以使用 main() 并提供 test.ini 进行配置。我仍然喜欢 gist 的包罗万象的方法:

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_pyramid 似乎是相关的,但文档没有任何示例。

不完全是,但类似的问题:How to Make view_config decorator work with a Pyramid Unit Test?,尤其是在 cmets 的答案中。

我找到了日语的临时解决方案(目前对我有用):http://qiita.com/podhmo/items/2c6d8cb78c1f84569f0a

但是问题是如何可靠地设置集成测试,在所有方面都等同于应用程序,而不需要查看第三方模块,除了特定的 ini 文件?

更新:这是有问题的调用之一:

查看:

components = pyramid_bowerstatic.create_components('sbadmin',
             os.path.join(os.path.dirname(__file__), 'bower_components'))
class MainViews(Layouts):
    @view_config(route_name='home', renderer='templates/mytemplate.pt')
    def my_view(self):
        self.request.include(components, 'jquery')
        return {'project': 'Myproject'}

在测试中:

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')

由于 Pyramid 的良好解耦架构,它可能足以拥有包罗万象的请求。也就是说,问题可以重新表述为:什么是通用 _make_request 函数,它给出的结果与正在运行的应用程序请求相同(带有扩展、补间、添加的请求属性,包括来自 3rd 方模块的属性等)?有现成的工厂吗? 恕我直言,如果开发人员需要模拟它自己的“集成”来测试而不是采用真正的应用程序,这不是集成测试。我不确定这些是否是唯一的东西,但我想工厂至少应该提供一个包含所有钩子的请求,就像这里提到的:http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html,无论添加了哪个包含的包。

更新 2:我想到的是,对于测试和运行时环境之间的差异,有一个非常清晰的第一近似指标。我已经比较了对视图的正常调用和测试调用的请求。首先,这是我的 _make_request,添加请求方法已经足够了,但还缺少更多(下):

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

普通调用有以下属性(request.__dict__.keys()):

['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']

这清楚地表明,我的方法还不够,我会遇到使用其他请求功能的视图的问题。使用上面的 _make_request,只有最小的视图通过。


换句话说,如何获得相同的请求,这在功能测试中使用,例如在 webtest 的 TestApp 中,而不是执行 testapp.get(...),而是使用该请求调用视图并对可调用的返回结果(未呈现为 HTML)进行断言?

【问题讨论】:

    标签: python integration-testing pyramid pytest


    【解决方案1】:

    由于 RTD 上的一个临时错误,缺少该基本代码片段。 An Issue has been logged.

    这是未包含的代码的链接。 https://github.com/Pylons/pyramid/blob/master/docs/narr/MyProject/myproject/tests.py#L19-L43

    [已编辑]

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

    1. 如果您安装了 Pyramid,您可以从 alchemy 脚手架创建示例项目。

      $ $VENV/bin/pcreate -s alchemy tutorial
      

      如果该命令对您不起作用,SQLAlchemy + URL Dispatch Wiki Tutorial 会更详细地介绍和先决条件。

      脚手架包括这些tests

    2. 我们正在开发一个新的分支来更新这个脚手架,目标是在 Pyramid 1.7 中合并。这是它的tests

      如果你 git checkout 那个分支,并运行教程步骤,你可以看到完整的上下文。

    [已编辑]

    这里还有一个地方可以查看:Pyramid's own integration tests

    顺便说一句,我很难给你一个合适的答案。对于初学者,我看不到在您的测试代码中调用DummyRequest 的位置。你能在你的问题中给出一个完整的可重现的例子吗?

    【讨论】:

    • 谢谢,但是,现在我看到它与我的问题中的第一个片段相同。它不适用于第 3 方 includeme。
    • 也就是说,至少在某些包含的模块使用 config.add_request_method 时它不起作用。
    • 这是个好消息,但问题不在于 SQLAlchemy:myproject 甚至不直接使用它。这是一种安排集成测试的方法,无论第三方模块以补间、请求方法等方式注入,它都有效。
    • @StivePiercy(重读我的回复)抱歉,我并没有打算从开源项目的 cmets 中要求某些东西。如果 Pyramid 不提供设置集成测试的通用方法(无需调整 config.ini 和 db bootstrap 之外),这是一个很好的答案,并且每个项目都应该为第三方组件本身做夹具。我很惊讶,这就是我问的原因。
    • 我已经更新了我的问题,但我并不针对我的具体情况寻求答案。我在问是否有一个工厂可以用来产生请求,其中包括与应用程序相同的内容。就像在功能测试中一样,但我不需要 WebTest 级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2018-12-26
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    相关资源
    最近更新 更多