Unitatea automată de testare cu JavaScript

Încerc să încorporez câteva teste de unitate JavaScript în procesul meu de construire automatizat. În prezent, JSUnit funcționează bine cu JUnit, dar pare a fi abandonware și nu are suport bun pentru AJAX, debugging și timeouts.

A avut cineva vreun noroc de automatizare (cu ANT) o unitate de testare a bibliotecii, cum ar fi testul YUI, JQuery's Qunit sau jQUnit ( http://code.google.com/p/jqunit/ )?

Notă: folosesc o bibliotecă personalizată AJAX construită, astfel încât problema cu DOH Dojo este că vă cere să utilizați propriile apeluri de funcții AJAX și dispozitive de manipulare a evenimentelor pentru a lucra cu orice testarea unității AJAX.

0
Întrebare înrudită: JavaScript mai bun"> stackoverflow .com/întrebări/300855/& hellip;
adăugat autor Jacques Bosch, sursa

14 răspunsuri

Am citit recent un articol al lui Bruno folosind JsUnit și creând un cadru JsMock pe partea de sus ... foarte interesant. Ma gandesc sa-mi folosesc munca pentru a incepe sa-mi testez codul Javascript.

Mock Javascript sau Cum de a testa unitatea Javascript în afara mediul browserului

0
adăugat

Există multe cadre de testare a unităților JavaScript acolo (jsUnit, scriptaculous, ...), dar jsUnit este singurul care știu că poate fi folosit cu o construcție automată.

Dacă faci un test de "adevărat" unitate, nu ar trebui să ai nevoie de asistență AJAX. De exemplu, dacă utilizați un cadru ajax RPC, cum ar fi DWR, puteți scrie cu ușurință o funcție falsă:

   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
adăugat

Look into YUITest

0
adăugat

Am publicat o mică bibliotecă pentru verificarea testelor JavaScript dependente de browser fără a fi nevoie să utilizați un browser. Acesta este un modul node.js care folosește zombie.js pentru a încărca pagina de testare și a inspecta rezultatele. Am scris despre asta pe blogul meu . Iată cum arată automatizarea:

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
adăugat

M-am uitat la data de întrebare și, atunci, au existat câteva bune JS teste lib/cadru. Astăzi puteți găsi mult mai multe și în focus diferite, cum ar fi TDD, BDD, Assetion și cu/fără suport pentru alergători.

Există mulți jucători în acest joc, cum ar fi Mocha, Chai, Qunit, Jasmine, etc ... Puteți găsi mai multe informații în acest blog despre testarea JS/Mobile/web ...

0
adăugat

Un alt cadru de testare JS care poate fi rulat cu Ant este CrossCheck . Există un exemplu de rulare a CrossCheck prin Ant în fișierul de construire al proiectului.

Încercări CrossCheck, cu un succes limitat, pentru a emula un browser, inclusiv implementări de tip XMLHttpRequest și timeout/interval.

În prezent, nu se ocupă cu încărcarea JavaScript de pe o pagină web. Trebuie să specificați fișierele JavaScript pe care doriți să le încărcați și să le testați. Dacă țineți toate JS-urile separate de codul dvs. HTML, s-ar putea să funcționeze pentru dvs.

0
adăugat

Sunt pe cale să încep să fac Javascript TDD pe un nou proiect la care lucrez. Planul meu actual este să folosiți qunit pentru a efectua testarea unității. În timpul dezvoltării, testele pot fi executate prin simpla actualizare a paginii de test într-un browser.

Pentru integrarea continuă (și asigurarea testelor efectuate în toate browserele), voi folosi Selenium pentru a încărca automat hamul de testare în fiecare browser și citiți rezultatul. Aceste teste vor fi executate la fiecare verificare la controlul sursei.

De asemenea, o să folosesc JSCoverage pentru a obține o analiză de acoperire a codurilor pentru teste. Acest lucru va fi, de asemenea, automatizat cu Selenium.

În prezent sunt în mijlocul stabilirii. Voi actualiza acest răspuns cu detalii mai detaliate odată ce am stabilit configurația.


Instrumente de testare:

