Automatisierte Unit Testing mit JavaScript

Ich versuche einige JavaScript-Unit-Tests in meinen automatisierten Build-Prozess zu integrieren. Gegenwärtig funktioniert JSUnit gut mit JUnit, aber es scheint Abandonware zu sein und es fehlt eine gute Unterstützung für AJAX, Debugging und Timeouts.

Hat jemand Glück gehabt, eine Unit-Test-Bibliothek wie YUI-Test, JQuery's QUnit oder jQUnit (mit ANT) zu automatisieren ( http://code.google.com/p/jqnit/ )?

Hinweis: Ich verwende eine benutzerdefinierte AJAX-Bibliothek. Das Problem mit Dojos DOH ist also, dass Sie ihre eigenen AJAX-Funktionsaufrufe und Ereignishandler verwenden müssen, um mit AJAX-Komponententests zu arbeiten.

0
hinzugefügt der Autor Jacques Bosch, Quelle

14 Antworten

Ich habe vor kurzem einen Artikel von Bruno mit JsUnit gelesen und darüber hinaus ein JsMock-Framework erstellt ... sehr interessant. Ich denke daran, seine Arbeit zu nutzen, um meinen JavaScript-Code zu testen.

Mock Javascript oder Wie testet man Javascript außerhalb der Browser-Umgebung

0
hinzugefügt

Es gibt viele Javascript Unit Test Framework da draußen (jsUnit, scriptaculous, ...) aber jsUnit ist die einzige, die ich kenne, die mit einem automatisierten Build verwendet werden kann.

Wenn Sie einen "echten" Komponententest durchführen, sollten Sie keine AJAX-Unterstützung benötigen. Wenn Sie beispielsweise ein RPC-Ajax-Framework wie DWR verwenden, können Sie problemlos eine Scheinfunktion schreiben:

   function mockFunction(someArg, callback) {
      var result = ...;//some treatments   
      setTimeout(
function() { callback(result); }, 300 //some fake latency
); }

And yes, JsUnit do handle timeouts : Simulating Time in jsUnit Tests

0
hinzugefügt

Look into YUITest

0
hinzugefügt

Ich habe eine kleine Bibliothek veröffentlicht, um browserabhängige JavaScript-Tests zu überprüfen, ohne einen Browser verwenden zu müssen. Es ist ein Modul node.js, das zombie.js verwendet, um die Testseite zu laden und die Ergebnisse zu überprüfen. Ich habe darüber in meinem Blog geschrieben. So sieht die Automatisierung aus:

var browsertest = require('../browsertest.js').browsertest;

describe('browser tests', function() {

it('should properly report the result of a mocha test page', function (done) {
    browsertest({
        url: "file:///home/liam/work/browser-js-testing/tests.html",
        callback: function() { 
            done();
        }
    });
});

});
0
hinzugefügt

Ich schaute auf dein Fragedatum und damals gab es ein paar gute JS-Teste lib/framework. Heute können Sie viel mehr und in verschiedenen Fokus wie TDD, BDD, Assestion und mit/ohne Läufer Unterstützung finden.

Es gibt viele Spieler in diesem Spiel wie Mocha, Chai, QUnit, Jasmin, etc ... Weitere Informationen finden Sie in diesem Blog über JS/Mobile/Web Testing ...

0
hinzugefügt

Ein weiteres JS-Testframework, das mit Ant ausgeführt werden kann, ist CrossCheck . Es gibt ein Beispiel für die Ausführung von CrossCheck über Ant in der Build-Datei für das Projekt.

CrossCheck versucht, mit begrenztem Erfolg, einen Browser zu emulieren, einschließlich der Imitationen von XMLHttpRequest und Timeout/Intervall.

Derzeit wird JavaScript jedoch nicht von einer Webseite geladen. Sie müssen die JavaScript-Dateien angeben, die Sie laden und testen möchten. Wenn Sie alle Ihre JS getrennt von Ihrem HTML behalten, könnte es für Sie arbeiten.

0
hinzugefügt

Ich bin gerade dabei, Javascript TDD an einem neuen Projekt zu beginnen, an dem ich gerade arbeite. Mein aktueller Plan ist es, qunit zu verwenden, um den Komponententest durchzuführen. Während der Entwicklung können die Tests ausgeführt werden, indem einfach die Testseite in einem Browser aktualisiert wird.

Für eine kontinuierliche Integration (und um sicherzustellen, dass die Tests in allen Browsern ausgeführt werden) verwende ich Selenium , um die Testumgebung automatisch zu laden in jedem Browser, und lesen Sie das Ergebnis. Diese Tests werden bei jedem Check-in zur Versionskontrolle ausgeführt.

Ich werde auch JSCoverage verwenden, um Code Coverage-Analysen der Tests zu erhalten. Dies wird auch mit Selen automatisiert.

Ich bin gerade dabei, das einzurichten. Ich werde diese Antwort mit genaueren Details aktualisieren, sobald ich das Setup ausgearbeitet habe.


