Django单元测试:如何测试并发数据库操作?

时间:2011-03-07 20:31:59

标签: python django unit-testing django-models concurrency

我正在创建一个Django库,它使用optimistic concurrency control来防止并发写入导致不一致的数据。我希望能够为这个功能编写单元测试,但我不知道如何实现这一点。

我知道Django的单元测试是单线程的,所以我能想象测试工作的唯一方法是同时打开两个独立的数据库连接(到同一个数据库)并切换Django ORM在执行查询时使用的连接,虽然我不确定Django中是否可以进行连接切换。

使用Django测试并发数据库操作有哪些技巧?

4 个答案:

答案 0 :(得分:3)

  

使用Django测试并发数据库操作有哪些技巧?

实际上,Django在这里不是问题。

用于乐观并发控制的库必须可以作为独立单元自行测试。

Django之外;仅使用unittest。

您需要使用多线程(和多处理)测试驱动程序进行测试。在Django之外。

一旦你确定它有效,你就可以在Django里面测试,只是为了确保API的工作。

一旦你确定所有这些都有效,你应该编写一个简单的urllib2测试驱动程序,它对一个单独的Django服务器执行大量的并发事务。我们编写了一个小工具来启动Django服务器,使用urllib2运行测试,然后杀死Django服务器。

更重要的是,你需要某种非常正式的证据证明你的想法是有效的。这比任何测试都重要得多。

答案 1 :(得分:2)

实际上,测试并发技术是否有效几乎是不可能的。很容易错过一个小的竞争条件。唯一真正的方法是证明你的代码,然而,这是很多工作;)

答案 2 :(得分:1)

处理此问题的一种方法是在指向同一个DB的单独进程中生成Django runserver的多个副本。然后你的单元测试产生线程/进程,它们都会在运行你的并发性的运行服务器上发挥作用。在拆解期间,您将加入所有流程。

答案 3 :(得分:0)

使用gevent:

import gevent

def foo():
    print('Running in foo')
    gevent.sleep(0)
    print('Explicit context switch to foo again')

def bar():
    print('Explicit context to bar')
    gevent.sleep(0)
    print('Implicit context switch back to bar')

gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
])


Running in foo
Explicit context to bar
Explicit context switch to foo again
Implicit context switch back to bar

http://sdiehl.github.io/gevent-tutorial/