Test iOS / Specifiche TDD / BDD e Test di integrazione e accettazione


229

Quali sono le migliori tecnologie da utilizzare per lo sviluppo basato sul comportamento su iPhone? E quali sono alcuni progetti di esempio open source che dimostrano un uso corretto di queste tecnologie? Ecco alcune opzioni che ho trovato:


Test unitari

Test :: Stile unità

  1. OCUnit / SenTestingKit come spiegato nella Guida allo sviluppo di iOS: Applicazioni di unit test e altri riferimenti OCUnit .
  2. CATTURARE
  3. GHUnit
  4. Google Toolbox per Mac: test dell'unità iPhone

Stile RSpec

  1. Kiwi (che viene anche con beffe e aspettative)
  2. Cedro
  3. Jasmine con UI Automation come mostrato nelle abili specifiche di test di accettazione iOS

Test di accettazione

Selenio Style

  1. UI Automation (funziona sul dispositivo)

    AGGIORNAMENTO: Zucchini Framework sembra fondere Cucumber e UI Automation! :)

    Vecchi post sul blog:

  2. UISpec con UISpecRunner

  3. FoneMonkey

Stile Di Cetriolo

  1. Frank e iCuke (basato sul Cucumber incontra l'iPhone )

  2. KIF (Keep It Functional) di Square

  3. Zucchini Framework utilizza la sintassi di Cucumber per scrivere i test e utilizza CoffeeScript per le definizioni dei passaggi.

aggiunte

Conclusione

Bene, ovviamente, non c'è una risposta giusta a questa domanda, ma ecco cosa sto scegliendo di seguire attualmente:

Per i test unitari utilizzavo OCUnit / SenTestingKit in XCode 4. È semplice e solido. Ma preferisco il linguaggio di BDD rispetto a TDD ( Perché RSpec è migliore di Test :: Unit ?) Perché le nostre parole creano il nostro mondo. Quindi ora uso Kiwi con il completamento / completamento automatico del codice ARC & Kiwi . Preferisco il kiwi al cedro perché è costruito sopra OCUnit e viene fornito con fiammiferi e mock / stub in stile RSpec. AGGIORNAMENTO: Sto ora esaminando OCMock perché, attualmente, Kiwi non supporta lo stubbing di oggetti ponte gratuiti .

Per i test di accettazione, utilizzo UI Automation perché è fantastico. Ti consente di registrare ogni caso di test, rendendo automatici i test di scrittura. Inoltre, Apple lo sviluppa e quindi ha un futuro promettente. Funziona anche sul dispositivo e da Instruments, il che consente altre interessanti funzioni, come la visualizzazione di perdite di memoria. Sfortunatamente, con UI Automation, non so come eseguire il codice Objective-C, ma con Frank e iCuke puoi farlo. Quindi, testerò solo le cose di livello inferiore di Objective-C con unit test, o creerò UIButtons solo per la TESTconfigurazione di build , che quando si fa clic, eseguirà il codice di Objective-C.

Quali soluzioni usi?

domande correlate


1
so almeno alcuni mesi fa che i laboratori cardine utilizzavano il cedro. (um immagino che sia ovvio dato sul loro account github). Con il supporto di un negozio del genere, quella sarebbe la mia scelta.
Jed Schneider,

1
È un buon punto. Ma ancora una volta, Apple suggerirebbe di utilizzare il proprio framework di unit test, non Cedar, no? Quindi, allora è Pivotal vs. Mela. Con quale andare?
ma11hew28,

2
Ho scritto un post confrontando Frank, KIF e UIAutomation che potrebbero interessare i lettori di questa discussione sgleadow.github.com/blog/2011/10/26/…
Stew

Risposte:


53

tl; dr

In Pivotal abbiamo scritto Cedar perché usiamo e amiamo Rspec nei nostri progetti Ruby. Cedar non è destinato a sostituire o competere con OCUnit; ha lo scopo di portare la possibilità di test in stile BDD su Objective C, proprio come Rspec ha aperto la strada ai test in stile BDD in Ruby, ma non ha eliminato Test :: Unit. Scegliere l'uno o l'altro è in gran parte una questione di preferenze di stile.

In alcuni casi abbiamo progettato Cedar per ovviare ad alcune carenze nel modo in cui OCUnit lavora per noi. In particolare, volevamo essere in grado di utilizzare il debugger nei test, eseguire test dalla riga di comando e nelle build degli elementi della configurazione e ottenere utili output di testo dei risultati dei test. Queste cose potrebbero esserti più o meno utili.

Risposta lunga

Decidere tra due framework di test come Cedar e OCUnit (ad esempio) si riduce a due cose: stile preferito e facilità d'uso. Inizierò con lo stile, perché è semplicemente una questione di opinioni e preferenze; la facilità d'uso tende ad essere un insieme di compromessi.

Le considerazioni sullo stile trascendono la tecnologia o il linguaggio che usi. x I test unitari in stile unità sono in circolazione da molto più tempo dei test in stile BDD, ma quest'ultimo ha rapidamente guadagnato popolarità, in gran parte grazie a Rspec.

Il vantaggio principale dei test in stile xUnit è la sua semplicità e ampia adozione (tra gli sviluppatori che scrivono unit test); in quasi tutte le lingue in cui potresti considerare di scrivere il codice è disponibile un framework in stile xUnit.

I framework in stile BDD tendono ad avere due differenze principali rispetto allo stile xUnit: come strutturi il test (o le specifiche) e la sintassi per scrivere le tue asserzioni. Per me, la differenza strutturale è il principale fattore di differenziazione. I test xUnit sono monodimensionali, con un metodo setUp per tutti i test in una determinata classe di test. Le classi che testiamo, tuttavia, non sono monodimensionali; spesso abbiamo bisogno di testare le azioni in diversi contesti, potenzialmente contrastanti. Ad esempio, considera una semplice classe ShoppingCart, con un metodo addItem: (ai fini di questa risposta userò la sintassi dell'Obiettivo C). Il comportamento di questo metodo può variare quando il carrello è vuoto rispetto a quando il carrello contiene altri articoli; può differire se l'utente ha inserito un codice sconto; può differire se l'articolo specificato può ' essere spedito con il metodo di spedizione selezionato; ecc. Poiché queste possibili condizioni si intersecano tra loro, si finisce con un numero geometricamente crescente di possibili contesti; nei test in stile xUnit questo porta spesso a molti metodi con nomi come testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies. La struttura dei framework in stile BDD consente di organizzare queste condizioni individualmente, cosa che trovo semplifica il processo di copertura di tutti i casi, nonché la ricerca, la modifica o l'aggiunta di condizioni individuali. Ad esempio, usando la sintassi di Cedar, il metodo sopra sarebbe simile a questo: nei test in stile xUnit questo porta spesso a molti metodi con nomi come testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies. La struttura dei framework in stile BDD consente di organizzare queste condizioni individualmente, cosa che trovo semplifica il processo di copertura di tutti i casi, nonché la ricerca, la modifica o l'aggiunta di condizioni individuali. Ad esempio, usando la sintassi di Cedar, il metodo sopra sarebbe simile a questo: nei test in stile xUnit questo porta spesso a molti metodi con nomi come testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies. La struttura dei framework in stile BDD consente di organizzare queste condizioni individualmente, cosa che trovo semplifica il processo di copertura di tutti i casi, nonché la ricerca, la modifica o l'aggiunta di condizioni individuali. Ad esempio, usando la sintassi di Cedar, il metodo sopra sarebbe simile a questo:

describe(@"ShoppingCart", ^{
    describe(@"addItem:", ^{
        describe(@"when the cart is empty", ^{
            describe(@"with no discount code", ^{
                describe(@"when the shipping method applies to the item", ^{
                    it(@"should add the item to the cart", ^{
                        ...
                    });

                    it(@"should add the full price of the item to the overall price", ^{
                        ...
                    });
                });

                describe(@"when the shipping method does not apply to the item", ^{
                    ...
                });
            });

            describe(@"with a discount code", ^{
                ...
            });
        });

        describe(@"when the cart contains other items, ^{
            ...
        });
    });
});

In alcuni casi troverai contesti che contengono gli stessi insiemi di asserzioni, che puoi ASCIUGARE usando contesti di esempio condivisi.

La seconda differenza principale tra framework in stile BDD e framework in stile xUnit, sintassi di asserzione (o "matcher"), rende semplicemente più piacevole lo stile delle specifiche; ad alcune persone piace davvero, ad altri no.

Ciò porta alla questione della facilità d'uso. In questo caso, ogni framework ha i suoi pro e contro:

  • OCUnit è in circolazione da molto più tempo di Cedar ed è integrato direttamente in Xcode. Ciò significa che è semplice creare un nuovo target di test e, la maggior parte delle volte, far funzionare i test "funziona". D'altra parte, abbiamo scoperto che in alcuni casi, come l'esecuzione su un dispositivo iOS, far funzionare i test OCUnit era pressoché impossibile. L'impostazione delle specifiche Cedar richiede un po 'più di lavoro rispetto ai test OCUnit, dal momento che hai la libreria e il collegamento da solo (mai un'attività banale in Xcode). Stiamo lavorando per semplificare l'installazione e qualsiasi suggerimento è più che benvenuto.

  • OCUnit esegue i test come parte della build. Ciò significa che non è necessario eseguire un eseguibile per eseguire i test; se qualche test fallisce, la tua build fallisce. Ciò rende il processo di esecuzione dei test un passo più semplice e l'output del test va direttamente nella finestra di output della build che lo rende facile da vedere. Abbiamo scelto di includere le specifiche Cedar in un eseguibile che puoi eseguire separatamente per alcuni motivi:

    • Volevamo essere in grado di utilizzare il debugger. Esegui le specifiche Cedar proprio come faresti con qualsiasi altro eseguibile, quindi puoi utilizzare il debugger allo stesso modo.
    • Volevamo una facile registrazione della console nei test. È possibile utilizzare NSLog () nei test OCUnit, ma l'output passa alla finestra di compilazione in cui è necessario aprire il passaggio di compilazione per poterlo leggere.
    • Volevamo leggere facilmente i rapporti sui test, sia nella riga di comando che in Xcode. I risultati di OCUnit appaiono bene nella finestra di compilazione in Xcode, ma la compilazione dalla riga di comando (o come parte di un processo CI) si traduce in un output di test mescolato a molti altri output di compilazione. Con fasi di costruzione ed esecuzione separate Cedar separa l'output in modo che l'output del test sia facile da trovare. Il runner di prova Cedar predefinito copia lo stile standard di stampa "." per ogni specifica che passa, "F" per specifiche non riuscite, ecc. Cedar ha anche la possibilità di utilizzare oggetti reporter personalizzati, in modo da poter ottenere i risultati di output come preferisci, con un piccolo sforzo.
  • OCUnit è il framework ufficiale di unit test per Objective C ed è supportato da Apple. Apple ha sostanzialmente risorse illimitate, quindi se vogliono qualcosa fatto, lo farà. E, dopo tutto, questo è il sandbox di Apple in cui stiamo giocando. Il rovescio della medaglia, tuttavia, è che Apple riceve nell'ordine di un bajillion richieste di supporto e segnalazioni di bug ogni giorno. Sono straordinariamente bravi a gestirli tutti, ma potrebbero non essere in grado di gestire i problemi segnalati immediatamente o affatto. Cedar è molto più nuovo e meno cotto di OCUnit, ma se hai domande, problemi o suggerimenti invia un messaggio alla mailing list di Cedar (cedar-discuss@googlegroups.com) e faremo il possibile per aiutarti. Inoltre, sentiti libero di rovesciare il codice da Github (github.com/pivotal/cedar) e aggiungere tutto ciò che pensi manchi.

  • L'esecuzione dei test OCUnit su dispositivi iOS può essere difficile. Onestamente, non ho provato questo da un po 'di tempo, quindi potrebbe essere diventato più facile, ma l'ultima volta che ho provato non sono riuscito a far funzionare i test OCUnit per far funzionare qualsiasi funzionalità UIKit. Quando abbiamo scritto Cedar ci siamo assicurati di poter testare il codice dipendente da UIKit sia sul simulatore che sui dispositivi.

Infine, abbiamo scritto Cedar per unit test, il che significa che non è davvero paragonabile a progetti come UISpec. È passato un po 'di tempo da quando ho provato a usare UISpec, ma ho capito che si concentrava principalmente sulla guida programmatica dell'interfaccia utente su un dispositivo iOS. In particolare, abbiamo deciso di non provare a fare in modo che Cedar supporti questo tipo di specifiche, poiché Apple (all'epoca) stava per annunciare UIAutomation.


Grazie per la risposta approfondita. Leggerò il libro RSpec e proverò Ceder. Ho spostato UISpec nella sezione Selenium e ho aggiunto anche UIAutomation. Sto leggendo il tuo post sul blog su UIAutomation. Frank in realtà sembra molto più semplice e leggibile, oltre a essere meglio documentato, quindi sto pensando di iniziare con quello. Spero solo che sia potente come UIAutomation. Dici che UIAutomation può testare i problemi del ciclo di vita. Mi chiedo se anche iCuke possa ...
ma11hew28

8

Dovrò lanciare Frank nel mix di test di accettazione. Questa è un'aggiunta abbastanza nuova, ma finora ha funzionato eccellente per me. Inoltre, in realtà viene lavorato attivamente, a differenza di Icuke e degli altri.


5

Per lo sviluppo guidato dai test, mi piace usare GHUnit , è un gioco da ragazzi da configurare e funziona benissimo anche per il debug.


Grazie. L'ho visto ma ho dimenticato di menzionarlo.
ma11hew28,

PLus 1 per GHUnit. usato molto con OCMock. È semplicissimo da installare, estendere e funziona in modo molto affidabile.
drekka,

4

Ottima lista!

Ho trovato un'altra soluzione interessante per testare l'interfaccia utente di applicazioni iOS.

Zucchini Framework

Si basa su UIAutomation. Il framework consente di scrivere scenari incentrati sullo schermo in stile Cucumber. Gli scenari possono essere eseguiti in Simulator e sul dispositivo da una console (è compatibile con CI).

Le asserzioni sono basate su screenshot. Sembra poco flessibile, ma ti dà un bel rapporto HTML, con un confronto dello schermo evidenziato e puoi fornire maschere che definiscono le regioni in cui vuoi avere un'asserzione esatta dei pixel.

Ogni schermata deve essere descritta CoffeScripte lo strumento stesso è scritto in rubino. È una specie di incubo poliglotta, ma lo strumento fornisce una buona astrazione per UIAutomatione quando gli schermi sono descritti è gestibile anche per la persona addetta al controllo qualità.


! stretto Grazie. Ho aggiunto questo alla domanda sopra.
ma11hew28,

2

Sceglierei iCuke per i test di accettazione e Cedar per i test unitari. UIAutomation è un passo nella giusta direzione per Apple, ma gli strumenti necessitano di un supporto migliore per l'integrazione continua; non è attualmente possibile eseguire automaticamente test UIAutomation con Instruments, ad esempio.


1

GHUnit è buono per i test unitari; per i test di integrazione, ho usato UISpec con un certo successo (github fork qui: https://github.com/drync/UISpec ), ma non vedo l'ora di provare iCuke, dal momento che promette di essere una configurazione leggera e puoi usa i binari per testare la bontà, come RSpec e Cucumber.



0

Mi piace davvero OCDSpec2 ma sono di parte, ho scritto OCDSpec e contribuisco al secondo.

È molto veloce anche su iOS, in parte perché è costruito da zero piuttosto che essere messo sopra OCUnit. Ha anche una sintassi RSpec / Jasmine.

https://github.com/ericmeyer/ocdspec2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.