使用 Azure DocumentDB 进行单元测试

unittesting with Azure DocumentDB

我对使用 azure 的 DocumentDB 很感兴趣,但我看不出如何明智地开发,运行 单元测试/集成测试,或者如何让我们的持续集成服务器 运行 反对它.

AFAICS 没有办法 运行 本地版本的 docdb 服务器,你只能 运行 针对 azure 中配置的 docdb 实例。

这意味着:

任何关于人们如何使用 docdb 解决这个问题的建议都将不胜感激。

您是对的,您 运行 在自己的计算机上没有任何版本的 DocumentDB。因此,我使用 documentdb-mock(运行s 客户端在 node.js 上)为所有存储过程 (sprocs) 编写单元测试。我使用此客户端测试来测试优先设计 (TDD),它不需要连接到 Azure,但它只测试存储过程。

我 运行 在实时 Azure 平台上进行了许多其他测试。除了客户端测试之外,我还使用真实的 documentdb 集合测试 sprocs。我还在实时系统上测试了所有客户端 SDK 代码(仅用于读取,因为我在 sprocs 中执行所有写入)。

我以前每个开发人员都有一个集合用于实时测试,但事实上每个测试都不能保证数据库的状态,这意味着一些测试会间歇性地失败,所以我转而创建和删除数据库和集合每次测试。它稍微慢一点,但没有你想象的那么慢。我使用节点单元,下面是我的设置和拆卸代码。关于这段代码的几点:

  • 我每次都预加载所有存储过程,因为我对所有写入都使用存储过程。我只使用客户端 SDK 进行读取。如果你不使用存储过程,你可以跳过这个。

  • 我正在使用 documentdb-utils WrappedClient,因为它提供了一些附加功能(429 重试、更好的异步 API 等)。它是标准库的一个替代品(虽然它还不支持分区集合)但是你不需要使用它来让下面的示例代码工作。

  • 添加了拆卸延迟以修复在删除集合但某些操作仍未决时发生的间歇性故障。

每个测试文件如下所示:

path = require('path')
{DocumentClient} = require('documentdb')
async = require('async')
{WrappedClient, loadSprocs, getLinkArray, getLink} = require('documentdb-utils')

client = null
wrappedClient = null
collectionLinks = null

exports.underscoreTest =

  setUp: (setUpCallback) ->
    urlConnection = process.env.DOCUMENT_DB_URL
    masterKey = process.env.DOCUMENT_DB_KEY
    auth = {masterKey}
    client = new DocumentClient(urlConnection, auth)
    wrappedClient = new WrappedClient(client)
    client.deleteDatabase('dbs/dev-test-database', () ->
      client.createDatabase({id: 'dev-test-database'}, (err, response, headers) ->
        databaseLink = response._self
        client.createCollection(databaseLink, {id: '1'}, {offerType: 'S2'}, (err, response, headers) ->
          collectionLinks = getLinkArray(['dev-test-database'], [1])
          scriptsDirectory = path.join(__dirname, '..', 'sprocs')
          spec = {scriptsDirectory, client, collectionLinks}
          loadSprocs(spec, (err, result) ->
            sprocLink = getLink(collectionLinks[0], 'createVariedDocuments')
            console.log("sprocs loaded for test")
            setUpCallback(err, result)
          )
        )
      )
    )

  test1: (test) ->
    ...
    test.done()

  test2: (test) ->
    ...
    test.done()

  ...

  tearDown: (callback) ->
    f = () ->
      client.deleteDatabase('dbs/dev-test-database', () ->
        callback()
      )
    setTimeout(f, 500)

DocumentDB 的本地版本现已可用:https://docs.microsoft.com/en-us/azure/documentdb/documentdb-nosql-local-emulator