【问题标题】:Meteor test driven development [closed]Meteor 测试驱动开发
【发布时间】:2012-10-10 20:26:25
【问题描述】:

我不知道如何在流星中进行测试驱动开发。

我在文档或常见问题解答中的任何地方都没有看到它。我没有看到任何例子或类似的东西。

我看到一些软件包正在使用 Tinytest。

我需要开发人员的回复,关于此的路线图是什么。大致如下:

  • 可能,没有文档,自己想办法
  • meteor 的构建方式无法让您制作可测试的应用
  • 这是计划中的功能

【问题讨论】:

  • 看看xolv.io blog,如下所述,有使用 Meteor 进行适当的 Unit + End-to-end TDD 的示例。
  • 从您提问的语气看来,您似乎觉得 Meteor 缺少很多东西。在某种程度上确实如此,但是通过将现有的 JS 库捆绑为现成的格式,Atmote.meteor.com 提供了包来完成您能想到的大多数事情。恕我直言,它可能与meteor.com上的联系更紧密。
  • 你应该结帐 laika - arunoda.github.io/laika
  • 流星测试目前一团糟。有关更新,请参阅 trello.com/c/BQ3gu0no/12-official-testing-framework

标签: tdd meteor


【解决方案1】:

更新 3:从 Meteor 1.3 开始,meteor 包含一个 testing guide,其中包含有关单元、集成、验收和负载测试的分步说明。

更新 2:截至 2015 年 11 月 9 日,Velocity is no longer maintained。 Xolv.io 将精力集中在ChimpMeteor Development Group must choose an official testing framework

更新:从 0.8.1 开始,VelocityMeteor's official testing solution


目前关于使用 Meteor 进行自动化测试的文章不多。我希望 Meteor 社区在正式文档中建立任何内容之前发展测试最佳实践。毕竟本周 Meteor 达到了 0.5,而且事情还在迅速变化。

好消息:您可以将 Node.js testing tools 与 Meteor 一起使用

对于我的 Meteor 项目,我使用 Mocha 运行单元测试,并使用 Chai 进行断言。如果您不需要 Chai 的完整功能集,我建议您改用 should.js。我目前只有单元测试,不过你也可以用 Mocha 编写集成测试。

请务必place your tests in the "tests" folder,以免 Meteor 尝试执行您的测试。

Mocha 支持CoffeeScript,这是我为 Meteor 项目选择的脚本语言。这是一个sample Cakefile,其中包含运行 Mocha 测试的任务。如果您在 Meteor 中使用 JS,请随意调整 Makefile 的命令。

您的 Meteor 模型需要稍作修改才能将自己暴露给 Mocha,这需要了解 Node.js 的工作原理。将每个 Node.js 文件视为在其自己的范围内执行。 Meteor 自动将不同文件中的对象相互公开,但普通的 Node 应用程序(如 Mocha)不会这样做。为了使我们的模型可以被 Mocha 测试,export 每个 Meteor 模型都使用以下 CoffeeScript 模式:

# Export our class to Node.js when running
# other modules, e.g. our Mocha tests
#
# Place this at the bottom of our Model.coffee
# file after our Model class has been defined.
exports.Model = Model unless Meteor?

...在 Mocha 测试的顶部,导入您要测试的模型:

# Need to use Coffeescript's destructuring to reference
# the object bound in the returned scope
# http://coffeescript.org/#destructuring
{Model} = require '../path/to/model'

这样,您就可以开始使用 Meteor 项目编写和运行单元测试了!

【讨论】:

  • 当我的测试代码使用任何Meteor.whatever 函数时,我已经尝试过这个并遇到问题。我得到流星是未定义的错误。有没有办法明确要求 Meteor 解决这个问题?
  • Christian,我的回答中描述的方法目前不完整,因为它没有运行您的 Meteor 应用程序的完整实例。因此,Meteor 对象无法访问,Meteor 公开的任何模型依赖项也是如此。改进此过程将涉及在 Mocha 中实例化应用程序的环境,并将 Meteor 对象公开给您的测试。一旦我有了更完整的测试解决方案,我一定会更新这个答案。同时,如有任何问题或改进建议,请随时与我联系。
  • @ChristianSchlensker:如果您在客户端使用 Mocha 进行功能/单元测试,那么您可以使用 Meteor 对象。请参阅下面我的答案中的示例代码。
  • @jerico 是的,看起来不错,不适用于任何服务器端类。我也喜欢一直在所有单元测试上运行 mocha --watch。它们在服务器端运行得如此之快,以至于提供了非常好的测试反馈。
  • 从 1.3 开始,现在可以在流星中进行测试,请参阅 guide.meteor.com
