我有一个scrapy项目,它将数据写入数据库。它基于这个伟大的教程:http://newcoder.io/scrape/part-3/
我现在遇到了一个问题,我正在尝试为项目编写一些集成测试。我遵循此处的指南:Scrapy Unit Testing
我不清楚如何最好地传递适当的数据库设置。我希望测试使用他们自己的数据库,我可以确保在测试开始运行之前处于已知状态。
所以只有import settings
不会起作用,因为如果项目在测试模式下运行,那么它需要使用不同的设置文件。
我熟悉Ruby on Rails项目,您可以在其中指定RAILS_ENV环境变量,并且基于此环境变量,框架将使用来自不同文件的设置。在测试scrapy项目时是否有类似的概念?或者是否有更多的pythonic替代方法?
答案 0 :(得分:0)
最后,我编辑了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回购,展示了它是如何工作的:https://github.com/alanbuxton/scrapy_local_settings
热衷于找出是否有更整洁的方法。