流星测试驱动的开发[关闭]


120

我看不到如何在流星中进行测试驱动的开发。

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

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

我需要开发人员的回应,这是什么路线图。类似于以下内容:

  • 可能,没有文档,请自己弄清楚
  • 流星的构建方式并非可以使应用程序可测试
  • 这是计划的功能
  • 等等

4
看一下xolv.io博客,如下所述,这里有一些使用Meteor进行适当的Unit + End-to-end TDD的示例。
Xolv.io 2013年

从问题的语调来看,听起来您有流星失踪的印象。从某种意义上说,但是moisture.meteor.com的软件包可以将现成的JS库捆绑在一起,从而完成您可以想到的大多数事情。可以将其链接到meteor.com,恕我直言。
pipedreambomb 2013年


1
流星测试目前是一团糟。有关更新,请参阅trello.com/c/BQ3gu0no/12-official-testing-framework
安德鲁·毛

Answers:


83

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

更新2:从2015年11月9日起,不再维持Velocity。Xolv.io将他们的工作重点放在了Chimp上Meteor Development Group必须选择一个官方的测试框架

更新:从0.8.1开始,VelocityMeteor的官方测试解决方案


目前,有关使用Meteor进行自动化测试的文章还很少。我希望Meteor社区在正式文档中建立任何内容之前,先发展测试最佳实践。毕竟,流星本周达到了0.5,并且情况仍在迅速变化。

好消息:您可以在Meteor中使用Node.js测试工具

对于我的Meteor项目,我使用Chai声明与Mocha一起运行单元测试。如果您不需要Chai的完整功能集,建议您改用should.js。尽管您也可以使用Mocha编写集成测试,但目前我只有单元测试。

确保将测试放置在“ tests”文件夹中,以免Meteor尝试执行测试。

Mocha支持CoffeeScript,这是我为Meteor项目选择的脚本语言。这是一个示例Cakefile,其中包含用于运行Mocha测试的任务。如果您将JS与Meteor一起使用,请随时为Makefile修改命令。

您的Meteor模型将需要稍作修改,以将其自身暴露给Mocha,这需要了解Node.js的工作方式。将每个Node.js文件都视为在其自己的范围内执行。Meteor会自动将不同文件中的对象彼此公开,但是普通的Node应用程序(例如Mocha)不会这样做。为了使我们的模型可以通过Mocha进行测试,请使用以下CoffeeScript模式导出每个Meteor模型:

# 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明确解决此问题?
Christian Schlensker

2
克里斯蒂安(Christian),我的答案中描述的方法目前尚不完善,因为它没有运行您的Meteor应用程序的完整实例。结果,该Meteor对象是不可访问的,流星公开的任何模型相关性也是如此。改善此过程将涉及在Mocha中实例化应用程序的环境,并将Meteor对象暴露给您的测试。一旦有了更完整的测试解决方案,我将确保更新此答案。同时,如有任何问题或建议的改进,请随时与我联系。
Blackcoat 2013年

@ChristianSchlensker:如果您在客户端上使用Mocha进行功能/单元测试,则可以使用Meteor对象。请参阅下面我的答案中的示例代码。
jerico

@jerico是的,看起来不错,不适用于任何服务器端类。我也喜欢让mocha --watch一直在所有单元测试上运行。它们在服务器端运行得非常快,因此可以提供非常好的测试反馈。
Christian Schlensker,

1
从1.3版开始,流星现已提供测试,请参见guide.meteor.com
bigmadwolf

44

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

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

免责声明:我是Laika的作者。


嗨Arunoda。感谢您为流星所做的辛勤工作。在这里,您应该在StackOverflow上指出免责声明是您落后于laika。
2014年

5
那是这样做的方式吗?
Arunoda Susiripala 2014年

1
谢谢你的配合。
2014年

14

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

我一直在通过流星进行一些应用程序开发以及程序包开发,这都是通过为流星核心以及大气层实现程序包实现的。

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

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

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