【解决方案2】:

我意识到这个问题已经得到解答,但我认为这可以使用更多上下文,以提供所述上下文的附加答案的形式。

我一直在使用流星进行一些应用程序开发,以及包开发,都通过为流星核心和atmosphere 实现包。

听起来您的问题实际上可能分为三个部分:

  1. 如何运行整个流星测试套件?
  2. 如何为个人 smart packages 编写和运行测试?
  3. 如何为自己的应用程序编写和运行测试?

而且,听起来某处可能还有一个额外的问题: 4. 如何实现1、2、3的持续集成?

我一直在谈论并开始与 Naomi Seyfer (@sixolet) 在流星 core team 上合作,以帮助在文档中获得所有这些问题的明确答案。

我已经向流星核心提交了一个初始拉取请求,地址为 1 和 2:https://github.com/meteor/meteor/pull/573

我最近也回答了这个问题: How do you run the meteor tests?

我认为@Blackcoat 已经明确回答了上面的 3。

至于奖金 4,我建议至少使用 circleci.com 为您自己的应用程序进行持续集成。他们目前支持@Blackcoat 描述的用例。我有一个项目,我已经成功地用咖啡脚本编写了测试,以使用 mocha 运行单元测试,就像@Blackcoat 所描述的那样。

对于流星核心和智能包的持续集成,我和 Naomi Seyfer 正在与 circleci 的创始人聊天,看看我们是否可以在短期内实现一些很棒的东西。

