Frage

Ich versuche, einige JavaScript Unit-Tests in meinen automatisierten Build-Prozess zu integrieren. Derzeit arbeitet JSUnit gut mit JUnit, aber es scheint abandonware zu sein und es fehlt eine gute Unterstützung für AJAX, Debuggen und Timeouts.

Hat jemand kein Glück hatte Automatisierung (mit ANT) einer Unit-Test-Bibliothek wie YUI Test, jQuerys QUnit oder jQUnit ( http://code.google.com/p/jqunit/ )?

. Hinweis: Ich verwende eine benutzerdefinierte AJAX-Bibliothek gebaut, so DOH das Problem mit Dojos ist, dass es erfordert, dass Sie ihre eigenen AJAX-Funktionsaufrufe und Event-Handler zu verwenden, mit einem beliebigen AJAX Unit-Tests zu arbeiten

War es hilfreich?

Lösung

Es gibt viele JavaScript-Unit-Test-Framework gibt (JSUnit, scriptaculous, ...), aber JSUnit ist die einzige, die ich weiß, dass mit einem automatisierten Build verwendet werden können.

Wenn Sie tun ‚true‘ Unit-Test sollten Sie keine AJAX-Unterstützung benötigen. Zum Beispiel, wenn Sie einen RPC-Ajax-Framework wie DWR verwenden, können Sie leicht eine Mock-Funktion schreiben:

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

Und ja, JSUnit Timeouts gehe: Simulieren Zeit in JSUnit Tests

Andere Tipps

Ich bin nur über das Tun Javascript TDD auf ein neues Projekt starten an dem ich arbeite. Mein aktueller Plan ist, zu verwenden, QUnit die Unit-Tests zu tun. Während die Tests entwickeln können, indem einfach die Aktualisierung der Testseite in einem Browser ausgeführt werden.

Für die kontinuierliche Integration (und die Tests zu gewährleisten in allen Browsern laufen), werde ich verwenden Selenium automatisch geladen Test-Harnisch in jedem Browser, und lesen Sie das Ergebnis. Diese Tests werden laufen auf jeder checkin zur Quellcodeverwaltung.

Ich werde auch benutzen JSCoverage Code-Coverage-Analyse der Tests zu erhalten. Dies wird auch mit Selen automatisiert werden.

Ich bin zur Zeit in der Mitte dieser der Einrichtung. Ich werde diese Antwort mit genaueren Angaben aktualisieren, sobald ich das Setup gehämmert.


Testing Tools:

Im

einen großen Fan von js-Test-Treiber

Es funktioniert gut in einer CI-Umgebung und in der Lage, aktuellen Browser für Cross-Browser-Test zu erfassen.

Vor kurzem las ich einen Artikel von Bruno JSUnit verwenden und einen JsMock Rahmen obendrein ... und sehr interessant. Ich denke, seine Arbeit mit Unit-Tests meines Javascript-Code zu starten.

Mock Javascript oder Wie Unit-Test Javascript außerhalb der Browser-Umgebung

Ich habe gerade bekam Hudson CI JasmineBDD (ohne Kopf zu laufen zumindest für reine JavaScript Komponententests).

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

Ich habe nicht habe es noch mit einer großen Bibliothek schön zu spielen, obwohl, wie Prototyp.

Schauen Sie in YUITest

ich einverstanden bin, die Art auf der Rebe stirbt JSUnit. Wir haben gerade bis es mit YUI-Test zu ersetzen.

ähnlich wie bei dem Beispiel mit QUnit, wir laufen die Tests unter Verwendung von Selen. Wir laufen diesen Test unabhängig von unseren anderen Selen Tests einfach, weil es nicht die Abhängigkeiten hat, die die normalen UI Regressionstests haben (zum Beispiel der App auf einen Server bereitstellen).

Zum starten, haben wir eine Basis JavaScript-Datei, die in allen unseren Test HTML-Dateien enthalten ist. Diese Griffe Einstellung der YUI-Instanz auf, die Testläufer, Objekt der YUI.Test.Suite sowie die Test.Case. Es hat ein Verfahren, die über Selen zugegriffen werden kann, um die Testsuite ausführen, prüfen Sie, ob der Test Läufer noch läuft (Ergebnisse sind nicht verfügbar, bis nach dem es fertig ist), und die Testergebnisse erhalten (wir wählten JSON-Format)

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

Wie für die Selen-Seite der Dinge, haben wir eine parametrisierte Test. Wir führen unsere Tests in IE und FireFox im Datum Verfahren, wobei jedes Array der Testergebnisse in eine Liste von Objekt-Arrays Parsen des Browser-Namen enthält, die Testdateinamen, die Testnamen, das Ergebnis (Pass, versagen oder ignorieren) und die Nachricht.

Der eigentliche Test behauptet, nur das Testergebnis. Wenn es nicht gleich „pass“ ist dann scheitert es den Test mit der Nachricht aus dem YUI Testergebnis zurückgegeben.

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

    List<Object[]> testResults = new ArrayList<Object[]>();

    pageNames = new ArrayList<String>();
    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<Object[]> runJSTestsInBrowser(Browser aBrowser) {
    String yui_test_codebase = "file:///c://myapppath/yui/tests/";
    String browser_bot = "this.browserbot.getCurrentWindow()"
    List<Object[]> testResults = new ArrayList<Object[]>();
    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, dass dies hilfreich ist.

Es gibt ein neues Projekt, das Sie QUnit Tests in einer Java-Umgebung (wie ant), so dass Sie kann laufen Ihre clientseitige Testsuite mit dem anderen Unit-Tests vollständig integriert werden.

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

Ich habe es zu Unit-Test-jQuery-Plugins verwendet, objx Code, benutzerdefinierten OO JavaScript und es funktioniert für alles ohne Änderung.

Das Projekt, das ich auf gerade arbeite verwendet Js Test-Treiber Hosting Jasmin auf Chrome 10 mit Jasmin-JSTD-Adapter einschließlich der Verwendung von Code Coverage Tests enthalten in JS-Testfahrer. Zwar gibt es einige Probleme jedes Mal, wenn wir ändern oder zu aktualisieren Browser auf der CI-Umgebung die Jasmin Tests laufen ziemlich glatt mit nur kleineren Problemen mit ansynchronous Tests, aber soweit mir bewusst bin, diese Jasmine Uhr mit umgingen werden kann, aber ich habe keine Chance flicken sie noch habe.

Ich habe eine rel="nofollow"> ohne einen Browser verwenden . Es ist ein Modul, das node.js zombie.js laden Sie die Testseite und überprüfen Sie die Ergebnisse verwendet. Ich habe darüber geschrieben auf meinem Blog . Hier ist, was die Automatisierung wie folgt aussieht:

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

});

