Meteor Test getriebene Entwicklung [geschlossen]

120

Ich sehe nicht, wie man eine testgetriebene Entwicklung in Meteor macht.

Ich sehe es nirgendwo in der Dokumentation oder in den FAQ erwähnt. Ich sehe keine Beispiele oder ähnliches.

Ich sehe, dass einige Pakete Tinytest verwenden.

Ich würde eine Antwort von Entwicklern benötigen, was ist die Roadmap dazu. Etwas in der Art von:

  • möglich, keine Dokumentation, finde es selbst heraus
  • meteor ist nicht so aufgebaut, dass Sie testbare Apps erstellen können
  • Dies ist eine geplante Funktion
  • etc
Rubycut
quelle
4
Wenn Sie sich den xolv.io-Blog ansehen , wie unten erwähnt, gibt es Beispiele für die ordnungsgemäße Durchführung von Unit + End-to-End-TDD mit Meteor.
Xolv.io
Aus dem Ton Ihrer Frage geht hervor, dass Sie den Eindruck haben, dass Meteor ziemlich viel fehlt. In gewisser Weise ist es so, aber atmosphärenmeteor.com bietet Pakete, mit denen Sie die meisten Dinge erledigen können, die Sie sich vorstellen können, indem Sie vorhandene JS-Bibliotheken in einem sofort einsatzbereiten Format bündeln. Es könnte auf meteor.com, IMHO, stärker verlinkt werden.
Pipedreambomb
5
Sie sollten auschecken laika - arunoda.github.io/laika
Arunoda Susiripala
1
Meteortests sind derzeit ein Chaos. Updates finden Sie unter trello.com/c/BQ3gu0no/12-official-testing-framework .
Andrew Mao

Antworten:

83

Update 3 : Ab Meteor 1.3 enthält Meteor eine Testanleitung mit schrittweisen Anweisungen für Einheiten-, Integrations-, Akzeptanz- und Lasttests.

Update 2 : Ab dem 9. November 2015 wird Velocity nicht mehr beibehalten . Xolv.io konzentriert seine Bemühungen auf Schimpansen , und die Meteor Development Group muss einen offiziellen Testrahmen auswählen .

Update : Velocity ist ab 0.8.1 die offizielle Testlösung von Meteor .


Zu diesem Zeitpunkt wurde nicht viel über automatisierte Tests mit Meteor geschrieben. Ich erwarte von der Meteor-Community, dass sie Best Practices für Tests weiterentwickelt, bevor sie etwas in der offiziellen Dokumentation festlegt. Immerhin hat Meteor diese Woche 0,5 erreicht, und die Dinge ändern sich immer noch schnell.

Die gute Nachricht: Sie können Node.js Testtools mit Meteor verwenden .

Für mein Meteor-Projekt führe ich meine Unit-Tests mit Mocha durch , wobei ich Chai für Behauptungen verwende. Wenn Sie nicht den vollständigen Funktionsumfang von Chai benötigen, empfehle ich stattdessen die Verwendung von should.js . Ich habe momentan nur Unit-Tests, obwohl Sie auch Integrationstests mit Mocha schreiben können.

Stellen Sie sicher, dass Sie Ihre Tests im Ordner "tests" ablegen, damit Meteor nicht versucht, Ihre Tests auszuführen.

Mocha unterstützt CoffeeScript , meine Skriptsprache für Meteor-Projekte. Hier ist ein Beispiel-Cakefile mit Aufgaben zum Ausführen Ihrer Mokka-Tests. Wenn Sie JS mit Meteor verwenden, können Sie die Befehle für ein Makefile anpassen.

Ihre Meteor-Modelle müssen geringfügig modifiziert werden, um sich Mocha auszusetzen. Dies erfordert einige Kenntnisse über die Funktionsweise von Node.js. Stellen Sie sich jede Node.js-Datei als in ihrem eigenen Bereich ausgeführt vor. Meteor stellt Objekte in verschiedenen Dateien automatisch einander zur Verfügung, gewöhnliche Knotenanwendungen wie Mocha tun dies jedoch nicht. Exportieren Sie jedes Meteor-Modell mit dem folgenden CoffeeScript-Muster, um unsere Modelle mit Mocha testbar zu machen :

