Тестирование как вынужденная мера

Сказ о том, как я API с помощью тестов латал
Алексей Рево | 5 апреля 2022 г. в 00:23

Появление потребностей

Множество технологических вещей в нашем бренном мире появляется с одной целью - Решить проблему. Тестирование одна из них.

Вопрос: Зачем мне это? Ответ же достаточно простой - Тестирование решает достаточно простую проблему "Как покрыть возможные сценарии, которые поведут за собой проблемы". И тестирование, хоть и не в полной мере, но даёт гарантию безопасности от этих сценариев. Хотя, стоит отметить, что тестирование не панацея от всех проблем как таковое. Тем более, это не решение архитектурных проблем. Но даже так, часть "очевидных" проблем оно решает, или может помочь с их решением.


Наглядный Пример

Допустим, что у нас есть некий сервис, который отдаёт JSON данные по запросу. Наша задача же, заключается в том, чтобы из полученных данных собрать другой формат данных.

Синтаксис: typescript function getData(url: string): IData { const response = database.get(url); return { id: response.id, data: response.data, // Проблемные данные, которые могут иметь разную структуру. } }

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

Вывод напрашивает достаточно простой - Написать какую-то обёртку, которая будет получать неполные данные, и подмешивать заранее заготовленными.

И того, мы имеем: Несколько вариантов данных, и один общий интерфейс для них.

И так, где гарантия того, что мы написали обёртку, которая явно будет выдавать нужные нам данные? Как это проверить? На каком объёме данных вы должны это проверить? Будете ли вы делать это всё вручную?

Вот тут и выходит на сцену тестирование!


Начало решения проблемы

Начинаем постигать тестирование... Для этого возьмём сразу что-то модное и блестящее. Vitest. Ну-c, давайте начнём решать проблему!

Синтаксис: typescript import { describe, test, expect } from 'vitest'; describe('API::getData', () => { const Response = getData('https://AsukaPhotos.neet/api/photos?q=100'); test('getData::photoStruct', () => { expect(Response.length).toBe(100); Response.forEach(photo => { const { title, author } = photo as IPhoto; if ( !title && typeof title !== 'string' ) test.fail(struct.titleError); if ( !author && typeof author !== 'string' ) test.fail(struct.authorError); }); }) })

И так, что мы получили? Мы обратились к воображаемому сервису, попросили 100 фотографий какой-то рисованной девушки, и ожидаем получить JSON в ответ. У него же, в свою очередь, должны быть такие поля "title" и "author". И с помощью нашего простого теста, мы проходимся по нашей коллекции, и пытаемся удостоверится, что у каждой фотографии есть нужные нам поля.

...