5

Nel nostro progetto, abbiamo un sacco di test unitari. Aiutano a mantenere il progetto piuttosto ben collaudato.Come eseguire i test di integrazione?

Oltre a questi, abbiamo una serie di test che sono test unitari ma dipendono da qualche tipo di risorsa esterna. Li chiamiamo test esterni . Ad esempio, a volte possono accedere ai servizi Web.

Mentre i test di unità sono facili da eseguire, i test di integrazione non sono riusciti a passare a volte: ad esempio a causa di un errore di timeout. Inoltre, questi test possono richiedere troppo tempo per essere eseguiti.

Attualmente, manteniamo i test di integrazione/unità esterna solo per eseguirli quando si sviluppa la funzionalità corrispondente.

Per i test di unità semplici, utilizziamo TeamCity per l'integrazione continua.

Come si eseguono i test dell'unità di integrazione e quando li si esegue?

+0

Come probabilmente di questa discussione, guardo come classificare i test di integrazione. E ora quello che posso aggiungere da solo: 1. Verificare che il software comunichi come previsto con il software remoto (è possibile utilizzare modelli di simulazione remota come indicato da S. Lott). 2. Verificare che il servizio remoto funzioni come previsto da noi. – Vladimir

risposta

2

Nel nostro progetto abbiamo una suite separata per test di unità regolari/semplici e suite separate per test di integrazione. Ci sono due ragioni per questo:

  1. prestazioni: i test di integrazione sono molto più lenti,
  2. test di fragilità: i test di integrazione non riescono più spesso a causa di condizioni legate all'ambiente (dare falsi positivi).

Utilizziamo TeamCity come server principale di Integrazione continua e Maven come sistema di generazione. Usiamo il seguente algoritmo per eseguire i test:

  1. Eseguiamo test di unità all'interno di IDE Eclipse e prima di ogni commit.
  2. Abbiamo gestiscono i test di unità automaticamente dopo ogni commit sugli agenti TeamCity usando di Maven mvn clean install
  3. Corriamo test di integrazione automaticamente agente TeamCity dopo "principale" costruzione è stata completata.

Il nostro modo di attivare l'esecuzione dei test di integrazione è configurando di TeamCity compito integration.tests di essere dipendente da "principale" compito continous.build, vedi qui per i dettagli: http://confluence.jetbrains.net/display/TCD4/Dependencies+Triggers

Corriamo solo test di integrazione (esclusi unit test) da:

  • utilizzando directory separata denominata "src/it/java" per mantenere l'integrazione test,
  • esclusi per default questa fonte folde r dalla configurazione di maven-surefire-plugin (configurazione/esclude elemento),
  • utilizzando il profilo Maven chiamato "integrazione" per escludere i test di unità regolari e includere i test da "src/it/java" (questo profilo è configurato passando -Pintegrazione nel task integration.tests).
+0

Questa è la scelta più vicina per me, tranne che sostituiremo alcuni test di integrazione con i test unitari con i prototipi. – Vladimir

1

Eseguiamo tutti i test in un'unica enorme suite. Ci vogliono 7 minuti per correre.

I nostri test di integrazione creano server mock. Non scadono mai, tranne quando il test richiede il timeout del server.

Quindi abbiamo i seguenti tipi di cose. (L'esempio di codice è Python)

class SomeIntegrationTest(unittest.TestCase): 
    def setUp(self): 
     testclient.StartVendorMockServer(18000) # port number 
     self.connection = applicationLibrary.connect('localhost', 18000) 
    def test_should_do_this(self): 
     self.connection.this() 
     self.assert... 
    def tearDown(self): 
     testClient.KillVendorMockServer(18000) 

Questo ha alcune limitazioni - è sempre forking server finto cliente per ogni test. A volte va bene, e a volte è troppo iniziare e fermarsi.

Abbiamo anche i seguenti tipi di cose

class SomeIntegrationTest(unittest.TestCase): 
    def setUp(self): 
     self.connection = applicationLibrary.connect('localhost', 18000) 
    def test_should_do_this(self): 
     self.connection.this() 
     self.assert... 

if __name__ == "__main__": 
    testclient.StartVendorMockServer(18000) # port number 
    result= unittest.TextTestRunner().run() 
    testclient.KillVendorMockServer(18000) 
    system.exit(result.failures + result.errors) 

Per sostenere questo test, abbiamo un numero di server deriso-up per vari tipi di test di integrazione.

+0

Richiede agli sviluppatori di eseguire i test prima del check-in? –

+0

Questo è un buon approccio ai servizi di mock-up in remoto. Penso che non lo facciamo perché a volte è difficile fare il mock-up - o può richiedere del tempo. Anche a volte non so nemmeno come funziona ws remoto. La terza cosa è che a volte è utile verificare che il servizio remoto funzioni correttamente come previsto. Avevamo casi in cui il principale fornitore di servizi aveva problemi che potevano essere rilevati da alcuni test esterni. – Vladimir

+0

@Vladimir: "a volte non so nemmeno come funzioni il telecomando". Falso. Sai cosa invia e ricevi la tua applicazione. Questo è tutto ciò che devi gestire nel Mockup. Niente di più, quel tanto che basta per far passare il test. –

3

Utilizziamo Maven2: maven-surefire-plugin per eseguire test di unità (nella fase di test) e plugin di Maven-failsafe per i test di integrazione (fase di test di integrazione).

Per impostazione predefinita, tutti i test vengono eseguiti quando il progetto viene creato, tuttavia i test di integrazione possono essere disattivati ​​utilizzando i profili.

In molti casi i test di integrazione fanno parte del modulo, in alcuni casi ci sono anche moduli dedicati che eseguono solo test di integrazione.

Uno dei team utilizza anche Fitnesse per i test di accettazione. Questi test sono anche in moduli dedicati.

Utilizziamo Hudson per CI.

+0

Grazie per aver menzionato Fitnesse - ne ho sentito parlare prima. E ora ho appena visto la presentazione - è di Robert Martin. Sembra buono. Cercherò di pensare a come possiamo integrarlo per i nostri scopi! Hai un sacco di test di accettazione in Fitnesse? – Vladimir

+0

La mia squadra - no, l'altra squadra ha fatto un sacco di cose come test di accettazione. – lexicore