@the5x

Какой подход в написании тестов предпочтительнее?

Вижу, что многие в написании тестов в Laravel в основном делятся на две категории. Эти подходы разные. Какой вы используете и какой для вас предпочтительнее и почему?

Примеры не связаны, просто рандом из интернета.

Первый, через создание экземпляра класса и далее доступ к тестируемому методу:
public function testBalanceIsInitiallyZero()
    {
        $ba = new BankAccount;
        $this->assertEquals(0, $ba->getBalance());
    }


Второй вариант, как в документации laravel:
public function testCreateProductWithMiddleware()
        {
                $data = [
                        'name' => "New Product",
                        'description' => "This is a product",
                        'units' => 20,
                        'price' => 10,
                        'image' => "https://images.pexels.com/photos/1000084/pexels-photo-1000084.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940"
                               ];

            $response = $this->json('POST', '/api/products',$data);
            $response->assertStatus(401);
            $response->assertJson(['message' => "Unauthenticated."]);
        }
  • Вопрос задан
  • 148 просмотров
Решения вопроса 2
vabka
@vabka
Токсичный шарпист
Первое - юнит тесты
Второе - интеграционные

По хорошему нужны оба, но интеграционные позволяют отловить больше критичных багов (кмк)
А юниты - позволяют плотно покрыть граничные случаи
Ответ написан
Комментировать
agoalofalife
@agoalofalife
Team Lead
Как написал коллега выше это абсолютно разные тесты.
- Первый пример: это модульный тест или unit. Обычно им тестируют класс и несколько классов когда они в зависимостях. Для примера если в аргументах примитив(число) в тестах можно передать все случаи 0 или даже отрицательные числа. Если у вас подход (DDD) можно протестировать инварианты.
- Функциональные(интеграционные или E2E - end to end) тесты - (в Laravel папка Feature) тестирование черного ящика. Например вы делаете запрос и ожидаете определенного ответа. В laravel это сделано не совсем корректно - так как предлагается в тестах лезть в базу
$this->assertDatabaseHas('users', [
            'email' => 'some@something.com'
        ]);

Функциональное тестирование не про базу, оно о том как приложении работает в целом.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы