Meteor测试驱动开发

120

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

我在文档或常见问题解答中没有看到相关提及,也没有看到任何示例之类的东西。

我看到一些包在使用 Tinytest。

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

  • 可能可以,但没有文档,需要自己摸索
  • Meteor 没有构建可测试的应用程序的方式
  • 计划推出该功能
  • 等等

4
请查看下面提到的xolv.io博客,其中有使用Meteor进行正确的单元测试和端到端测试的示例。 - Xolv.io
从你的问题的口吻听来,似乎你认为 Meteor 还缺少很多东西。在某种程度上是这样的,但是 atmosphere.meteor.com 有包来做你能想到的大多数事情,通过捆绑现有的 JS 库以准备就绪的格式。在我看来,Meteor 官网可以更加重视这一点。 - pipedreambomb
5
你应该查看Laika - http://arunoda.github.io/laika/。 - Arunoda Susiripala
1
Meteor的测试目前很混乱。请参阅https://trello.com/c/BQ3gu0no/12-official-testing-framework获取更新。 - Andrew Mao
13个回答

83

更新3: 自Meteor 1.3起,meteor包含一个测试指南,提供逐步说明以进行单元、集成、验收和负载测试。

更新2: 截至2015年11月9日,Velocity不再得到维护。Xolv.io将精力集中在Chimp上,并且Meteor Development Group必须选择官方测试框架

更新: Velocity是自0.8.1版本起Meteor的官方测试解决方案


目前关于使用Meteor进行自动化测试的文章并不多。我希望Meteor社区能够在正式文档中确立测试最佳实践之前不断发展。毕竟,Meteor本周已经达到了0.5版本,事情仍在迅速变化。

好消息是:你可以使用Node.js测试工具来测试Meteor

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

务必将你的测试放在“tests”文件夹中,这样Meteor就不会尝试执行你的测试。

Mocha支持CoffeeScript,这是我在Meteor项目中选择的脚本语言。这里有一个示例Cakefile,其中包含运行Mocha测试的任务。如果您正在使用JS与Meteor,可以根据需要适应Makefile命令。
为了使我们的模型可以被Mocha测试,您需要对Meteor模型进行轻微修改,并需要一些关于Node.js工作原理的知识。请将每个Node.js文件视为在其自己的范围内执行。Meteor会自动将不同文件中的对象相互暴露,但普通的Node应用程序——如Mocha——不会这样做。为了使我们的模型可供Mocha测试,使用以下CoffeeScript模式导出每个Meteor模型:export
# 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项目编写和运行单元测试了!


2
我尝试过这个,但当我的测试代码使用任何Meteor.whatever函数时遇到了问题。我得到了“Meteor未定义”的错误。有没有一种明确要求Meteor的方法来解决这个问题? - Christian Schlensker
2
Christian,我在答案中描述的方法目前还不完整,因为它没有运行您的Meteor应用程序的完整实例。因此,Meteor对象是无法访问的,Meteor公开的任何模型依赖项也是如此。改进这个过程将涉及在Mocha中实例化应用程序的环境,并将Meteor对象暴露给您的测试。一旦我有一个更完整的测试解决方案,我会确保更新这个答案。同时,如果您有任何问题或建议改进,请随时与我联系。 - Blackcoat
如果你在客户端使用 Mocha 进行函数/单元测试,那么你可以使用 Meteor 对象。请参见我的答案下面的示例代码。 - jerico
你有没有针对 Meteor 自动公开的其他对象处理模式的建议?例如,在执行 Model = new Meteor.Collection "Model" 时的 Meteor 对象。 mocha tests --recursive --compilers coffee:coffee-script --ui bdd --colors --reporter spec ~/meteor-app/collections/tags.coffee:2 this.Tags = new Meteor.Collection('tags'); ^ ReferenceError: Meteor is not defined - Loren
1
从1.3版本开始,Meteor现在提供了测试功能,请参阅http://guide.meteor.com/。 - bigmadwolf
显示剩余2条评论

44

