【问题标题】:Scrapy: using a separate test database for integration testsScrapy:使用单独的测试数据库进行集成测试
【发布时间】:2018-03-01 23:57:18
【问题描述】:

我有一个 scrapy 项目,它将它抓取的数据写入数据库。它基于这个很棒的教程:http://newcoder.io/scrape/part-3/

现在我遇到了一个问题,我正在尝试为该项目编写一些集成测试。我在这里遵循指南:Scrapy Unit Testing

我不清楚如何最好地传递适当的数据库设置。我希望测试使用他们自己的数据库,我可以确保在测试开始运行之前处于已知状态。

因此,仅import settings 将无法解决问题,因为如果项目在测试模式下运行,则需要使用不同的设置文件。

我熟悉 Ruby on Rails 项目,您可以在其中指定 RAILS_ENV 环境变量,并且基于此环境变量,框架将使用来自不同文件的设置。在测试scrapy项目时是否可以应用类似的概念?还是有更 Pythonic 的替代方法?

【问题讨论】:

  • 您可以在代码中使用custom_settings

标签: python scrapy


【解决方案1】:

最后我编辑了 settings.py 文件以支持使用环境变量来确定从哪些附加文件中获取设置,如下所示:

from importlib import import_module
import logging
import os

SCRAPY_ENV=os.environ.get('SCRAPY_ENV',None)
if SCRAPY_ENV == None:
    raise ValueError("Must set SCRAPY_ENV environment var")

# Load if file exists; incorporate any names started with an
# uppercase letter into globals()
def load_extra_settings(fname):
    if not os.path.isfile("config/%s.py" % fname):
        logger = logging.getLogger(__name__) 
        logger.warning("Couldn't find %s, skipping" % fname)
        return
    mdl=import_module("config.%s" % fname)
    names = [x for x in mdl.__dict__ if x[0].isupper()]
    globals().update({k: getattr(mdl,k) for k in names})

load_extra_settings("secrets")
load_extra_settings("secrets_%s" % SCRAPY_ENV)
load_extra_settings("settings_%s" % SCRAPY_ENV)

我制作了一个示例 github repo,展示了它是如何工作的:https://github.com/alanbuxton/scrapy_local_settings

想知道是否有更简洁的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多