我一直在与流星核心团队的Naomi Seyfer(@sixolet)进行交谈并开始合作,以帮助在文档中获得所有这些问题的明确答案。

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

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

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

至于奖金4,我建议至少使用circleci.com对您自己的应用程序进行持续集成。他们目前支持@Blackcoat描述的用例。我有一个项目,其中我成功获得了用coffeescript编写的测试以使用摩卡运行单元测试,就像@Blackcoat所描述的那样。

为了持续集成流星核心和智能软件包,Naomi Seyfer和我正在与circleci的创始人聊天,看看我们是否可以在短期内实现出色的性能。


12

现在已弃用RTD,并由Velocity代替,Velocity是Meteor 1.0的官方测试框架。随着Velocity的大量开发,文档仍然相对较新。您可以在Velocity Github存储库Velocity主页Meteor测试手册(付费内容)上找到更多信息。

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


rtd.xolv.io上查看RTD,它是Meteor的完整测试框架。它支持Jasmine / Mocha / custom,并且可以与普通JS和咖啡一起使用。它也包括结合单元/服务器/客户端覆盖范围的测试覆盖范围。

和示例项目在这里

一个博客,在这里解释与Meteor的单元测试

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

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


6

我经常使用该页面并尝试了所有答案,但是从我的初学者开始,我发现它们相当混乱。一旦遇到任何麻烦,我就会对如何解决这些问题感到困惑。

该解决方案非常容易上手,即使尚未完全记录下来,因此我建议像我这样的人使用TDD,但不确定在JavaScript中进行测试的方式以及将哪些库插入其中的人推荐该解决方案:

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

仅供参考,我发现我还需要使用路由器Atmosphere软件包来创建“ / tests”路由来运行并显示测试结果,因为我不希望它每次加载时都会使我的应用程序混乱。


1
您还可以使用meteor-mocha-webwith mocha-phantomjs进行自动化测试和CI。这就是我们使用的。全面披露-我是的维护者之一meteor-mocha-web
jagill

6

关于tinytest的用法,您可能想看看那些有用的资源:

  1. 此截屏视频中介绍了基本知识:https : //www.eventedmind.com/feed/meteor-testing-packages-with-tinytest

  2. 了解这一想法后,您将需要的公共API文档tinytest。就目前而言,唯一的文档位于tinytest包源的末尾:https : //github.com/meteor/meteor/tree/devel/packages/tinytest

  3. 另外,该截屏视频还讨论test-helpers,您可能想在这里查看所有可用的帮助器:https : //github.com/meteor/meteor/tree/devel/packages/test-helpers 每个中通常都有一些文档文件

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


5

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

最小可行设计的原始讨论可以在这里找到,而第一个实现的细节可以在这里找到

MDG为测试提供了指导文档的原始内容,可在此处找到,这里一些示例测试

这是上面链接中的发布测试示例:

  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 进行功能/集成测试。我有以下内容(为了更好的可读性,在coffescript中):

在客户端上...

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="https://stackoverflow.com/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


2

从0.6.0版本开始,另一个易于使用的选项是在本地智能软件包中运行整个应用程序,而在软件包之外仅需少量代码即可启动您的应用程序(可能调用作为您基础的特定智能软件包)应用)。

然后,您可以利用Meteor的Tinytest,这对于测试Meteor应用程序非常有用。


0

我已经成功地使用xolvio:cucumber和velocity做我的测试。效果很好,并且可以连续运行,因此您可以始终看到测试通过。


0

流星+实习生

我以某种方式设法通过TheIntern.js测试了Meteor应用程序。

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

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

想更多地了解执行

这就是我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');
                });
        }
    });
});

要知道更多,这是我的要旨

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


0

速度还不成熟。我面临使用速度的setTimeout问题。对于服务器端单元测试,可以使用此软件包

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.