我正在开始TDD开发态度,正在为我的django应用程序编写单元测试.我知道固定装置并且知道测试应该执行的方式,但是对于给定的测试,我确实需要在整个数据库上执行它,并且用于10万行数据库的json fixture不是我想要处理的东西此外,这个测试是"只读".
那么问题是如何设置测试套件以在生产数据库上运行?我想这可能就像在某些测试的setUp方法中添加DATABASE_NAME设置一样简单.但是settings.DATABASE_NAME ="prod_db"在运行测试时导致"NameError:全局名称'设置'未定义".此外,http://code.djangoproject.com/ticket/11987中描述了一种风险,您可能会意外删除生产数据库.
那么,如何在生产数据库而不是临时数据库上运行测试套件的单个测试,或者甚至更好的是什么是最佳实践呢?
任何意见提前干杯!
我正在尝试在我的Django应用程序中为一些芹菜任务编写一些单元测试.这些任务将模型ID作为参数,执行一些操作并更新模型.当运行devserver和celery worker时,一切都很好,但是在运行我的测试时,很明显celery任务没有使用在测试运行过程中创建和销毁的django测试数据库.问题是,如何让芹菜使用与我的其他测试相同的临时数据库?
正如您所看到的,我正在使用针对类似问题的每个答案中建议的设置覆盖.
更新:发现不是将对象id传递给任务并让任务从数据库中获取,如果我只是将对象本身传递给任务,则测试工作正常,对任务的运行没有明显的负面影响.所以至少现在,这将是我的修复.
在我的测试中:
class JobTest(TestCase):
@override_settings(CELERY_ALWAYS_EAGER=True,
CELERY_EAGER_PROPAGATES_EXCEPTIONS=True,
BROKER_BACKEND='memory')
def test_Job_Complete(self):
job = models.Job()
job.save()
tasks.do_a_thing(job.id)
self.assertTrue(job.complete)
Run Code Online (Sandbox Code Playgroud)
在我的任务中:
@celery.task
def do_a_thing(job_id):
job = models.Job.objects.get(pk=job_id)
bunch_of_things(job)
job.complete = True
job.save()
Run Code Online (Sandbox Code Playgroud) 背景:我正在开发一个项目,该项目使用Celery来安排将来某个时间运行的任务.这些任务推动了最终状态机的状态.这是一个例子:
我正在使用这个SO答案所建议的CELERY_ALWAYS_EAGER
在测试中使用该技术的问题在于,任务代码(在单独的线程中运行)与调度它的运行在同一个线程中.这会导致FSM状态无法正确保存,并且难以测试.我无法确定究竟是什么导致它,但似乎在调用堆栈的底部你保存到当前状态,但是当你返回调用堆栈时,正在保存先前的状态.我可能会花更多的时间来确定代码没有运行时出现的问题,但尝试让代码运行应该如何运行并确保它正在做它应该做的事情似乎更合乎逻辑.
问题:因此,我想知道是否有办法在django可以在测试运行期间使用芹菜设置.如果它可以自动运行,那将是理想的,但即使是一些人工干预也不如手动测试行为.我认为如果我在测试中设置一个中断,运行芹菜工作者连接到测试数据库,继续django测试,可能有可能.以前有人试过这样的事吗?