0
adăugat
da, vă rog să-l împărțiți. Mulțumiri
adăugat autor melaos, sursa
Am făcut acest lucru, dar folosind tehnologii puțin diferite. Am folosit driverul de testare JS pentru a rula testele unității în fiecare browser (mai degrabă decât Selenium), utilizând Adapter Qunit ( cod.google.com/p/js-test-driver/wiki/QUnitAdapter ). Un altul la angajatorul meu actual folosesc cadrul de testare Jasmine și rulează testele în Nodul Jasmine ( github.com/mhevery/nodul de iasomie ) care evită întârz
adăugat autor Karl, sursa
cam cea mai buna utilizare a seleniului. om, am pierdut mult timp cu acel lucru. grumble bâzâi ....
adăugat autor the0ther, sursa
Ați reușit vreodată să faceți asta? Cum a mers?
adăugat autor El Yobo, sursa
Bună @ Karl.I am găsit, de asemenea, qunit ca un instrument util, dar nu știu exact ce să testeze. Am o logică de joc scrisă în JavaScript cu combinații, animații. Puteți pls să mă ajute cu unele informații? Mulțumiri.
adăugat autor Anahit Ghazaryan, sursa

Im a big fan of js-test-driver

Funcționează bine într-un mediu CI și poate captura browsere reale pentru testele cross-browser.

0
adăugat
Îmi place datorită integrării CI, dar cred că cel mai bun plus este că funcționează cu YUITest și QUnit!
adăugat autor AutomatedTester, sursa

Sunt de acord că un fel de moare pe viță. Tocmai am terminat înlocuindu-l cu testul YUI.

Similar cu exemplul folosind qUnit, executam testele folosind Selenium. Încercăm acest test independent de celelalte teste de seleniu, pur și simplu pentru că nu are dependențele pe care le au testele de regresie UI normale (de exemplu, implementarea aplicației pe un server).

Pentru a începe, avem un fișier JavaScript de bază care este inclus în toate fișierele html de testare. Acest lucru se ocupă de configurarea instanței YUI, a runner-ului de testare, a obiectului YUI.Test.Suite, precum și a Test.Case. Dispune de metode care pot fi accesate prin Selenium pentru a rula suita de testare, pentru a verifica dacă testul rulează în continuare (rezultatele nu sunt disponibile decât după ce a fost terminat) și pentru a obține rezultatele testului (am ales formatul JSON)

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

În ceea ce privește partea selenială a lucrurilor, am folosit un test parametrizat. Executăm testele noastre atât în ​​IE, cât și în FireFox în metoda de date, parsând rezultatele testului într-o listă de tablouri Object cu fiecare matrice care conține numele browserului, numele fișierului testului, numele testului, rezultatul (treci, eșuează sau ignoră) și mesajul.

Testul real afirmă doar rezultatul testului. Dacă nu este egal cu "trece", atunci nu reușește testul cu mesajul returnat din rezultatul testului YUI.

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

Sper că acest lucru este util.

0
adăugat

Am doar am primit Hudson CI pentru a rula JasmineBDD (fără cap), la cel puțin pentru testarea unităților JavaScript pure.

(Hudson rulează Java prin shell, rulează Envs, rulează JasmineBDD.)

Nu am reușit să joc frumos cu o mare bibliotecă încă, totuși, ca un prototip.

0
adăugat

Există un nou proiect care vă permite să rulați testele qunit într-un mediu Java (cum ar fi ant), astfel încât să puteți integra pe deplin suita ta de testare pe partea clientului cu celelalte teste ale unității.

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

Am folosit-o pentru a testa modulele jQuery pentru unitate, codul objx , JavaScript personalizat OO și funcționează pentru tot fără modificări.

0
adăugat

Proiectul pe care lucrez utilizează Js-Test-Driver care găzduiește Jasmine pe Chrome 10 cu Jasmine-JSTD-Adaptor , inclusiv utilizarea Testarea codului inclusă în JS-Test-Driver. Deși există probleme de fiecare dată când modificăm sau actualizăm browserele din mediul CI , testele pentru iasomie se execută destul de bine, cu doar probleme minore cu teste ansncronice, dar, din câte știu, pot fi lucrate în jurul lor folosind Ceasul Jasmine, dar nu am avut încă șansa să le pun în pat.

0
adăugat

Am scris o sarcină Ant care folosește un browser webkit fără fir, pentru a rula fișiere de testare Qunit html într-un Ant construi procesul. De asemenea, poate să nu reușească să construiască dacă testele nu reușesc.

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

0
adăugat

Aceasta este o evaluare bună a mai multor instrumente de testare.

Unelte de testare pentru unitățile JavaScript pentru TDD

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

0
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
254 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com

JavaScript jobs România Moldova
JavaScript jobs România Moldova
109 participanți

Pentru confort opriți notificările. Vorbim despre posturi de muncă și freelance, proiecte proprii.