Testwerkzeuge:

0
hinzugefügt
Ja, bitte teilen Sie es. Vielen Dank
hinzugefügt der Autor melaos, Quelle
Ich habe das eingerichtet, aber mit etwas anderen Technologien. Ich habe JS Test Driver verwendet, um die Komponententests in jedem Browser (statt Selenium) mit dem QUnit Adapter ( code.google.com/p/js-test-driver/wiki/QUnitAdapter ). Bei meinem derzeitigen Arbeitgeber verwende ich das Jasmine-Testframework und führe die Tests im Jasmine Node ( github.com) durch/mhevery/jasmine-node ), wodurch die Verz
hinzugefügt der Autor Karl, Quelle
so ziemlich die beste Verwendung von Selen. Mann, ich habe viel Zeit mit diesem Ding verschwendet. meckern meckern ....
hinzugefügt der Autor the0ther, Quelle
Hast du das jemals aufgebaut? Wie ist es gelaufen?
hinzugefügt der Autor El Yobo, Quelle
Hi @ Karl.Ich habe auch gefunden, dass qunit als ein nützliches Werkzeug, aber nicht genau was zu testen ist. Ich habe eine Spiellogik geschrieben in Javascript mit Kombinationen, Animationen. Können Sie mir bitte mit einigen Informationen helfen? Vielen Dank.
hinzugefügt der Autor Anahit Ghazaryan, Quelle

Im a big fan of js-test-driver

Es funktioniert gut in einer CI-Umgebung und kann tatsächliche Browser für browserübergreifende Tests erfassen.

0
hinzugefügt
Ich mag es wegen der CI-Integration, denke aber, dass es am besten ist, dass es mit YUITest und QUnit funktioniert!
hinzugefügt der Autor AutomatedTester, Quelle

Ich stimme zu, dass jsunit irgendwie am Rebstock stirbt. Wir haben es gerade mit dem YUI-Test ersetzt.

Ähnlich dem Beispiel mit qUnit führen wir die Tests mit Selenium durch. Wir führen diesen Test unabhängig von unseren anderen Selen-Tests durch, einfach weil er nicht die Abhängigkeiten aufweist, die die normalen UI-Regressionstests aufweisen (z. B. die Bereitstellung der App auf einem Server).

Zu Beginn haben wir eine Basis-Javascript-Datei, die in allen unseren Test-HTML-Dateien enthalten ist. Dies erledigt die Einrichtung der YUI-Instanz, des Test-Runner, des YUI.Test.Suite-Objekts sowie des Test.Case. Es verfügt über Methoden, auf die über Selenium zugegriffen werden kann, um die Testsuite auszuführen, um zu überprüfen, ob der Test-Runner noch läuft (Ergebnisse sind erst nach Abschluss verfügbar), und um die Testergebnisse zu erhalten (wir haben das JSON-Format gewählt)

var yui_instance; //the YUI instance
var runner;  //The YAHOO.Test.Runner
var Assert; //an instance of YAHOO.Test.Assert to save coding
var testSuite; //The YAHOO.Test.Suite that will get run.

/**
 * Sets the required value for the name property on the given template, creates
 * and returns a new YUI Test.Case object.
 * 
 * @param template the template object containing all of the tests
 */
function setupTestCase(template) {
    template.name = "jsTestCase";
    var test_case = new yui_instance.Test.Case(template);
    return test_case;
}

/**
 * Sets up the test suite with a single test case using the given 
 * template.
 * 
 * @param template the template object containing all of the tests
 */
function setupTestSuite(template) {
    var test_case = setupTestCase(template);
    testSuite = new yui_instance.Test.Suite("Bond JS Test Suite");
    testSuite.add(test_case);
}

/**
 * Runs the YAHOO.Test.Suite
 */
function runTestSuite() {
    runner = yui_instance.Test.Runner;
    Assert = yui_instance.Assert;

    runner.clear();
    runner.add(testSuite);
    runner.run();
}

/**
 * Used to see if the YAHOO.Test.Runner is still running.  The
 * test results are not available until it is done running.
 */
function isRunning() {
    return runner.isRunning();
}

/**
 * Gets the results from the YAHOO.Test.Runner
 */
function getTestResults() {
    return runner.getResults(yui_instance.Test.Format.JSON);
}

Was die Selen-Seite betrifft, haben wir einen parametrisierten Test verwendet. Wir führen unsere Tests in IE und FireFox in der Datenmethode aus und parsen die Testergebnisse in eine Liste von Object-Arrays, wobei jedes Array den Browsernamen, den Testdateinamen, den Testnamen, das Ergebnis (bestanden, nicht bestanden oder ignoriert) enthält. und die Nachricht.

Der eigentliche Test bestätigt nur das Testergebnis. Wenn es nicht gleich "bestanden" ist, schlägt es den Test mit der vom YUI-Testergebnis zurückgegebenen Nachricht fehl.

    @Parameters