# 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?

... und importieren Sie oben in Ihrem Mokka-Test das Modell, das Sie testen möchten:

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

Damit können Sie mit Ihrem Meteor-Projekt Unit-Tests schreiben und ausführen!

Schwarzer Mantel
quelle
2
Ich habe dies versucht und bin auf Probleme gestoßen, wenn mein zu testender Code Meteor.whateverFunktionen verwendet. Ich bekomme Meteor ist undefiniert Fehler. Gibt es eine Möglichkeit, Meteor explizit zu verpflichten, dies zu umgehen?
Christian Schlensker
2
Christian, der in meiner Antwort beschriebene Ansatz ist derzeit unvollständig, da keine vollständige Instanz Ihrer Meteor-Anwendung ausgeführt wird. Infolgedessen ist das MeteorObjekt nicht zugänglich, ebenso wie alle Modellabhängigkeiten, die von Meteor verfügbar gemacht werden. Um diesen Prozess zu verbessern, müssen Sie die Anwendungsumgebung in Mocha instanziieren und das MeteorObjekt Ihren Tests aussetzen . Ich werde diese Antwort auf jeden Fall aktualisieren, sobald ich eine vollständigere Testlösung eingerichtet habe. In der Zwischenzeit können Sie mich gerne bei Fragen oder Verbesserungsvorschlägen kontaktieren.
Blackcoat
@ChristianSchlensker: Wenn Sie Mocha für Funktions- / Komponententests auf der Client-Seite verwenden, stehen Ihnen Meteor-Objekte zur Verfügung. Siehe den Beispielcode in meiner Antwort unten.
Jerico
@ Jerico Ja, das sieht gut aus, würde für keine der serverseitigen Klassen funktionieren. Außerdem mag ich es, wenn die Mokka-Uhr die ganze Zeit über auf allen Unit-Tests läuft. Sie laufen so schnell auf der Serverseite, dass es ein wirklich schönes Test-Feedback gibt.
Christian Schlensker
1
Ab
bigmadwolf
44

Hallo all checkout laika - das ganz neue Test-Framework für Meteor http://arunoda.github.io/laika/

Sie können sowohl den Server als auch den Client gleichzeitig testen.

Haftungsausschluss: Ich bin der Autor von Laika.

Arunoda Susiripala
quelle
Hallo Arunoda. Ich schätze Ihre harte Arbeit für Meteor. Hier bei StackOverflow sollten Sie als Haftungsausschluss darauf hinweisen, dass Sie derjenige sind, der hinter laika steht.
Nalply
5
Ist das der Weg, es zu tun?
Arunoda Susiripala
1
Vielen Dank für Ihre Mitarbeit.
Nalply
14

Mir ist klar, dass diese Frage bereits beantwortet ist, aber ich denke, dass dies einen weiteren Kontext in Form einer zusätzlichen Antwort in diesem Kontext gebrauchen könnte.

Ich habe einige App-Entwicklungen mit Meteor sowie Paketentwicklungen durchgeführt, indem ich sowohl ein Paket für den Meteor-Kern als auch für die Atmosphäre implementiert habe .

Es hört sich so an, als ob Ihre Frage tatsächlich aus drei Teilen besteht:

  1. Wie läuft die gesamte Meteor-Testsuite ab?
  2. Wie schreibt man Tests für einzelne Smart-Pakete und führt sie aus ?
  3. Wie schreibt man Tests für seine eigene Anwendung und führt sie aus?

Und es klingt auch so, als ob irgendwo eine Bonusfrage drin sein könnte: 4. Wie kann man eine kontinuierliche Integration für 1, 2 und 3 implementieren?

Ich habe mit Naomi Seyfer (@sixolet) im Meteor- Kernteam gesprochen und begonnen , um endgültige Antworten auf all diese Fragen in die Dokumentation aufzunehmen.

