Все, що вам потрібно знати про формати звітів у тестуванні З

Щоразу, коли я зустрічаюся з проектом, в якому без причини винайшли свій новий формат звітів мені хочеться зробити щось ще для популяризації існуючих форматів. Останнім часом таких випадків було декілька. У перший раз я додав підтримку підсвічування синтаксису TAP в бібліотеку highlight.js потім додав підтримку синтаксису формату SubUnit. Ну і в останній раз після зустрічі з одним із таких проектів я зібрав воєдино всю інформацію з цих форматів в одному місці і вийшла невелика книжка. Таким чином, цей текст — мій хрестовий похід проти разножопицы з тестовими результатами в розробці :)

У наш час ні один серйозний програмний проект не обходиться без тестування. Тестування може бути ручне та автоматизоване, компонентне і системне, регулярне і не дуже, але воно повинно бути. А якщо регулярне тестування, то разом з ним з'являються звіти про результати тестування. І чим більше проект, тим більше у вас даних про проведеному тестуванні. У сучасних проектах темп розробки ПО настільки високий, що деякі продукти встигають релизиться кілька разів на тиждень, а дехто й кілька разів в день. При правильному підході звіти про тестування можуть принести багато користі при розробці. З цієї статті ви дізнаєтеся, яка користь від звітів про результати тестування, які формати звітів існують і як навести порядок із зберіганням і аналізом таких звітів у вашому проекті.

Більше про цю тему, а також інших питаннях, пов'язаних з тестуванням, читайте в моєму блозі .

Навіщо взагалі потрібні звіти?

У яких випадках вам може знадобитися зберігання звіту про виконане тестування:

До того ж дані про тестування можна використовувати для постійного поліпшення самого тестування.

Огляд існуючих форматів

Найчастіше розробники навіть не замислюються про те, в якому форматі тести зберігають звіти. Якщо це прості тести, то досить виведення в форматі PASS/FAIL. Якщо це функціональні тести, то такої інформації стає недостатньо, тому що потрібно зберігати логи, таймінги і інші дані про виконання тесту. Добре, якщо використовується тестовий фреймворк, в якому є підтримка одного з поширених форматів. А якщо ні, то в світі з'являється ще один форматдля зберігання результатів тестування.

Завдяки винахідливості інженерів у світі розробки існує безліч форматів звітів. Але одні набули більшого поширення, ніж інші. Всі формати можна поділити на дві категорії:

  1. закриті формати, винайдені компаніями для своїх комерційних продуктів;
  2. відкриті формати.

Це може здатися дивним, але відкритість посприяла поширенню форматів з другої категорії. Як це вийшло з'ясувати? Я проаналізував півсотні найбільш поширених відкритих проектів і отримав наступні дані: 24 проекту зберігають тестові результати і ці дані доступні публічно, половина проектів якщо і використовує якийсь формат для тестових звітів, то це один з трьох форматів: TAP , JUnit і SubUnit.

Формат Кількість проектів
TAP 19
JUnit 8
SubUnit 3
Власний 29

А що з популярністю цих форматів в комерційних проектах? опитування про використання форматів тестових даних у розробці комерційного ПЗ (36 голосів):

Взагалі в природі крім форматів TAP, JUnit, SubUnit існують і інші формати, але я їх не буду тут розглядати і наведу список тільки в якості інформаційної довідки: DejaGnu , Selenium, TAPOUT , Microsoft Test, HP QuickTest Professional, IBM Rational Functional Tester, Gallio Test Report, Parasoft C/C++test, Ranorex, TestRail .

Тепер докладніше про кожен з трьох форматів.

Test Anything Protocol (TAP)

Самий старий формат для представлення результатів тестування. По суті lingua franca для тестування. Формат був створений для тестування першої версії інтерпретатора Perl в 1987 році. Пізніше Tim Bunce і Andreas K?nig написали модуль Test::Harness , що дозволило використовувати формат для тестування модулів Perl. Зараз формат має підтримку не тільки в Perl, але і в інших мовах програмування і фреймворках для тестування . У 2008 році на конференції YAPC::Europe була зроблена спроба розробити IETF стандарт для TAP, але ця спроба не увінчалася успіхом. Але є текстовий опис формату на сайті testanything.org , а модулі TAP::Spec::Parser і TAP::Parser::Grammar вважаються референсною реалізацією TAP.

Приклад виведення результатів тесту у форматі TAP:

