Testing Philosophy

TDD

BDD
ATDD
Unit Tests
Functional Tests
Acceptance Tests

White Box vs Black Box
Unit Tests / Модульные Тесты
Arrange - подготовка
Act - выполнение
Assert - проверка
Integration Tests / Интеграционные Тесты
-
Acceptance
-
Functional
-
Unit
Пример
class КалькулятораТест {
умножениеНаНольДолжноВернутьНоль() {
// Калькулятор, который тестируется
калькулятор = new Калькулятор();
// проверки
сравнитьРавенство(
0,
калькулятор.умножить(10, 0),
"10 x 0 должно вернтуть 0"
);
сравнитьРавенство(
0,
калькулятор.умножить(0, 10),
"0 x 10 должно вернтуть 0"
);
}
}GWT
-
Given - начальное состояние системы
-
When - действия пользователя
-
Then - результат
Functional Tests / Функциональные Тесты
<?php
$I->amOnPage('/');
$I->click('Login');
$I->fillField('Username', 'Miles');
$I->fillField('Password', 'Davis');
$I->click('Enter');
$I->see('Hello, Miles', 'h1');
Acceptance Tests / Приемочные Тесты
Feature: Базовая Арифметика
Background: Калькулятор
Дан калькулятор, который я только что включил
Scenario: Сложение
Когда я складываю 4 и 5
Тогда результат 9
Scenario: Еще одно сложение
Когда я складываю 4 и 7
Тогда результат 11Integration Tests / Интеграционные Тесты
-
Acceptance
-
Functional
-
Unit
ATDD
BDD
TDD
=
Methodology
TDD

Тест падает
Тест проходит
Рефакторим
BDD
Спецификация
Разработка
Коммуникация
ATDD
Разработка Тестов
Разработка
Спецификация
BDD vs ATDD
T это ключ
Acceptance
Functional
Integration
Unit

Не Писать Тесты


Не можем мы
их продать!!!!!
Писать Тесты

class Пользователь расширяет ActiveRecord {
имя;
фамилия;
}
class ПользователяТест {
@Test
сохранитьПользователя() {
пользователь = new Пользователь();
пользователь.имя = "Иван";
пользователь.фамилия = "Иванов";
сравнитьИстинность(
пользователь.сохранить(),
"пользователь должен сохраниться"
);
}
}Псевдокод
class Пользователь extends ActiveRecord {
имя;
фамилия;
статус;
являетсяЛиАктивным() {
вернуть статус == 1;
}
}
class ПользователяТест {
@Test
сохранитьПользователя() {
пользователь = Пользователь.найтиПоНомеру(1);
сравнитьИстинность(
пользователь.являетсяЛиАктивным(),
"пользователь должен быть активным"
);
}
}Писать Избыточные Тесты
Писать "Для Галочки"

Насяльника
Я сделаль!
тестироватьСделать() {
модель = new Пользователь();
сравнитьИстинность(модель.сделать());
сравнитьЛожь(модель.сделать());
}Псевдокод
Писать Тесты "Для Себя"

Отсутствие Информативности
public function testSaveLoad()
{
static::$time = static::$filemtime = \time();
$this->prepareData();
$items = $this->auth->items;
$children = $this->auth->children;
$assignments = $this->auth->assignments;
$rules = $this->auth->rules;
$this->auth->save();
$this->auth = $this->createManager();
$this->auth->load();
$this->assertEquals($items, $this->auth->items);
$this->assertEquals($children, $this->auth->children);
$this->assertEquals($assignments, $this->auth->assignments);
$this->assertEquals($rules, $this->auth->rules);
}

При Ошибке Нас Обрадуют Сообщения
Вопросы?
Testing Philosophy
By Dima Kolodko
Testing Philosophy
- 237