Тем не менее, есть хорошая новость: incredible machine все-таки может быть полезна. Например, для тестирования программных систем.
Работая над большой ERP-системой OpenPapyrus, которая, в числе прочего, должна уметь выводить изображения штрихкодов разных стандартов и свойств, мы подключили популярную библиотеку zint для рендеринга штрихкодов. Библиотека интегрировалась и заработала. Но тестировать результат все равно надо.
Самым подходящим вариантом для теста будет тестирование посредством обратной функции:
на вход подаются случайные данные, преобразуются функцией , затем к результату применяется функция , обратная к и сравнивается выход с исходными данными. Тестируются сразу две функции с бронебойным доказательством правильности работы (не алгоритмов, конечно, а реализации).
Обратной функцией к рендерингу штрихкода очевидно будет распознавание изображения штрихкода. Сказано — сделано. Взяли еще одну open source библиотеку zbar. Инегрировали — заработала.
Теперь схема тестирования оформилась вполне четко: входные данные это — текстовое представление штрихкода и его стандарт (ean-13, ean-8, upc-a, code-39, qr и т.п.). Это представление преобразуется в изображение, которое тут же распознается и в результате мы получаем, опять же, текстовое представление и стандарт.
Таким образом мы протестировали следующие компоненты:
- Библиотеку zint
- Библиотеку libpng (при выводе и распознавании кода в формате png)
- Библиотеку zlib (она используется libpng и множеством иных подсистем)
- Библиотеку libjpeg (при выводе и распознавании кода в формате jpeg)
- Библиотеку zbar
- Собственную инфраструктуру, которая все это интегрирует и связывает
Нам остался еще один шаг: zint умеет выводить штрихкод в векторном формате svg, однако же zbar своими средствами этот формат не понимает, но у нас есть собственная инфраструктура для чтения и рендеринга svg-изображения. Добавим в нашу схему еще один узелок и включим в тест. Все работает.
Теперь к списку протестированных компонентов можем добавить:
- Модуль чтения svg-файлов и преобразования их во внутренний векторный формат
- Модуль рендеринга векторных изображений
Краткое итого
Описанный тест примечателен тем, что использует значительное число модулей различного назначения, реализованных независимо друг от друга. Еще одним его ценным свойством является преобразование данных между качественно различными формами (текст — векторное изображение — растровое изображение — текст).
И ложка дегтя: такой тест, имея великолепную демонстративность, не является достаточным. Он верифицирует функционал компонентов в весьма узком диапазоне областей определения каждого из них. То есть, рассчитывать на полноту тестирования методом «incredible machine» (интересно, ранее кто-нибудь использовал этот термин в таком контексте?), увы, нельзя. Детальные тесты отдельных функций он не отменяет.
Спасибо за внимание.
Комментарии (10)
aamonster
03.07.2017 13:15Меня, как программиста, подобные сложносочинённые тесты напрягают. Я мечтаю, чтобы тестировщики как можно точнее локализовали ошибку, а тут будешь только знать, что в системе из 50 звеньев что-то пошло не так — и ищи, где...
mayorovp
03.07.2017 14:06Зато у такого теста отличная воспроизводимость — можно любое число раз пройти всю цепочку в отладчике.
aamonster
03.07.2017 14:52Спасибо. Объяснить, что будет с тестировщиком, предложившим подобное? Правильно, он пойдёт воспроизводить баг заново, пока не напишет нормальный тикет.
Итого, ему всё равно придётся делать короткие тесты — т.е. выполнять вдвое больше работы.
Написание подобной цепочки оправдано в одном случае: прога отлажена до упора, новый функционал в неё не вносится — а значит, вероятность поломки минимальна (и можно не делать коротких тестов, пока всё не сломается).
Ну и более-менее приемлем вариант "написать длинный тест и проверять результат на каждом шаге". Он позволяет малой кровью изолировать баг (у кого тестирование организовано на виртуалке — может быть, можно отдать программистам систему в состоянии "сейчас сломается"). Но тут опять же неприятный момент — когда система дорабатывается и её поведение меняется.
mayorovp
03.07.2017 15:06Не надо проверять результат на каждом шаге, пока ничего не сломалось в целом, в этом нет смысла. Вот когда итог не сошелся — тогда можно уже смотреть промежуточные результаты. Первый шаг, на котором произошла ошибка, и станет потом обычным тестом.
GlukKazan
03.07.2017 15:59Серьёзно? У меня не раз бывали случаи, когда одни ошибки маскировали другие.
mayorovp
03.07.2017 16:05Значит, такая ошибка не будет ловиться этим семейством тестов. Печально, конечно — но это просто означает что надо писать разные тесты, а не гонять по кругу один и тот же.
Тем не менее, вероятность появления четной ошибки в такой цепочке довольно низкая — благодаря тому что цепочка составляется из библиотек сторонних производителей (т.е. писавшихся не тем же самым программистом, который писал тестируемую функцию).
LoadRunner
Я тут до КДПВ докопаться хочу. В смысле, до самой схемы.
ТБВ же?1. Камень прилетает в лоб.
2. Автор машины не знает про устройство смыва в бачке — механическая рука опустится вниз, колено не там должно быть.
3. Зачем вентилятор — я не понял. Сдуть тряпочку, которая закрывает обзор кролику?
4. Кролик прыгнет, а не побежит.
5. Хана телевизору при падении подставки для свечи.
6. Так и вижу, как рыбка насаживается на гвоздь.
7. Брызги во все стороны.
8. Интересно посмотреть на реакцию обрызганного кота, который не пытался ловить рыбку в пакетике.
9. Вряд ли усилий хватит для нажатия, но вот сопротивления нажатию хватит для переворачивания.
P. S.
vesper-bot
Вы явно не играли в оригинал The Incredible Machine. Там есть несколько нюансов (с).
LoadRunner
Не, я играл в различные игры подобного жанра. Но в данном случае уж слишком сильно выбивается.
В тех играх, что довелось поиграть — хоть какие-то приличия соблюдались.
И дополнение к пункту 6. Более вероятен прокол — дырочка, а не разрыв оболочки. Вода вытечет, рыбка умрёт.