簡體   English   中英

Django單元測試:如何測試並發數據庫操作?

[英]Django unit testing: How to test concurrent database operations?

我正在創建一個Django庫,它使用樂觀並發控制來防止並發寫入導致不一致的數據。 我希望能夠為這個功能編寫單元測試,但我不知道如何實現這一點。

我知道Django的單元測試是單線程的,所以我能想象測試工作的唯一方法是同時打開兩個獨立的數據庫連接(到同一個數據庫)並切換Django ORM在執行查詢時使用的連接,盡管我我不確定Django中是否可以進行連接切換。

使用Django測試並發數據庫操作有哪些技巧?

使用Django測試並發數據庫操作有哪些技巧?

實際上,Django在這里不是問題。

用於樂觀並發控制的庫必須作為獨立單元自行測試。

在Django之外; 僅使用unittest。

您需要使用多線程(和多處理)測試驅動程序進行測試。 在Django之外。

一旦你確定它有效,你就可以在Django里面進行測試,只是為了確保API的工作。

一旦你確定所有這些工作,你應該編寫一個簡單的urllib2測試驅動程序,它對一個單獨的Django服務器執行大量的並發事務。 我們編寫了一個小工具,用於啟動Django服務器,使用urllib2運行測試,然后殺死Django服務器。

更根本的是,你需要某種非常正式的證明,證明你的想法是有效的。 這比任何測試都重要得多。

實際上,測試並發技術是否有效幾乎是不可能的。 很容易錯過一個小的競爭條件。 唯一真正的方法是證明你的代碼,然而,這是很多工作;)

解決此問題的一種方法是在指向同一個DB的單獨進程中生成Django runserver的多個副本。 然后你的單元測試產生線程/進程,它們都會在運行你的並發性的運行服務器上發揮作用。 在拆解期間,您將加入所有流程。

使用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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM