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
    Тогда результат 11

Integration 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