# Hardware architecture: x86_64
# Timestamp: 2016-06-16 06:23 (GMT+1)
# 
TAP version 13
1..258
ok 1 - zdtm/static/conntracks # SKIP manual only run
ok 2 - zdtm/static/maps03 # SKIP manual only run
ok 3 - zdtm/static/mlock_setuid
ok 4 - zdtm/static/groups
ok 5 - zdtm/static/maps05
ok 6 - zdtm/static/pdeath_sig
ok 7 - zdtm/static/xids00
ok 8 - zdtm/static/proc-self
ok 9 - zdtm/static/file_fown
ok 10 - zdtm/static/eventfs00
ok 11 - zdtm/static/uptime_grow # SKIP manual only run
ok 12 - zdtm/static/signalfd00
ok 13 - zdtm/static/inotify_irmap
ok 14 - zdtm/static/fanotify00
ok 15 - zdtm/static/session00
ok 16 - zdtm/static/rlimits00
ok 17 - zdtm/static/maps04
ok 18 - zdtm/static/pty03
ok 19 - zdtm/static/pty02
...

Приклад звіту з додатковими полями:

1..1
 not ok 1 Wrong length 
---
 wanted: 5
 found: 4
 time: 2011-02-01 00:09:01-07
 extensions: 
 files: 
1.txt:
 name: 1.txt 
 file-type: text/plain 
 file-size: 43 
 content: c2FtcGxl ...

SubUnit

SubUnit є потоковим форматом. Спочатку був розроблений в 2005 році Робертом Коллинсом для юніт-тестування. Для SubUnit доступні утиліти для аналізу результатів (subunit-stats, subunit-ls і т. д. ) та бібліотеки для Python, C, C++ і Shell. Формат активно використовується в тестуванні компонентів проекту OpenStack, Linux дистрибутива Ubuntu і Samba. Є дві версії формату: перша версія зберігає результати в текстовому поданні, друга — в двійковому. Для обох версій доступна детальна специфікація формату .

Приклад виведення результатів тесту у форматі SubUnit:

 time: 2011-05-23 22:49:38.856075 Z
 test: mytest.SampleTestCase.runTest 
 failure: mytest.SampleTestCase.runTest 
 [ 
 Traceback (most recent call last): File "/media/windows/dev/java/qaworkspace/pythonnosetests/src/mytest.py", line
 11, in runTest self.assertEqual(len(s), 4, 'Wrong length') AssertionError: Wrong length 
 ] 
 time: 2011-05-2322:49:38.858163 Z

JUnit

xUnit — це збірна назва сімейства фреймворків для модульного тестування, структура і функціональність яких заснована на SUnit, що призначався для мови програмування Smalltalk. SUnit , розроблений Кентом Беком в 1998 році, отримав широку популярність і був адаптований для безлічі інших мов. Назви фреймворків цього сімейства утворені аналогічно «SUnit», зазвичай замінюється буква «S» на першу букву (або) у назві передбачуваного мови («JUnit» для Java, «NUnit» для програмної платформи .NET і т. д.). Незважаючи на спільні корені, формати для всіх фреймворків засновані на XML, але структура може відрізнятися (див. xunit-plugin ).

Приклад виведення результатів тесту у форматі JUnit:

<testsuites>
 <testsuite time="0.239100933074951"
failures="10"
name="access_t"
tests="14"
errors="1">
 <testcase name="(init)" time="0.180249929428101" />
 <testcase time="0.00193119049072266" name="1 - inet allow all">
 <failure type="TestFailed"
 message="not ok 1 - inet allow all"><![CDATA[not ok 1 - inet allow all]]></failure>
</testcase>
 <testcase name="2 - inet allow unix" time="0.00225496292114258">
 <failure type="TestFailed"
 message="not ok 2 - inet allow unix"><![CDATA[not ok 2 - inet allow unix]]></failure>
</testcase>
 <testcase time="0.00211286544799805" name="3 - inet deny all"></testcase>
 <testcase name="4 - inet deny unix" time="0.00119209289550781">
 <failure type="TestFailed"
 message="not ok 4 - inet deny unix"><![CDATA[not ok 4 - inet deny unix]]></failure>
</testcase>

Плюси і мінуси різних форматів

Незважаючи на те, що всі три формату створювалися для однієї мети — юніт-тестування, вони мають відмінності. У таблиці нижче проводиться порівняння цих форматів.

