Разделы портала

Онлайн-тренинги

.
Первый шаг в приемочное тестирование
09.07.2013 23:10

Автор: Компания SnowHall Ltd

На днях меня поставили на работу над новым проектом. Хотя новым он был только для нашей команды – заказчики отказались от сотрудничества с предыдущей командой, которая разрабатывала его больше года и передали его нам. Вместе с проектом нам достались все радости незавершенного проекта – частично завершенный рабочий код, отсутствие какой-либо сопроводительной документации и ограниченное количество времени на его завершение. Действовать нужно было быстро, но разумно.

У нас уже был опыт тестирования проектов с помощью PHPUnit, поэтому к тестированию мы относились более чем положительно. Но в данном случае, помимо покрытия тестами кода, важно было определить степень завершенности проекта. Да, безусловно, заказчик предоставил нам техническое задание, в котором указал нереализованные модули, но он также сказал добавить недостающую функциональность в уже имеющиеся модули. Поэтому в данном случае сперва нам было необходимо определить, какие модули нуждаются в доработке. На помощь нам пришло Acceptance testing.

Так как времени у нас было относительно немного, то нужна была система для тестирования, несложная в освоении, простая в использовании и по-возможности не требовательная к ресурсам. После беглого обзора существующих систем я выделил следующих кандидатов:

  • Cucumber
  • Fitness
  • Robot
  • Eliza

После сравнения этих фреймворков, я остановил свой выбор на Eliza – легковесном фреймворке, имеющем Web-интерфейс для запуска тестов. Большую роль в выборе этого фреймворка также сыграла поддержка как Acceptance тестов, так и Unit тестов.

Теперь можно было приступать к написанию тестов. Вот пример демонстрационного теста, которые идут с Eliza и позволяют сразу проникнуться основной идеей этого фреймворка:

<?php
// Initialize test
$I = new AcceptanceTest();
// Specify short definition for test
$I->want('Test demo site');
// Go to the page from which to start testing
$I->go('http://snowhall.com');
// Verifying the opening pages by checking the information contained in it
$I->see('Web Development Service');
// Check PHP and SQL errors on the page
$I->checkError();
// Go to link
$I->click('Web Development Service');
// Verifying the opening pages by checking the information contained in it
$I->see('MVC frameworks');

Данный тест заходит на сайт snowhall.com, проверяет наличие определенной информации, переходит по нужной ссылке, а затем опять проверяет отображающуюся информацию. Команды, которые составляют тест говорят сами за себя и являются своего рода перечнем инструкций.

Примером Unit теста я также остался доволен – синтаксис схож с PHPUnit, с которым мы уже имели дело.

<?php
// Include file with test class
require_once DATA_PATH.'SimpleClass.php';
// Define new test class
class SimpleClassTest extends UnitTest
{
function testSetName() {
$class = new SimpleClass();
$class->setName('Ricardo');
$this->assertEquals('Ricardo', $class->getName());
}
function testCheckName() {
$class = new SimpleClass();
$class->setName('Edward');
$this->assertTrue($class->checkName());
}
function testSaveLog() {
$class = new SimpleClass();
$class->saveLog('Log Info');
$this->assertFileExists(DATA_PATH.'unit_test.log');
}
}

За достаточно короткое время мы написали Acceptance тесты, охватывающие весь проект, и это позволило нам определить недостающую функциональность и быстро привести проект в работоспособность и получить поощрение со стороны заказчика.

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

Хотелось бы отметить еще одну полезную функцию, которая не раз нас выручала – запуск тестов по расписанию.

Eliza позволяет гибко настроить время запуска тестов, и мы всегда оповещались о возникающих ошибках в системе раньше, чем заказчик, что позволяло оперативно их исправлять. Он, наверное, до сих пор думает, что мы написали систему без единой ошибки Smile

Что мы имеем в итоге? Проект завершен раньше срока, а мы еще раз убедились в необходимости и важности тестирования.