嗨,Arunoda。我很感激你为Meteor所做的辛勤工作。然而在StackOverflow上,你应该声明一下你是laika背后的人。 - nalply
5
那是正确的做法吗? - Arunoda Susiripala
1
感谢您的合作。 - nalply

14
我知道这个问题已经有答案了,但是我认为这需要更多的背景信息,以另一个回答的形式提供该背景信息。
我一直在使用Meteor进行应用程序开发,同时也在开发软件包,既实现Meteor核心的软件包,也实现atmosphere的软件包。
听起来你的问题可能实际上是三个部分的问题: 1. 如何运行整个Meteor测试套件? 2. 如何编写和运行smart packages的单独测试? 3. 如何编写和运行自己应用程序的测试?
而且,还可能有一个额外的问题: 4. 如何为1、2和3实现持续集成?

我一直在与Naomi Seyfer (@sixolet)合作,加入meteor核心团队,帮助将所有这些问题的明确答案放入文档中。

我已经向meteor核心提交了一个初步的拉取请求,解决了1和2:https://github.com/meteor/meteor/pull/573

最近我也回答了这个问题: 如何运行meteor测试?

我认为@Blackcoat已经明确地回答了上面的第3个问题。

关于奖金4,我建议至少使用circleci.com对您自己的应用程序进行持续集成。他们目前支持@Blackcoat所描述的用例。我有一个项目,在其中我已成功地使用coffeescript编写了测试,并使用mocha运行了单元测试,基本上就像@Blackcoat所描述的那样。
对于Meteor核心和智能包的持续集成,Naomi Seyfer和我正在与circleci的创始人交谈,以看看我们是否可以在近期实现一些很棒的功能。

12
RTD现已被弃用,由Velocity取而代之,Velocity是Meteor 1.0的官方测试框架。由于Velocity仍在积极开发中,因此文档仍然相对较新。您可以在Velocity Github repoVelocity HomepageThe Meteor Testing Manual(付费内容)上找到更多信息。
免责声明:我是Velocity核心团队成员和该书的作者之一。
在此处查看RTD,一个适用于Meteor的完整测试框架:rtd.xolv.io。它支持Jasmine/Mocha/custom并适用于纯JS和coffee。它还包括结合了单元/服务器/客户端测试覆盖率的测试覆盖功能。
示例项目在这里
有关使用Meteor进行单元测试的博客,请访问这里
使用Selenium WebdriverJS和Meteor的e2e验收测试方法请访问这里
希望对您有所帮助。免责声明:我是RTD的作者。

6
关于使用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包中的现有测试将提供很多示例。一种做法是在meteor源代码的包目录中搜索 Tinytest.test.


6
我经常使用这个页面并尝试了所有答案,但从我的初学者起点来看,它们令我感到相当困惑。一旦我遇到任何问题,我就不知道如何解决。
这个解决方案非常简单易用,虽然还没有完全记录,但我建议像我这样想要进行TDD但不确定JavaScript测试工作方式以及哪些库插入到何处的人使用它。

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

我发现我还需要使用router Atmosphere package,以便创建'/tests'路由来运行并显示测试结果,因为我不想让它在每次加载我的应用程序时都变得杂乱无章。


1
你也可以使用 meteor-mocha-webmocha-phantomjs 来自动化测试和进行 CI。这就是我们使用的方式。完全透明--我是 meteor-mocha-web 的维护者之一。 - jagill

5
在即将到来的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();
    });
  });

4
我将使用Meteor + Mocha在浏览器中进行功能/集成测试。以下是我按照以下方式编写的一些内容(为了更好的可读性,使用CoffeeScript):
在客户端...
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基础设施是很不错的选择。

顺便说一句:在使用jQuery进行Meteor客户端的功能测试时,等待DOM元素的这个解决方案非常有用。 - jerico

3

有用的帖子。谢谢分享链接。 - Laran Evans

2

另一个选项是自0.6.0版本以来很容易地通过本地智能包运行整个应用程序,仅需最少量的代码在外部包中引导应用程序(可能调用应用程序基础的某个智能包)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接