Ich hatte eine erste Pull-Anfrage mit den Adressen 1 und 2 an den Meteorkern gesendet: https://github.com/meteor/meteor/pull/573 .

Ich hatte kürzlich auch diese Frage beantwortet: Wie führen Sie die Meteortests durch?

Ich denke, dass @Blackcoat oben 3 definitiv beantwortet hat.

Was den Bonus 4 betrifft , würde ich vorschlagen, zumindest circleci.com zu verwenden, um eine kontinuierliche Integration für Ihre eigenen Apps durchzuführen . Sie unterstützen derzeit den von @Blackcoat beschriebenen Anwendungsfall. Ich habe ein Projekt, in dem ich erfolgreich Tests in Coffeescript geschrieben habe, um Unit-Tests mit Mokka durchzuführen, so wie es @Blackcoat beschrieben hatte.

Naomi Seyfer und ich unterhalten uns mit dem Gründer von circleci, um zu sehen, ob wir in naher Zukunft etwas Fantastisches implementieren können, um eine kontinuierliche Integration in den Meteor-Kern und intelligente Pakete zu erreichen.

eifriger Hacker
quelle
12

RTD wurde jetzt veraltet und durch Velocity ersetzt, das offizielle Test-Framework für Meteor 1.0. Die Dokumentation ist noch relativ neu, da sich Velocity in einer starken Entwicklung befindet. Weitere Informationen finden Sie im Velocity Github Repo , auf der Velocity Homepage und im Meteor Testing Manual (kostenpflichtige Inhalte).

Haftungsausschluss: Ich bin eines der Mitglieder des Kernteams von Velocity und der Autor des Buches.


Check out RTD, einen vollständigen Test - Framework für Meteor hier rtd.xolv.io . Es unterstützt Jasmine / Mocha / custom und funktioniert sowohl mit einfachem JS als auch mit Kaffee. Es enthält auch eine Testabdeckung, die die Abdeckung von Einheiten / Servern / Clients kombiniert.

Und ein Beispielprojekt hier

Ein Blog, in dem Unit-Tests mit Meteor hier erklärt werden

Ein e2e-Akzeptanztestansatz mit Selenium WebdriverJS und Meteor hier

Hoffentlich hilft das. Haftungsausschluss: Ich bin der Autor von RTD.

Xolv.io
quelle
6

Ich habe diese Seite oft benutzt und alle Antworten ausprobiert, aber vom Ausgangspunkt meines Anfängers an fand ich sie ziemlich verwirrend. Sobald ich irgendwelche Probleme hatte, war ich verblüfft, wie ich sie beheben sollte.

Diese Lösung ist sehr einfach zu starten, wenn sie noch nicht vollständig dokumentiert ist. Ich empfehle sie daher Leuten wie mir, die TDD ausführen möchten, sich aber nicht sicher sind, wie das Testen in JavaScript funktioniert und welche Bibliotheken in welche integriert werden:

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

Zu Ihrer Information, ich habe festgestellt, dass ich auch das Router-Atmosphere-Paket verwenden muss , um eine '/ tests'-Route zum Ausführen und Anzeigen der Testergebnisse zu erstellen , da ich nicht wollte, dass meine App bei jedem Laden überladen wird.

Pipedreambomb
quelle
1
Sie können auch meteor-mocha-webmit mocha-phantomjszur Automatisierung von Tests und für CI verwenden. Es ist das, was wir verwenden. Vollständige Offenlegung - Ich bin einer der Betreuer von meteor-mocha-web.
Jagill
6

Informationen zur Verwendung von Tinytest finden Sie in den folgenden nützlichen Ressourcen:

  1. Die Grundlagen werden in diesem Screencast erläutert: https://www.eventedmind.com/feed/meteor-testing-packages-with-tinytest

  2. Sobald Sie die Idee verstanden haben, möchten Sie die öffentliche API-Dokumentation für tinytest. Die einzige Dokumentation dafür befindet sich derzeit am Ende der Quelle des tinytestPakets: https://github.com/meteor/meteor/tree/devel/packages/tinytest

  3. In dem Screencast wird auch darüber gesprochen, ob test-helpersSie sich hier alle verfügbaren Helfer ansehen möchten: https://github.com/meteor/meteor/tree/devel/packages/test-helpers In jedem befindet sich häufig eine Dokumentation Datei

  4. Das Eingraben in die vorhandenen Tests von Meteor-Paketen wird viele Beispiele liefern. Eine Möglichkeit, dies zu tun, besteht darin, nach Tinytest.oder test.im Paketverzeichnis des Meteor-Quellcodes zu suchen

