2013-12-19 11 views
20

Für Unit-Tests verwenden wir grunt/karma-runner/jasmine/phantom.js. Da wir versuchen, jede neue Funktionalität abzudecken, wächst eine Anzahl von Komponententests schnell an. Und leider nimmt auch die Zeit für Tests zu. Jetzt ist es nicht kritisch und dauert 10 Sekunden für 1000 Tests, aber es wird immer schlechter.Unit-Tests Karma-Runner/Jasmine Profiling

Und Fragen:

  1. ich weiß, sind einige der Tests schlecht geschrieben (viel zeitaufwendig), aber welche soll ich optimieren? Existiert es einige Karma/Jasmin Profiler welche Zeitausführung für jeden Test messen?

  2. Kann ich anfangen mehr Karma-Runner-Threads/Prozesse, weil CPU nur für 5% bis 10% verwendet? Unit-Tests sind wirklich unabhängig.

  3. Jedes Mal, wenn ich Datei, karma sparen: Uhr alle Tests beginnt, für Karma-Runner eine Option vorhanden sein können, die für die aktuellen Ordner neu startet nur Tests (wir verwenden Regel: Unit-Tests file.spec .js im selben Ordner wie die Quelldatei.js) gespeichert?

Danke,

update1: Jemand ich iit/ddescribe for jasmine (die gleichen wie .only für Mokka) verwenden vorschlagen und es ist gute Option für die Entwicklung/Debugging, kann aber sein, einen anderen Weg gibt es?

Ich poste die Frage zu Karma-Benutzerforum here.

+0

Try Schalt zu Chrome statt zu Phantom. Wir haben dramatisch bessere Ergebnisse nach dem Wechsel erlebt (natürlich kann Ihre Laufleistung variieren). – Elad

Antwort

26

Finding langsamen Tests

  • reportSlowerThan (Punkte oder Fortschritt Reporter werden alle Tests berichten, die langsamer als gegebene Anzahl in ms),

  • können Sie den Browser und das Profil springen Ihre Tests werden genauso wie Sie es mit einer App tun würden (zB flamecharts in Chrome sind super).

machen die Tests schneller

  • Parallelisierung:

    Wir sind auf diese Arbeit. Sie können die Tests über mehrere Browser hinweg parallelisieren. Natürlich müssen diese Browser nicht auf demselben Computer ausgeführt werden, so dass Sie auch mehrere Computer verwenden können.

    Ich glaube nicht, dass das Ausführen von mehreren Instanzen von Karma selbst so viel helfen würde, da es auf eine sehr "blockierungsfreie" Weise geschrieben ist und ich nicht gesehen habe, dass es der Flaschenhals ist. Wir sollten jedoch die CPU/Speicherauslastung optimieren. Viele Verbesserungen in diesem Bereich kommen in v0.12. nur eine Teilmenge von Tests

  • läuft:

    sollten Sie völlig iit/ddescribe (Jasmin) verwenden. Gibt es einen Grund, warum das bei Ihnen nicht funktioniert? Übrigens. Mochas Implementierung von it.only() und describe.only() hat Probleme, daher empfehle ich Jasmine (oder Mocha reparieren).

    Es gibt auch einen Prototyp von Google Closure plugin, die nur die Dateien lädt Sie wirklich brauchen (sagen Sie iit ein Test, wird es nur Last/analysieren/werten die Dateien, die Sie wirklich für diese iit benötigen). Dies verbessert die Startzeit bei großen Projekten erheblich - wir sollten ähnliche Tricks für andere Modullader (RequireJS, CommonJS) durchführen.

  • schreiben schnellen Code:

    Sie wahrscheinlich wissen, dass dies schon ... ;-)

    DOM langsam ist. Eine gute Trennung von Logik/DOM ermöglicht es Ihnen, mehr Dinge zu testen, ohne DOM tatsächlich zu berühren. Wenn Sie Angular verwenden, können Sie die testing directives example überprüfen.

    Verwenden der Abhängigkeit Das Injektionsmuster hilft sehr, da Sie die Umgebung, die Sie für jeden Test vorbereiten (und auch abbauen), grundsätzlich minimieren müssen. Hier ist an example.

    Im Allgemeinen sind niedrigere niedrigere Tests schneller. Ich denke, es ist gut, jede Funktionalität/jedes Problem mit dem geringstmöglichen Test zu behandeln.

  • beseitigen Speicherlecks:

    Wenn Ihre Tests ein Speicherleck, wird der Browser bekommen langsamer und langsamer und so die Testnummer 1000 wird ziemlich langsam sein, auch wenn es gut geschrieben ist. Stellen Sie sicher, dass jeder Test alle Referenzen freigibt. Sie können http://localhost:9876/debug.html verwenden und den Speicher profilieren. Überprüfen Sie den Speicher vor der Ausführung (nachdem Jasmine alle describe() Blöcke ausgeführt und die Tests gesammelt hat) und dann nach dem Ausführen der Tests - es sollte das gleiche sein.

    Einige Speicherlecks zu finden ist schwieriger als andere, aber es kann die Geschwindigkeit erheblich verbessern - ich habe Sachen von ~ 5 Minuten bis unter einer Minute gesehen, nur durch die Beseitigung von Speicherlecks.