public static List data() throws Exception {
    yui_test_codebase = "file:///c://myapppath/yui/tests";

    List testResults = new ArrayList(); pageNames = new ArrayList(); pageNames.add("yuiTest1.html"); pageNames.add("yuiTest2.html"); testResults.addAll(runJSTestsInBrowser(IE_NOPROXY)); testResults.addAll(runJSTestsInBrowser(FIREFOX)); return testResults; } /** * Creates a selenium instance for the given browser, and runs each * YUI Test page. * * @param aBrowser * @return */ private static List runJSTestsInBrowser(Browser aBrowser) { String yui_test_codebase = "file:///c://myapppath/yui/tests/"; String browser_bot = "this.browserbot.getCurrentWindow()" List testResults = new ArrayList(); selenium = new DefaultSelenium(APPLICATION_SERVER, REMOTE_CONTROL_PORT, aBrowser.getCommand(), yui_test_codebase); try { selenium.start(); /* * Run the test here */ for (String page_name : pageNames) { selenium.open(yui_test_codebase + page_name); //Wait for the YAHOO instance to be available selenium.waitForCondition(browser_bot + ".yui_instance != undefined", "10000"); selenium.getEval("dom=runYUITestSuite(" + browser_bot + ")"); //Output from the tests is not available until //the YAHOO.Test.Runner is done running the suite selenium.waitForCondition("!" + browser_bot + ".isRunning()", "10000"); String output = selenium.getEval("dom=getYUITestResults(" + browser_bot + ")"); JSONObject results = JSONObject.fromObject(output); JSONObject test_case = results.getJSONObject("jsTestCase"); JSONArray testCasePropertyNames = test_case.names(); Iterator itr = testCasePropertyNames.iterator(); /* * From the output, build an array with the following: * Test file * Test name * status (result) * message */ while(itr.hasNext()) { String name = (String)itr.next(); if(name.startsWith("test")) { JSONObject testResult = test_case.getJSONObject(name); String test_name = testResult.getString("name"); String test_result = testResult.getString("result"); String test_message = testResult.getString("message"); Object[] testResultObject = {aBrowser.getCommand(), page_name, test_name, test_result, test_message}; testResults.add(testResultObject); } } } } finally { //if an exception is thrown, this will guarantee that the selenium instance //is shut down properly selenium.stop(); selenium = null; } return testResults; } /** * Inspects each test result and fails if the testResult was not "pass" */ @Test public void inspectTestResults() { if(!this.testResult.equalsIgnoreCase("pass")) { fail(String.format(MESSAGE_FORMAT, this.browser, this.pageName, this.testName, this.message)); } } 

Ich hoffe, das ist hilfreich.

0
hinzugefügt

Ich habe nur Hudson CI JasmineBDD laufen lassen (kopflos), bei am wenigsten für reines JavaScript Unit-Test.

(Hudson läuft Java über Shell, läuft Envjs, läuft JasmineBDD.)

Ich habe es aber noch nicht gut mit einer großen Bibliothek spielen können, wie Prototyp.

0
hinzugefügt

Es gibt ein neues Projekt, mit dem Sie qunit -Tests in einer Java-Umgebung (wie ant) ​​ausführen können, damit Sie vollständig integrieren können Ihre clientseitige Testsuite mit Ihren anderen Komponententests.

http://qnit-test-runner.googlecode.com

Ich habe es verwendet, um jQuery Plugins, objx Code, benutzerdefinierte OO JavaScript zu testen und es funktioniert für alles ohne Änderung.

0
hinzugefügt

Das Projekt, an dem ich gerade arbeite, verwendet Js-Test-Driver , um Jasmine auf Chrome 10 mit Jasmine-JSTD-Adapter einschließlich der Verwendung von Code Coverage Tests, die im JS-Test-Treiber enthalten sind. Obwohl es jedes Mal Probleme gibt, wenn wir Browser in der CI-Umgebung ändern oder aktualisieren, laufen die Jasmin-Tests ziemlich glatt mit nur kleinen Problemen mit an synchronen Tests, aber soweit ich weiß, können diese mit Jasmine Clock bearbeitet werden, aber ich hatte noch keine Chance, sie zu patchen.

0
hinzugefügt

Ich habe eine Ant-Aufgabe geschrieben, die Phantom JS , einen kopflosen Webkit-Browser, verwendet, um HTML-Testdateien von Qnit innerhalb einer Ant laufen zu lassen Build-Prozess. Es kann auch fehlschlagen, wenn Tests fehlschlagen.

https://github.com/philmander/ant-jststrunner

0
hinzugefügt

Dies ist eine gute Bewertung mehrerer Testwerkzeuge.

JavaScript Unit Test-Tools für TDD

I personally prefer https://code.google.com/p/js-test-driver/

0
hinzugefügt
JavaScript - Deutsche Gemeinschaft
JavaScript - Deutsche Gemeinschaft
3 der Teilnehmer

In dieser Gruppe sprechen wir über JavaScript.