William Ledoux
quelle
5

Das Testen wird in der kommenden Version 1.3 zu einem zentralen Bestandteil von Meteor. Die ursprüngliche Lösung basiert auf Mokka und Chai.

Die ursprünglichen Diskussionen über das minimal realisierbare Design finden Sie hier und die Details der ersten Implementierung finden Sie hier .

MDG hat die ersten Knochen der Leitfaden-Dokumentation für die Tests erstellt, die hier zu finden sind. Hier finden Sie einige Beispieltests .

Dies ist ein Beispiel für einen Veröffentlichungstest über den obigen Link:

  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();
    });
  });
tomRedox
quelle
4

Ich mache Funktions- / Integrationstests mit Meteor + Mocha im Browser. Ich habe etwas in der Art von Folgendem (in Kaffeeskript zur besseren Lesbarkeit):

Auf dem Client ...

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()

... und auf dem Server:

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

Natürlich können Sie Ihre clientseitigen Unit- Tests auf die gleiche Weise durchführen. Für Integrationstests ist es jedoch schön, die gesamte Meteor-Infrastruktur zur Verfügung zu haben.

jerico
quelle
Übrigens: Diese Lösung zum Warten auf DOM-Elemente ist praktisch, wenn Sie Funktionstests im Meteor-Client mit jQuery durchführen.
Jerico
2

Eine weitere Option, die seit 0.6.0 leicht verfügbar ist, besteht darin, Ihre gesamte App aus lokalen Smart-Paketen mit einer minimalen Menge an Code außerhalb der Pakete auszuführen, um Ihre App zu starten (möglicherweise wird ein bestimmtes Smart-Paket aufgerufen, das die Grundlage Ihrer App bildet App).

Sie können dann Meteors Tinytest nutzen, der sich hervorragend zum Testen von Meteor-Apps eignet.

matb33
quelle
0

Ich habe xolvio: Gurke und Geschwindigkeit erfolgreich verwendet, um meine Tests durchzuführen. Funktioniert sehr gut und läuft kontinuierlich, sodass Sie immer sehen können, dass Ihre Tests bestanden werden.

Philip Beadle
quelle
0

Meteor + TheIntern

Irgendwie habe ich es geschafft, die Meteor-Anwendung mit TheIntern.js zu testen.

Obwohl es meinen Bedürfnissen entspricht. Trotzdem denke ich, dass dies jemanden in die richtige Richtung führen kann, und ich teile mit, was ich getan habe, um dieses Problem zu lösen.

Es gibt eine executeFunktion, mit der wir JS-Code ausführen können, über den wir auf das Browserobjekt windowund damit Meteorauch zugreifen können .

Möchten Sie mehr über die Ausführung erfahren ?

So suche ich test suitenach Funktionstests

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');
                });
        }
    });
});

Um mehr zu wissen, ist dies mein Kern

Hinweis: Ich bin mit dieser Lösung noch in einer sehr frühen Phase. Ich weiß nicht, ob ich damit komplexe Tests durchführen kann oder nicht. Aber ich bin ziemlich zuversichtlich.

Harpreet Singh
quelle
0

Die Geschwindigkeit ist noch nicht ausgereift. Ich habe Probleme mit setTimeout, um die Geschwindigkeit zu verwenden. Für serverseitige Unit-Tests können Sie dieses Paket verwenden .

Es ist schneller als die Geschwindigkeit. Die Geschwindigkeit benötigt viel Zeit, wenn ich eine Spezifikation mit einem Login teste. Mit Jasmine-Code können wir jede serverseitige Methode und Veröffentlichung testen.

Zahed
quelle