Ich schaute auf Ihrer Frage Datum und damals gab es ein paar guten JS Test lib / Rahmen. Heute haben Sie viel mehr und in anderen Fokus wie TDD, BDD, Assetion und mit / ohne Läufer Unterstützung finden können.

Es gibt viele Spieler in diesem Spiel wie Mokka, Chai, QUnit, Jasmin, etc ... Sie können mehr Informationen in dieser Blog über JS / Mobile / Web Test finden ...

Ein weiterer JS Test-Framework, die mit Ant ausgeführt werden kann, ist Crosscheck . Es ist ein Beispiel für das Projekt Crosscheck über Ant in der Build-Datei von ausgeführt wird.

Crosscheck versucht, mit mäßigem Erfolg, einen Browser zu emulieren, einschließlich Mock-Stil Implementierungen von XMLHttpRequest und Timeout / Intervall.

Es ist zur Zeit nicht verarbeitet Javascript von einer Webseite geladen, though. Sie müssen die JavaScript-Dateien angeben, die Sie laden und testen wollen. Wenn Sie von Ihrem HTML getrennt alle Ihre JS halten, könnte es für Sie arbeiten.

Ich habe ein Ant-Task geschrieben, die verwenden Phantom JS , ein kopfloser Webkit-Browser, QUnit html Testdateien laufen innerhalb eines Ant Erstellungsprozess. Es kann auch die Build fehl, wenn alle Tests fehlschlagen.

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

Dies ist eine gute Auswertung mehrerer Test-Tools.

JavaScript Unit-Test-Tools für TDD

Ich persönlich bevorzugen https://code.google.com/p/js-test-driver/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top