Параметр TAP SubUnit JUnit
Человекочитаемый формат Так v1 — так, v2 — немає Так?
Незалежність від мови програмування Так Так Ні (незважаючи на те, що формати тестових звітів усіх фреймворків JUnit схожі один на одного, ці формати мають відмінності)
Підтримувані мови програмування Perl, Python, PHP, Java, C, C++, C#, Lua, Shell, Ruby, Javascript, Pascal, PostgreSQL, Haskell, Lisp, Forth та інші Python, C/C++, Shell Java, .NET, C/C++, Fortran, Haskell, Perl, PHP, Python, Ruby
Початок використання 1988 2006 1994 ?
Можливість групування тестів за категоріями або тегами Немає (в стані обговорення) Так Так
Можливість розширення Так, є можливість додати YAML в звіт Ні? Ні?
Документація Специфікація 13-ї версії Кілька прикладів використання Немає
Опис специфікації Є референсна реалізація формату в Perl модулі Test::Harness , також була спроба розробити IETF стандарт для формату TAP Опис обох версій формату є в Python Package Index Офіційного опису стандарту не існує, але є XML схема для JUnit
Поле з часом виконання тесту Так, у YAML Так Так
Підтримка розширених статусів тестів Немає Немає Ні?
Можливість прикріплення файлів до тестових звітів Так, файли закодовані в Base64, можна додавати в YAML Так, можна додавати файли, закодовані в Base64 Так?

Однозначно можна сказати, що навіть якщо у вас зараз не стоїть мета аналізу результатів та розподілу ролей в розробці, то має сенс не винаходити колесо і використовувати існуючі формати для звітів. В більшості випадків їх більш ніж достатньо, а підтримка кожного з них є у всіх популярних мовах програмування і додавання їх підтримки не потребує багато часу. Тим, кому потрібен аналіз результатів і в чиїх проекти поділяються ролі, пропоную перейти до наступній частині статті.

Інструменти для зберігання та аналізу результатів у тестуванні З

Найчастіше тестування вбудовують в процес розробки за допомогою інструментів безперервної інтеграції (Jenkins CI, BuildBot, Travis CI, Teamcity і т. д.) і їх використовують для аналізу результатів. Мій досвід показує, що окремі сервіси зберігання та аналізу результатів з можливістю інтеграції з системами CI зручніше, ніж плагін в одній з них. Інші досвідчені тестувальники . Хоча я розумію, що ці два випадки не показові :)

У таблиці перераховані системи для аналізу звітів про тестування в одному з трьох стандартних форматів.

Інструмент Користувачі Коментар
Subunit2SQL OpenStack Формат: SubUnit. Відео , слайди , Using SubUnit2SQL with the gate
Badger 2ГІС Формати: JUnit. Відео: CodeFest , SQAdays
Allure Яндекс та інші Формати: JUnit. Розширення для Jenkins CI.
Tapper Амазон Формат: TAP (Test Anything Protocol). Розробка припинена.
Jenkins: Test Results Analyzer Plugin ? Формати: JUnit, TAP (Test Anything Protocol). Розширення для Jenkins CI.
testrepository ? Формати: SubUnit.

Корисні посилання

  1. Список тестових фреймворків з підтримкою xUnit і TAP
  2. «Because of TAP's simplicity, it can function as a lingua franca for testing»
  3. Підтримка TAP у мовах програмування
  4. Історія формату Test Protocol Anything
  5. XML vs TAP
  6. Історія формату xUnit
  7. Обговорення на StackOverflow специфікації формату XML JUnit
  8. SubUnit vs JUnit
  9. Software Engineering Radio Episode 167: The History of JUnit and the Future of Testing with Kent Beck
  10. Випуск 19 подкасту «Python Testing» — Python unittest with Robert Collins
  11. What We Learned about Continuous Integration from Analyzing 2+ Million Travis Builds
  12. «Першу версію JUnit в літаку під час перельоту з Цюріха в Атланту в 1997 році»


Список бібліотек та інструментів з підсвічуванням синтаксису стандартних тестових форматів:

Опубліковано: 19/06/17 @ 10:02
Розділ Блоги

Рекомендуємо:

Кейс Kwork – сэкономил 1800 руб. и получил 25 ТИЦастых ссылок
Как заставить контент работать эффективнее для увеличения поискового трафика
Как за 1.5 месяца сделать 1027500 рублей на трафике по бизнес-планам
Как победить Баден-Баден: ответы на часто задаваемые вопросы
Как повысить кликабельность сайта - Headline Optimizer