使用Azure DocumentDB进行单元测试

时间:2016-06-01 11:02:54

标签: unit-testing integration-testing azure-cosmosdb

我对使用azure的DocumentDB感兴趣,但我看不出如何合理开发,运行unittests / integration测试,或者如何让我们的持续集成服务器运行它。

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

这意味着:

  • 每个开发人员必须针对他们自己的docdb实例配置
  • 每次开发人员运行集成测试时,都会针对(他们自己的)远程docdb
  • 持续集成:我必须假设有一种方法以编程方式为构建提供另一个docdb实例吗?即使这样,CI服务器也是针对远程docdb运行的

关于人们如何使用docdb接近这一点的任何建议都将非常感激。

2 个答案:

答案 0 :(得分:4)

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

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

我曾经为每个开发人员提供一个用于实时测试的集合,但事实上每个测试都无法保证数据库的状态意味着某些测试间歇性地失败,所以我切换到为每个测试创建和删除数据库和集合。它稍慢但不像你期望的那么慢。我使用node-unit,下面是我的设置和拆除代码。关于此代码的一些观点:

  • 我每次都会预加载所有的sprocs,因为我使用sprocs进行所有写操作。我只使用客户端SDK进行读取。如果你不使用sprocs,你可以跳过这个。

  • 我正在使用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)

答案 1 :(得分:3)