Форматы тестовых результатов
Каждый более-менее серьёзный тест после завершения тестирования оставляет после себя тестовые результаты. Если тест простой, то достаточно бинарного результата PASS или FAIL и 0 или 1. Мы такие тесты рассматривать не будем. Если планируется выпуск более одной версии тестируемого проекта или программы, то обычно тестовые результаты выгружаются на какой-то тестовый портал для последующего анализа покрытия тестами, оценки деградации в качестве продукта и т.д.
О том, в каком виде тест может оставлять после себя тестовые результаты я и расскажу сегодня.
Почему-то так сложилось, что в этой области нет общепринятых стандартов, но есть два стандарта де-факто: это Test Anything Protocol (TAP) и формат SubUnit. И каждый из них по своему хорош.
TAP (Test Anything Protocol)
Формат был создан для первой версии интерпретатора языка Perl,
выпущенного в 1987 году. В первой версии TAP было только два статуса
ok
и not ok
и возможность указания количества тестов 1...N
.
Позднее формат расширили другими статусами, директивами и добавили возможность
использования YAML и др.
Формат и сейчас активно используется в Perl сообществе и вдобавок распространился на другие языки и инструменты. Практически каждый более-менее распространённый язык программирования или имеет поддержку TAP или модуль для его поддержки: C/C++, Javasript, Perl, Ruby. Полный список есть на сайте, посвящённому этому формату.
В данный момент существует спецификация 13-й версии формата, которую планировалось сделать IETF стандартом, но обсуждение дальше черновика стандарта не продвинулось. Поэтому этот формат так и остался стандартом де-факто, а не де-юре.
Пример вывода результат в формате TAP:
1..4
ok 1 - Input file opened
not ok 2 - First line of the input valid
ok 3 - Read the rest of the file
not ok 4 - Summarized correctly # TODO Not written yet
В объяснениях он не нуждается, всё понятно без лишних слов. За это его и любят.
SubUnit
Subunit - это поточный протокол для тестовых результатов.
Задачи, успешно решаемые с помощью SubUnit:
- Объединение тестов: тесты, выполняемые отдельно могут быть объединены, а затем вместе. То есть например тесты на разных языках могут быть представлены одним результатом и тесты, запущенные на нескольких машинах могут быть объединены в единый поток через мультиплексор.
- Архивирование тестов: тестовый прогон может быть записан и воспроизводен позднее.
- Изоляция тестов: тесты, которые могут завесить или иначе плохо взаимодействуют друг с другие могут работать отдельно, а затем объединяются, не мешая друг с другу.
Полная спецификация формата есть в описании Python модуля.
Пример вывода в формат SubUnit:
progress: 199
time: 2009-12-11 05:26:37.231080Z
test: bzrlib.tests.blackbox.test_selftest.TestOptions.test_list_only
time: 2009-12-11 05:26:37.276842Z
successful: bzrlib.tests.blackbox.test_selftest.TestOptions.test_list_only
time: 2009-12-11 05:26:37.276968Z
time: 2009-12-11 05:26:37.277053Z
test: bzrlib.tests.blackbox.test_selftest.TestOptions.test_load_list
time: 2009-12-11 05:26:37.305941Z
successful: bzrlib.tests.blackbox.test_selftest.TestOptions.test_load_list
time: 2009-12-11 05:26:37.306137Z
time: 2009-12-11 05:26:37.306262Z
test: bzrlib.tests.blackbox.test_selftest.TestOptions.test_lsprof_tests
time: 2009-12-11 05:26:37.315990Z
successful: bzrlib.tests.blackbox.test_selftest.TestOptions.test_lsprof_tests
time: 2009-12-11 05:26:37.316157Z
time: 2009-12-11 05:26:37.316277Z
Таблица сравнения двух форматов:
TAP | SubUnit | |
---|---|---|
Понятный для человека формат | Да | Да |
Независимость от языка программирования | Да | Да |
Поддержка языков программирования | Perl, Python, PHP, Java, C, C++, C#, Lua, Shell, Ruby, Javascript, Pascal, PostgreSQL, Haskell, Lisp, Forth | Python, C, C++ and Shell |
Год начала применения | 1988 | 2006 |
Возможность группировки тестов по категориям | В стадии обсуждения | Да |
Расширяемость | Да, с помощью YAML | N/A? |
Документация | Хорошая, но немного устаревшая | Хорошая |
Примеры проектов, использующих формат | CPAN | Samba, Ubuntu |
Спецификация формата | черновик IETF стандарта | Описание формата в Python Package Index |
Возможность добавлять время выполнения теста | Да, с помощью YAML | Да |
Возможность добавления новых статусов результатов тестов | Нет | Нет |
Возможность прикрепить файл к тестовым результатам | Да, Base64 в YAML | Да, Base64 |
Разрабатывая новые тесты вы можете выводить результаты в каком-то своём формате, но, как и в случае с любыми стандартами, если вы хотите интероперабельности, то лучше использовать стандартные форматы и не выдумывать что-то новое :)
Fin