SPRING-SOURCE.RU

Важность unit тестов

unit тест это код написанный для тестирования блока кода. Блоком кода может быть класс, пакет или модуль уровня приложения. Иногда, unit тесты пишутся для каждого класса; такой же подход мы будем применять и для PIX системы.

Unit тесты, как правило, организованы в наборы (unit cases). Каждый набор может включать в себя несколько тестов для одного блока кода. Для примера, в PIX системе, блок кода это PixUser POJO. Тестирование этого класса может включать следующее:

В ходе тестирования вы можете запускать весь набор тестов или один тест, по желанию.

Unit тесты очень полезны в любом проекте. Они могут помочь найти локальные неисправности в коде.

Регрессионные тесты

Unit тесты также очень ценны, как регрессионные тесты. Регрессионное тестирование выполняется, когда в существующую систему добавляется, что-то новое.

Вы можете выполнить регрессионное тестирование запуская все unit тесты сразу же после добавления чего-то нового. Это гарантирует, что добавленные в систему какие-то особенности не повлияют негативно на стабильный код.

Работаем с Unit-Testing фреймворком

Мы будем использовать JUnit. JUnit поможет вам в следующем:

Давайте попробуем

  1. Создайте unit тест case используя JUnit для PixUser POJO

                            
    import junit.framework.TestCase;
    public class PixUserTest extends TestCase {
    ...
    		

  2. В каждом тесте вы можете использовать метод setup(). Код в этом методе запускается перед запуском каждого теста. Это хорошее место для расположений общей иницилизации, расположения ресурсов, подготовка кода для теста. Вы также можете указать необязательный метод teardown() для очистки или изменения чего-то уже после теста. Для примера, в PixUser, setup() метод создает для тестирования два экземпляра PixUser в массиве. Вот setup() метод:

                            
    private PixUser [] testUsers;
    public void setUp() throws Exception {
    	super.setUp();
    	testUsers = new PixUser[2];
    	testUsers[0] = new PixUser("joes", "joe", "smoe", 
    	"joes@natat.com", "pass1");
    	
    	testUsers[1] = new PixUser("johnm", "john", "mola", 
    	"johnm@dist.com", "pass2");
    }
    		

  3. Когда используете JUnit 3.x вы можете указать фреймворку что какой-то метод является тестом, указав его как public и начать или закончить словом test. Для примера, метод, который создает тест называется testFields. Вот пример из PixUserTest.java:

                            
    public void testFields() {
    	PixUser testUser = testUsers[0];
    	assert(testUser.getUserName().equals(“joes”));
    	assert(testUser.getFirstName().equals(“joe”));
    	assert(testUser.getLastName().equals(“smoe”));
    	assert(testUser.getEmail().equals(“joes@natat.com”));
    	assert(testUser.getPassword().equals(“pass1”));
    	testUser = testUsers[1];
    	assert(testUser.getUserName().equals(“johnm”));
    	assert(testUser.getFirstName().equals(“john”));
    	assert(testUser.getLastName().equals(“mola”));
    	assert(testUser.getEmail().equals(“johnm@dist.com”));
    	assert(testUser.getPassword().equals(“pass2”));
    }
    		

Как это работает?

Наследуясь от JUnit TestCase, PixUserTest получает полную поддержку в создании тестов. Когда вы запускаете тест, загрузчик теста смотрит setup() метод для запуска его перед тестом. В нашем случае этот метод создает два экземпляра PixUser, каждый из которых имеет свои поля. В методе testFields(), сверяются значение полей.

Запуск Test Cases

У нас часто используется метод assert(). Вы должны запомнить, чтобы включить поддержку assert() и правильно запускать тесты, используйте –ea Java VM аргумент.

Давайте попробуем

Для настройки unit теста и его запуска, следуйте следующим шагам:

  1. Взгляните на весь код PixUserTest.java:

                            
    package com.wrox.beginspring.pix.model;
    
    import java.util.ArrayList;
    import junit.framework.TestCase;
    
    public class PixUserTest extends TestCase {
    	private PixUser[] testUsers;
    
    	public void setUp() throws Exception {
    		super.setUp();
    		testUsers = new PixUser[2];
    		testUsers[0] =
    		new PixUser(“joes”, “joe”, “smoe”,
    		“joes@natat.com”, “pass1” );
    		testUsers[1] =
    		new PixUser(“johnm”, “john”, “mola”,
    		“johnm@dist.com”, “pass2”
    	);
    	}
    
    	public void testFields() {
    		PixUser testUser = testUsers[0];
    		assert(testUser.getUserName().equals(“joes”));
    		assert(testUser.getFirstName().equals(“joe”));
    		assert(testUser.getLastName().equals(“smoe”));
    		assert(testUser.getEmail().equals(“joes@natat.com”));
    		assert(testUser.getPassword().equals(“pass1”));
    		testUser = testUsers[1];
    		assert(testUser.getUserName().equals(“johnm”));
    		assert(testUser.getFirstName().equals(“john”));
    		assert(testUser.getLastName().equals(“mola”));
    		assert(testUser.getEmail().equals(“johnm@dist.com”));
    		assert(testUser.getPassword().equals(“pass2”));
    	}
    
    	public void testEqual() {
    		PixUser newUser = new PixUser(“joes”, “joe”, “smoe”,
    				“joes@natat.com”, “pass1”
    		);
    		assert(newUser.equals(testUsers[0]));
    		newUser = new PixUser(“johnm”, “john”, “mola”,
    		“johnm@dist.com”, “pass2”);
    		assert(newUser.equals(testUsers[1]));
    	}
    
    	public void testAlbums() {
    		Album a1 = new Album(“2008 Trip”);
    		testUsers[0].addAlbum(a1);
    		Album a2 = new Album(“Junkaroo”);
    		Album a3 = new Album(“ScubaDive”);
    		testUsers[1].addAlbum(a2);
    		testUsers[1].addAlbum(a3);
    		// albums can be retreived
    		assert(testUsers[0].getAlbums().size() == 1);
    		assert(testUsers[1].getAlbums().size() == 2);
    		// albums does not affect user identify
    		PixUser newUser = new PixUser(“joes”, “joe”, “smoe”,
    		“joes@natat.com”, “pass1”);
    		newUser.addAlbum(new Album(“Does not match”));
    		assert(newUser.equals(testUsers[0]));
    	}
    }
    		

  2. Для запуска теста используйте Maven 2 mvn команду. Unit тестирование является одной из стандартных фаз Maven 2 жизненного цикла. Команда mvn test выполнит все тесты, поэтому нам нужна команда вида:
    mvn test –Dtest=PixUserTest
    Эта команда запустит только один unit тест. В итоге вы получите приблизительно такой результат:

                            
    -------------------------------------------------------
    T E S T S
    -------------------------------------------------------
    Running com.wrox.beginspring.pix.model.PixUserTest
    Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 sec
    Results :
    Tests run: 3, Failures: 0, Errors: 0, Skipped: 0