unit-testing - 使用 Azure DocumentDB 进行单元测试

标签 unit-testing integration-testing azure-cosmosdb

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

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

这意味着:

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

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

最佳答案

您是正确的,没有在您自己的计算机上运行的 DocumentDB 版本。因此,我使用 documentdb-mock(在 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)

关于unit-testing - 使用 Azure DocumentDB 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37566822/

相关文章:

c# - 我需要一些想法来对这个 Tasked 方法进行单元测试

unit-testing - 使用 Observable (Angular 2) 模拟服务时测试出错

c# - 创建文档不起作用 - C# DocumentDB/CosmosDB

azure - 如何使用 cosmos db 中的 ArrayContains 方法检查字符串数组内的值?

azure-cosmosdb - 插入文档时响应状态码不表示成功

Java Mock 对象,没有依赖注入(inject)

unit-testing - 使用 PHPUnit 进行功能测试

node.js - 使用 TypeORM 进行集成测试

c# - JavaScript 集成测试框架

grails - Controller 集成测试