Pagine    Articoli    Prodotti    Forum    Cerca  
Nickname

Password


Non sei registrato?
Registrati a GPI qui!

Puoi anche attivare un vecchio utente GPI e chiedere una nuova password.
I Team

Mappa Team
I nostri utenti

Mappa Utenti
  Unity Unit Test
Pubblicato da Dario Oliveri il 2014-03-28 23:19:50

 

Per prima cosa scaricate gli "Unity Test Tools" dall'asset store e createvi un folder "Editor/Tests"  oppure "Tests/Editor" dove tenere tutti i test a separati dal resto progetto (si può organizzare come si vuole i folders, ma se si tengono i test a parte è meglio per evitare confusione):

 

 

Unity Test Tools, sfrutta le funzionalità dell'Editor, per questo motivo bisogna essere posizionati dentro ad un folder "Editor".

 

Per prendere confidenza con i Test tools lanciate gli esempi:

 

 

FUNZIONAMENTO:

Quando si sviluppa codice, è buona norma controllare che funzioni (sembrerà banale, ma tant'è): non è strettamente necessario controllare ogni singola funzione, ma controllare unità logiche è comunque molto utile e anche le singole funzioni se possibile andrebbero controllate.

 

 

1) Il test serve anche da esempio di funzionamento, è uno snippet di codice abbastanza semplice che fa vedere un possibile utilizzo della funzione da testare

2) Se inavvertitamente cercando di riparare un bug succede che cambi una funzione che non doveva essere cambiata, il test automatico ti avverte che hai fatto un cambiamento che non doveva essere fatto (indirettamente, pochi secondi dopo verrai avvertito che il test su quella funzione è fallito)

 

E' molto difficile spararsi nei piedi, perchè mano a mano che evolve il codice si viene avvisati delle piccole cose che potrebbero restare inosservate a lungo.

 

Controllo semplice, su singole funzioni:

 

Per il controllo su singole funzioni, non è nemmeno necessario creare una scena apposta, vi basterà creare una classe (potete metterla dentro un namespace giusto per evitare grattacapi) e taggare come "Test" le funzioni che volete siano chiamate..

 

using System;
using NUnit.Framework;

namespace UnityTest
{
	internal class MyTestCollection1 // nome poco significativo, organizzateli bene i test! :D
	{
		// Le funzioni taggate come "Test" vengono chiamate in automatico da Unity Test Tools
		[Test]
		public void TestaFunzioneDammiPizze() //test vero e proprio
		{
			if(DammiPizze()) //funzione da "testare"
				Assert.Pass(); //test passato
			else
				throw new Exception ("Non ci sono più pizze"); //test non passato
		}
	}
}

 

Controllo complesso, componenti che interagiscono

 

Per test più complessi invece potete usare scene intere e inoltre potrete far mettere unity in pausa esattamente al frame in cui si è verificato un errore in modo da esaminare con calma le variabili senza dover "azzeccare il momento esatto"

 

 

Anche qui tutte le scene che contengono oggetti con "componenti di test" verranno lanciate in automatico, sarà addirittura possibile lanciare più tests in una scena (verranno attivati di volta in volta i relativi gameobjects). Ovviamente un test di questo tipo richiede più tempo perchè in genere si tratta di tests che devono "funzionare per un certo periodo di tempo"

 

Unity è molto comodo da questo punto di vista, permette di creare GameObjects che funzionano da "Folder" (come se fossero una scena separata) grazie al "TestComponent", in questo modo è possibile inserire più tests all'interno di una singola scena.

 

Cosa non è possibile testare (test che non è possibile riprodurre in modo univoco):

 

- Input dell'utente (in realtà questo si potrebbe, ma si verrebbe limitati a particolari risoluzioni e piattaforme): é molto meglio cercare di separare il più possibile la logica dall'input invece, in modo che almeno la logica possa essere testata.

- Interazioni fisiche complesse : PhysX non è un motore fisico deterministico: su piattaforme diverse la stessa collisione potrebbe avvenire in maniera differente

- Differenti risoluzioni dello schermo

- Bug riproducibili solo su alcune configurazioni della stessa piattaforma.

 

Cosa è possibile testare:

 

- Singole funzioni

- Logica del gioco

- Verificare eventi

- Asserzioni su gruppi di gameobjects

- Mocks & substitutes

 

Inoltre il fatto di avere a portata di mano "tutti i test con un click" è molto comodo perchè permette di iterare rapidamente il proprio gioco e riparare eventuali effetti collaterali immediatamente.

 

Alcune note su NUnit

 

[Test]
[ExpectedException (typeof (ArgumentException), ExpectedMessage = "blablabla")]
// non importa cosa mettete dentro a "ExpectedMessage" il test avrà comunque successo
// Occhio!
public void ExpectedExceptionTest ()
{
	throw new ArgumentException ("expected message");
	
}

 

 

 

ATTENZIONE, POTRESTE DOVER DEBUGGARE ANCHE I TEST.

 

Non è garantito che Unity Test Tools, mantenga le invarianti delle classi di test.

 

 

Per ogni funzione con il tag [Test] NON viene creato un nuovo oggetto

using UnityEngine;
using System.Collections;
using NUnit.Framework;

namespace UnitTest{
	
	internal class MyTest{
		
		[Datapoint]
		public float a = 5.0f;
		
		[Test]
		public void test1(){
			a=3f;
			Assert.Pass ();
		}
		
		
		[Test]
		public void test2(){
			if(a==3f)
				Assert.Fail(); // OUCH!!!!!!!!!!

			Assert.Pass ();
		}
		
	}
}

Fino a quando il test vi fallisce per questo motivo, non è un problema, perchè potete indagare.. Il problema è quando il test ha "successo" ma per sbaglio, allora sono cavoli amari :D

 

Per evitare problemi, le classi di test fatele con tutti i membri ReadOnly.

 

Molto meglio:

 

using UnityEngine;
using System.Collections;
using NUnit.Framework;

namespace UnitTest{
	
	internal class MyTest{
		
		[Datapoint]
		readonly public float a = 5.0f; //readonly => niente modifiche accidentali
		
		[Test]
		public void test1(){
			a=3f;    //errore di compilazione
			Assert.Pass ();
		}
		
		
		[Test]
		public void test2(){
			if(a==3f)
				Assert.Fail();  

			Assert.Pass (); // YEAH!
		}
	}
}

 

 

 

Per chiarimenti / richieste di approfondimenti /critiche lasciate pure un commento :).

 

Campagne crowfunding

Just One Line
Siamo presenti su

     
Copyright ©2016 - Manifesto - Privacy - Termini di Servizio - Community - Collaboratori - Contattaci