Posso testare efficacemente le funzioni javascript con un framework di testing unitario PHP?

3

Se voglio testare unitamente alcune delle mie funzioni javascript, sarebbe più efficiente (e fattibile) usare il framework di test dell'unità PHP già installato, o dovrei usare un framework javascript per testare le unità?

EDIT: Sembra che devo chiarire un po 'le cose. Sto usando javascript per la convalida del modulo. Sembra che alcune logiche non funzionino come voglio, e ho pensato che sarebbe stato un buon punto per iniziare a usare il test delle unità (qualcosa che è venuto alla mia portata solo di recente). Ho già iniziato a utilizzare SimpleTest su un mio piccolo progetto, ma mai a testare la logica generata dal lato client.

Ora so che SimpleTest ha la possibilità di emulare un browser per esempio. Ma mi chiedevo quale altro metodo sarebbero stati per testare unitamente la convalida del mio modulo. Mentre cercavo un'idea, mi sono reso conto che esiste anche un framework di test unitario per javascript, ma dopo un po 'di ricerca su alcuni dei siti SE, non ho trovato nulla sull'uso di PHP e Javascript Framework insieme, quindi si chiedeva quanto fosse comune questa situazione e come gestiscono le altre persone in un simile ambiente.

    
posta Eldros 20.12.2010 - 17:05
fonte

4 risposte

5

La risposta breve è no.

Non puoi efficace testare JavaScript con PHP. Per farlo in modo efficace, è necessario utilizzare JavaScript.

Molto probabilmente dovrai utilizzare una libreria di test delle unità JavaScript come quella utilizzata per Prototype.js . In sostanza, devi essere in grado di eseguire JavaScript nel browser e ottenere i risultati dell'esecuzione di JavaScript. Non sarai in grado di farlo dal lato server (PHP).

I framework di testing delle unità sono i più efficienti e utili quando si utilizza lo stesso linguaggio per testare come scrivere il codice. Per questo motivo abbiamo framework di test delle unità PHP, framework di testing dell'unità Java, test dell'unità C # /. quadri e sì, framework di test unitari di JavaScript. Gran parte della ragione di ciò è che i test di unità devono esaminare i risultati di ciò che il tuo codice sta facendo nell'ambiente in cui viene eseguito. SimpleTest viene eseguito nell'ambiente PHP e viene esaminato per affermare che le funzioni PHP stanno facendo ciò che ci si aspetta. Non viene eseguito direttamente nel browser client, ma come tutto il codice PHP che viene eseguito sul server e genera l'output HTML.

Per poter eseguire e testare la funzionalità JavaScript, in particolare quando il problema potrebbe essere il modo in cui un browser lo implementa, è necessario eseguire e applicare funzionalità in JavaScript. Ora puoi creare il tuo framework di test dell'unità JavaScript per il tuo ambiente, oppure puoi usarne uno già esistente.

Il JavaScript vive al 100% sul lato client. Ecco perché non hai visto nulla sull'esecuzione di JavaScript e PHP insieme - proprio come non troverai informazioni su Java e JavaScript insieme (nello stesso contesto stiamo parlando qui).

    
risposta data 20.12.2010 - 17:10
fonte
1

Probabilmente potresti hackerarlo, ma non riesco a vedere il risultato finale particolarmente carino o facile da usare. Stai solo cercando di utilizzare il framework di test PHP per riportare i risultati dei test, o speri di chiamare il javascript via PHP?

Personalmente userò qualcosa come QUnit ; il framework di test jquery. È molto facile da usare e consente di utilizzare javascript per testare javascript all'interno di un browser. Puoi anche collegarlo a Rhino (con env.js ) per consentire l'esecuzione di test automatizzati senza testine.

    
risposta data 20.12.2010 - 17:25
fonte
0

Perché non stai usando Firebug? In particolare c'è un'estensione chiamata Firesymfony che integra il supporto per il debug di PHP dal framework Symfony ma ci sono altre estensioni potrebbe essere più adatto a quello che stai cercando di fare.

    
risposta data 21.12.2010 - 04:29
fonte
0

Ho fatto qualcosa di simile con javascript validation , non execution .

Uso lo strumento da riga di comando gjslint di Google per convalidare javascript.

/**
 * 
 * @test
 * @dataProvider dataprovider_javascript_file
 */
public function javascript_files_are_valid ($fn){
    $dn = getcwd();
    $fn = "$dn/$fn";
    // most of these are whitespace- file-ending- and missing-semicolon flags
    $cmd1 = "gjslint --disable 131,1,2,5,10,11,300,-2 --nojsdoc --max_line_length 12000";
    $cmd .= "$cmd1 $fn";
    $flag = 1;
    $act_string = system($cmd, $flag);
    $exp_string = "1 files checked, no errors found.";
    $this->assertEquals($exp_string, $act_string, print_r("cmd: $cmd", 1));
}

public function dataprovider_javascript_file() {
    $dt->confArray = array("dirname1" => "", "dirname2" => "");
    $files = array_filter($dt->confArray, "self::getfilenames2"); 
    $files = array_map("self::val2array", $files); 
    return $files;
}

private function val2array($v){
    return array($v);
}


private function getfilenames2($var){
    //fetch js files, but not minified files
    //return preg_match('/\.js$/', $var) ; #&& ! preg_match('/\.min\./', $var);

    return preg_match('/\.js$/', $var) && ! preg_match('/\.min\./', $var);

}

Qui prendo l'output dal comando system () e controllo la stringa del messaggio. Questo è il metodo di un povero uomo, ma potrebbe essere sufficiente per iniziare.

Una strategia simile sarebbe quella di includere il browser headless phantomjs per davvero eseguire em> il tuo javascript. Quindi prendi la stringa di output e controlla che non contenga messaggi di errore.

Sono venuto qui per cercare delle risposte in cui qualcuno avrebbe potuto farlo, ma finora non ha trovato alcun codice. forse devo scriverlo da solo.

Modifica:

phantomjs-1.9.7-linux-x86_64/bin/phantomjs --web-security=false /phantomjs-1.9.7-linux-x86_64/examples/arguments.js test hello

Output:

0: /opt/smallapps/phantomjs-1.9.7-linux-x86_64/examples/arguments.js 1: test 2: a

Prendi questo output dalla riga di comando e controllalo con le asserzioni di phpunit.

example.js contiene:

var system = require('system');
if (system.args.length === 1) {
    console.log('Try to pass some args when invoking this script!');
} else {
    system.args.forEach(function (arg, i) {
            console.log(i + ': ' + arg);
    });
}
phantom.exit();

Purtroppo, tutto ciò funzionerà solo con i file javascript più semplici, senza alcuna dipendenza da framework come jQuery o interazioni reali con altri file javascript che devono essere incorporati in una pagina HTML reale, ad es. per accedere al DOM.

    
risposta data 03.02.2015 - 13:08
fonte

Leggi altre domande sui tag