【讨论】:

    【解决方案3】:

    我正在浏览器中使用 Meteor + Mocha 进行功能/集成测试。我有以下内容(在咖啡脚本中以提高可读性):

    在客户端...

    Meteor.startup ->
        Meteor.call 'shouldTest', (err, shouldTest) ->
            if err? then throw err
            if shouldTest then runTests()
    
    # Dynamically load and run mocha. I factored this out in a separate method so
    # that I can (re-)run the tests from the console whenever I like.
    # NB: This assumes that you have your mocha/chai scripts in .../public/mocha.
    # You can point to a CDN, too.
    runTests = ->
        $('head').append('<link href="/mocha/mocha.css" rel="stylesheet" />')
        $.getScript '/mocha/mocha.js', ->
          $.getScript '/mocha/chai.js', ->
            $('body').append('<div id="mocha"> </div>')
            chai.should() # ... or assert or explain ...
            mocha.setup 'bdd'
            loadSpecs() # This function contains your actual describe(), etc. calls.
            mocha.run()
    

    ...在服务器上:

    Meteor.methods 'shouldTest': -> true unless Meteor.settings.noTests  # ... or whatever.
    

    当然,您可以用同样的方式进行客户端单元测试。不过,对于集成测试来说,拥有所有 Meteor 基础设施是很好的。

    【讨论】:

    【解决方案4】:

    RTD 现在已被弃用并被 Velocity 取代,这是 Meteor 1.0 的官方测试框架。由于 Velocity 正在大力开发,文档仍然相对较新。您可以在Velocity Github repoVelocity HomepageThe Meteor Testing Manual(付费内容)上找到更多信息

    免责声明:我是 Velocity 的核心团队成员之一,也是本书的作者。


    rtd.xolv.io 处查看 RTD,这是 Meteor 的完整测试框架。 它支持 Jasmine/Mocha/custom 并且适用于纯 JS 和咖啡。它还包括结合了单元/服务器/客户端覆盖率的测试覆盖率。

    还有一个示例项目here

    用 Meteor 解释单元测试的博客here

    使用 Selenium WebdriverJS 和 Meteor here 的 e2e 验收测试方法

    希望对您有所帮助。免责声明:我是 RTD 的作者。

    【讨论】:

      【解决方案5】:

      我经常使用此页面并尝试了所有答案,但从初学者的角度来看,我发现它们很混乱。一旦我遇到任何麻烦,我就对如何解决它们感到困惑。

      如果还没有完整的文档,这个解决方案上手非常简单,所以我向像我这样想要做 TDD 但不确定 JavaScript 测试如何工作以及哪些库插入什么的人推荐它:

      https://github.com/mad-eye/meteor-mocha-web

      仅供参考,我发现我还需要使用 router Atmosphere package 来创建一个“/tests”路径来运行并显示测试结果,因为我不希望它每次加载时都会弄乱我的应用程序.

      【讨论】:

      • 您还可以使用 meteor-mocha-webmocha-phantomjs 来自动化测试和 CI。这是我们使用的。全面披露——我是meteor-mocha-web 的维护者之一。
      【解决方案6】:

      从 0.6.0 开始可以轻松使用的另一个选项是在本地智能包之外运行您的整个应用程序,在包之外使用最少的代码来启动您的应用程序(可能调用特定的智能包,即应用程序的基础)。

      然后您可以利用 Meteor 的 Tinytest,它非常适合测试 Meteor 应用程序。

      【讨论】:

        【解决方案7】:

        大家好,结帐laika - 全新的流星测试框架 http://arunoda.github.io/laika/

        您可以同时测试服务器和客户端。

        免责声明:我是莱卡的作者。

        【讨论】:

        • 嗨阿鲁诺达。感谢您为 Meteor 所做的辛勤工作。但是,在 * 上,您应该作为免责声明指出您是 laika 背后的人。
        • 是这样的吗?
        • 感谢您的合作。
        【解决方案8】:

        关于tinytest的使用,你不妨看看那些有用的资源:

        1. 此截屏视频解释了基础知识: https://www.eventedmind.com/feed/meteor-testing-packages-with-tinytest

        2. 一旦你理解了这个想法,你就会想要tinytest 的公共 API 文档。目前,唯一的文档位于 tinytest 包源的末尾:https://github.com/meteor/meteor/tree/devel/packages/tinytest

        3. 此外,截屏视频谈到了test-helpers,您可能想看看这里所有可用的助手: https://github.com/meteor/meteor/tree/devel/packages/test-helpers 每个文件中通常都有一些文档

        4. 挖掘现有的流星包测试将提供很多示例。一种方法是在meteor的源码包目录中搜索Tinytest.test.

        【讨论】:

          【解决方案9】:

          我已经成功地使用 xolvio:cucumber 和 velocity 进行测试。工作得非常好并且连续运行,所以你总是可以看到你的测试正在通过。

          【讨论】:

            【解决方案10】:

            正如 Blackcout 所说,Velocity is the official TDD framework 代表 Meteor。但是目前velocity的网页没有提供好的文档。所以推荐大家观看:

            【讨论】:

            • 有用的帖子。感谢分享链接。
            【解决方案11】:

            流星+实习生

            不知何故,我设法用 TheIntern.js 测试了 Meteor 应用程序。

            虽然这是我的需要。但我仍然认为它可能会引导某人走向正确的方向,我正在分享我为解决这个问题所做的工作。

            有一个 execute 函数允许我们运行 JS 代码,我们可以访问浏览器 window 对象,因此也可以访问 Meteor

            想了解更多execute

            这就是我的test suite 寻找功能测试

            的方式
            define(function (require) {
                var registerSuite = require('intern!object');
                var assert = require('intern/chai!assert');
                registerSuite({
                    name: 'index',
            
                    'greeting form': function () {
                        var rem = this.remote;
                        return this.remote
                            .get(require.toUrl('localhost:3000'))
                            .setFindTimeout(5000)
                            .execute(function() {
                                    console.log("browser window object", window)
                                    return Products.find({}).fetch().length
                                })
                            .then(function (text) {
                                console.log(text)
                                assert.strictEqual(text, 2,
                                    'Yes I can access Meteor and its Collections');
                            });
                    }
                });
            });
            

            要了解更多,这是我的gist

            注意:我仍处于此解决方案的早期阶段。我不知道我是否可以用这个进行复杂的测试。但我对此非常有信心。

            【讨论】:

              【解决方案12】:

              Velocity 还不成熟。我面临使用速度的 setTimeout 问题。对于服务器端单元测试,您可以使用this package

              它比速度更快。当我通过登录测试任何规范时,Velocity 需要大量时间。使用 Jasmine 代码,我们可以测试任何服务器端方法和发布。

              【讨论】:

                【解决方案13】:

                在即将发布的 1.3 版本中,测试成为 Meteor 的核心部分。最初的解决方案是基于 Mocha 和 Chai。

                最小可行设计can be found here的原始讨论和first implementation can be found here的细节。

                MDG 已经制作了测试指南文档的初始骨架which can be found here,还有some example tests here

                这是来自上述链接的发布测试示例:

                  it('sends all todos for a public list when logged in', (done) => {
                    const collector = new PublicationCollector({userId});
                    collector.collect('Todos.inList', publicList._id, (collections) => {
                      chai.assert.equal(collections.Todos.length, 3);
                      done();
                    });
                  });
                

                【讨论】: