Форматы тестовых результатов

Каждый более-менее серьёзный тест после завершения тестирования оставляет после себя тестовые результаты. Если тест простой, то достаточно бинарного результата 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

Теги: softwareopensourcetestingfeed