+0

Können Sie erweitern, wie "den Speicher vor der Ausführung überprüfen (nachdem Jasmine alle beschreibenden() Blöcke ausgeführt und die Tests gesammelt hat) und dann nach Ausführung der Tests"? – CorrugatedAir

+0

https://www.npmjs.com/package/grunt-contrib-jasmine-phantom Dieses Plugin löst das Problem und behandelt, was Sie in Ihrer Antwort erwähnt haben. – Reddy

9

1a) über Profilierung: Sie karma reporters verwenden können, fügen Sie diese Strings deinen Karma-config:

reporters: [ 
     'progress', 
     'junit', 
    ], 
    junitReporter: { 
     outputFile: basePath + 'test_out/unit.xml', 
     suite: 'unit' 
    }, 

es schön xml wie folgen produzieren:

<testcase name="BuilderController should have a tileSelectorId" time="0.015" classname="unit Chrome 31.0.1650 (Windows 7).tileBuilder testing"/> 
<testcase name="BuilderController by default should sort by title" time="0" classname="unit Chrome 31.0.1650 (Windows 7).tileBuilder testing"/> 

Und Sie können sortieren und Wählen Sie, welcher langsamste Test optimiert werden soll

1b) Sie können auch reportSlowerThan vonverwenden

 reportSlowerThan: 100, 

Karma werden Sie über Tests langsamer als 100ms

2) informieren Ich weiß nicht, wie mehr Karma-Runner Prozesse/Threads zu starten.

3), weil Grunzen: Uhr bieten Sie filename.js geändert hat, können Sie beginnen filename.spec.js entsprechen, so dass Sie besondere Grunzen-Aufgabe

und verwenden Sie schreiben müssen ddescribe und iit zu start nur angegeben beschreiben/es.

1

Wenn Sie einen Weg suchen, zu wissen, welche Spezifikationen langsam sind, schrieb ich einen Blog-Post (http://jipiboily.com/how-to-know-jasmine-specs-are-slow/) darüber, aber kurze Version ist diese Reporter verwende ich gemacht:

// This works under Jasmine 2.3 
var slowSpecsReporter = { 
    specStarted: function(result) { 
    this.specStartTime = Date.now() 
    }, 
    specDone: function(result) { 
    var seconds = (Date.now() - this.specStartTime)/1000 
    if (seconds > 0.5) { 
     console.log('WARNING - This spec took ' + seconds + ' seconds: "' + result.fullName + '"') 
    } 
    }, 
} 
jasmine.getEnv().addReporter(slowSpecsReporter);