Test di unità e chiamate di funzioni native della lingua

3

Esiste una best practice per chiamare le funzioni native della lingua quando si scrive codice verificabile?

Ho sperimentato un po 'con il codice php e ho inventato due metodologie:

  • crea una classe wrapper per tutte le funzioni native e prendi in giro questo wrapper durante la scrittura dei test
  • utilizzando "magic namespace": chiamando tutte le funzioni native senza specificare lo spazio dei nomi globale ( aFunction invece di \aFunction ) e quindi scrivendo uno stub di metodo nello spazio dei nomi specificato durante il test, che determinerà il codice da testato usando lo stub al posto della funzione nativa
Esiste un approccio più comunemente usato? Quali sono i vantaggi e le carenze delle metodologie più comunemente usate per testare le chiamate di funzioni native della lingua?     
posta DudeOnRock 03.06.2013 - 22:30
fonte

2 risposte

2

Non esegui test unitari delle funzioni native della lingua. Prova il tuo codice. Fai affidamento sulla lingua che utilizzi e su qualsiasi libreria di terze parti.

Codice libreria / lingua

Se vuoi che il codice esterno sia testato, va bene, ma non all'interno del tuo progetto. Batti il software di terze parti e fai i test , che si tratti di PHP o di una classe mailer o altro. Al giorno d'oggi molti progetti vengono forniti con test unitari, quindi è probabile che sia già disponibile per te.

La ragione è semplice. Non appena si aggiusta qualcosa in un software di terze parti, si perde immediatamente la capacità di aggiornamento, e quindi il più grande vantaggio dall'utilizzo di tale software. Il forking nei tuoi (sotto) progetti funziona come un proxy, in cui puoi cambiare il software, ma puoi ancora aggiornarlo (ad esempio usando git rebase ), e, come extra, puoi facilmente contribuire ai progetti, tu fare affidamento su.

Risorse

Se tu - come hai detto nel tuo commento - vuoi rendere testabile FTP (o MySQL o qualsiasi altra cosa), cioè, ottenere l'indipendenza dalle risorse PHP, incapsularle nelle loro classi. Se usi una classe FTP come

class FTP
{
    ...

    public function connect($server, $user, $pass)
    {
        ...
    }

    public function put($bytes)
    {
        ...
    }

    ...
}

in combinazione con Dependency Injection, puoi facilmente deriderlo. La classe stessa di solito non è testata da unità: è oggetto di un test di integrazione in un ambiente controllato.

    
risposta data 04.06.2013 - 13:03
fonte
3

Generalmente non vuoi prendere in giro le funzioni native. Dovresti fare affidamento su di loro per fare le loro cose. Sebbene ci siano eccezioni come (in php: ftp_connect , time , ecc.)

Hai un paio di opzioni.

1) Si crea una classe wrapper che avvolge le chiamate della funzione nativa in modo da poterla controllare. Il lato negativo di questo è che è ancora necessario chiamare una risorsa reale se si desidera testare il proprio wrapper. O si finisce con una posizione di codice non testato.

2) Come affermi facendo la magia dello spazio dei nomi (specifica per PHP). Mi piace questo metodo in quanto ti consente di controllare la funzione nativa anche con una classe wrapper.

Se la funzionalità ha un'interfaccia di classe nativa, usala invece come se fosse possibile creare una simulazione. In altre lingue, puoi anche sovraccaricare le funzioni native che consentono di creare una simulazione della funzione in questione.

    
risposta data 04.06.2013 - 19:18
fonte

Leggi altre domande sui tag