PHP Profi

Тег #PHPUnit

ТестированиеНе пишите бесполезные unit-тесты

На днях я наткнулся на следующий код в проекте:

class Users
{
    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }
 
    public function getAllUsers()
    {
        $stmt = $this->pdo->prepare('SELECT * FROM users');
        return $stmt->fetchAll();
    }
}

 

И был вот такой тест для проверки этого кода:

class UserTest extends TestCase
{
    public function testGetAllUsers()
    {
        $pdo = m::mock(PDO::class);
        $stmt = m::mock(PDOStatement::class);
         
        $pdo->shouldReceive(‘prepare’)->andReturn($stmt);
        $pdoStmt->shouldReceive(‘fetchAll’)->andReturn($userArray);
 
        $users = new Users($pdo);
        $result = $users->getAllUsers();
         
        $this->assertEquals($userArray, $users);
    }
}

Обратите внимание, что я опустил остальную часть класса User, а также массив пользователей, который возвращается в тесте.

Этот тест на самом деле даёт нам 100%-ое покрытие кода в методе getAllUsers(). Но, к сожалению, для любой практической цели, этот тест полностью бесполезен.

2018-01-19 alek13

ТестированиеЗапуск встроенного PHP веб-сервера из PHPUnit

Иногда в PHP нам нужно написать интеграционные тесты, и иногда для этих интеграционных тестов нужен веб-сервер. Встроенный веб-сервер доступен начиная с PHP 5.4 и для этих целей можно использовать его.

2017-11-24 alek13

ТестированиеPHPUnit для начинающих. Часть 3: Тестовые «двойники» или Mock-объекты

Это третья часть серии "PHPUnit для начинающих". В этом руководстве мы объясним когда и как использовать тестовых "двойников" в тестах.

Когда использовать двойников

Как уже упоминалось в первой части данной серии статей, одной из мощнейших возможностей phpunit являются "двойники" для тестов. Очень часто в нашем коде функция одного класса вызывает функцию другого класса. В этом случае, мы имеем зависимость в этих двух классах. В частности, вызывающий класс имеет зависимость от вызываемого класса. Но как мы уже знаем из первой части, юнит-тест должен тестировать функциональную единицу, в этом случае, он должен проверить только в вызывающую функцию.

2016-04-21 alek13

ТестированиеPHPUnit для начинающих. Часть 2: Data Provider.

Это вторая часть серии "PHPUnit для начинающих". В этом руководстве мы объясним когда и как использовать data provider-ов в наших тестах.

 

Когда нужно использовать data provider

Когда мы пишем какую-то функцию, мы хотим быть уверенными, что она правильно отрабатывает на наборе крайних случаев. То же самое относится и к тестам. Это означает, что нам нужно написать множество разных тестов для одной и той же функции, используя разные наборы входных данных. Представим, что мы хотим протестировать класс Calculator с различными данными. Без data provider-а мы должны были бы описать несколько тестов примерно вот так:

2015-10-12 alek13

ТестированиеPHPUnit для начинающих. Часть 1: Начните использование.

Это первая часть серии "PHPUnit для начинающих". В этом руководстве мы объясним для чего покрывать код unit-тестами и всю мощь инструмента PHPUnit. В конце мы напишем простой тест с использованием PHPUnit.

Типы тестов

Прежде чем мы погрузимся в PHPUnit давайте разберём различные типы тестов. В зависимости от того, как вы хотите категоризировать их, в PHPUnit применяются любые типы тестов для разработки ПО.

Давайте разделим тесты на категории по уровню их специфичности. По данным Википедии. В целом существует 4 признанных уровня тестов:

  • Unit-тестирование (модульное): этот уровень тестирует наименьшую единицу функциональности.
2015-05-29 alek13