Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Полезное 
покрытие Java 
кода 
Александр (Шура) Ильин 
JDK Test Architect 
JDK SQE team
Safe Harbor Statement 
The following is intended to outline our general product directon. It is 
intended for informaton p...
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 3 
Contnuous integraton process 
Кодирование Запуск тес...
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 
Покрытие кода 
● Информация о том, какой исходный код ...
чаще всего ... 
где ... 
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 
Покрытие кода 
● Информация о...
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 6 
Contnuous integraton process 
Кодирование Запуск тес...
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 7 
JCov. Демо.
JCov (жи-ков) 
• JCov – инструмент для получения и анализа исходного 
кода Java 
• Используется для JCK 
• Используется дл...
История 
• 1996: Прототип 
• 1997: Интеграция с JDK 1.1 
• 1998: Начало использрвания “в поле” 
• JDK 1.2 
• … 
• JDK 7 
•...
Дима Фазуненко 
Copyright © 2014, Oracle and/or its afliates. All rights reserved.10 
JCov development 
Алексей 
Федорченк...
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 
Приложили руку ... 
1.5 инженера, в среднем :) 
Леонид...
Тестовое покрытие OpenJDK. 
Не просто – очень просто! 
• Темплэйт 
java -jar jcov.jar TmplGen -t template.xml rt.jar 
• За...
Copyright © 2014, Oracle and/or its afliates. All rights reserved.13 
Принципы работы JCov 
• Инструментация байткода Java...
Возможности JCov 
• Покрытие по блокам, строкам, веткам и методам 
• Динамическая или статическая инструментация 
• Сохран...
Динамическая/статическая инструментация 
• Статическая инструментация 
● Тестируемый продукт подготавливается 
Copyright ©...
Динамическая/статическая инструментация 
Динамическая Статическая 
Copyright © 2014, Oracle and/or its afliates. All right...
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 
Данные в файл или на граббер 
• Файл 
● Файл специфици...
Какой способ использовать 
• Выбрать между динамическим и статическим 
тестированием 
• Файл 
–Один для всех тестов – увел...
Индивидуальное тестовое покрытие 
• Какими тестами покрыт тот или иной код 
• Ограничение набора тестов 
Copyright © 2014,...
Индивидуальное тестовое покрытие. Демо. 
Copyright © 2014, Oracle and/or its afliates. All rights reserved.
Покрытие публичного программного интерфейса 
• “Набор методов предназначенных для прямого 
использования пользователями би...
Покрытие публичного программного 
интерфейса. Демо 
Copyright © 2014, Oracle and/or its afliates. All rights reserved.
Замыкание публичного программного интерфейса 
ArrayList.java 
Copyright © 2014, Oracle and/or its afliates. All rights res...
Покрытие абстрактного программного интерфейса 
Демо 
“Хороший ЭйПиАй – абстрактный ЭйПиАй” (c) кто-то 
Copyright © 2014, O...
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 
Покрытие полей. Демо
Прямое покрытие 
• Только методы использованные напрямую из тестов. 
• “Честное” покрытие 
Copyright © 2014, Oracle and/or...
Copyright © 2014, Oracle and/or its afliates. All rights reserved. 
There is more. 
Exec Executes a command collecting cov...
There is more. TmplGen 
Verbosity: -verbose 
Template specification: -template(t) 'string value' 
Type of template: -type ...
There is more. Instr 
Output: -instr.output(output, o) 'string value' 
Verbose mode: -verbose 
Type of template: -type [al...
There is more. Merger. 
Output file: -merger.output(output, o) 'string value' 
File to read jcov input files from: -fileli...
Contnuous integraton process с покрытием 
кода 
Кодирование Запуск тестов Молодцы :) 
Copyright © 2014, Oracle and/or its ...
Copyright © 2014, Oracle and/or its afliates. All rights reserved.32 
покрытие 
Не слишком полезное 
• Видимость деятельно...
Contnuous integraton process с покрытием 
кода 
Кодирование Запуск тестов Молодцы :) 
Copyright © 2014, Oracle and/or its ...
Copyright © 2014, Oracle and/or its afliates. All rights reserved.34 
Да, тестов недостаточно ... 
А сколько достаточно? 
...
Цель для имплементационного покрытия 
Copyright © 2014, Oracle and/or its afliates. All rights reserved.35 
Cost of testin...
100% покрытие по блокам 1 
false 
Copyright © 2014, Oracle and/or its afliates. All rights reserved.36 
• 1 тест 
• 100% т...
100% block and branch coverage 1 
• 2 теста true 
false 
• 100% тестов проходит 
• 100% покрытие по блокам и веткам 
• Баг...
Copyright © 2014, Oracle and/or its afliates. All rights reserved.38 
Да, тестов недостаточно ... 
100500 непокрытых строк...
Приоретизация кода для покрытия 
• Сортировать по важности 
–возраст 
–сложность 
–плотность багов 
• Выбрать под-набор 
–...
Copyright © 2014, Oracle and/or its afliates. All rights reserved.40 
Ранжирование результатов 
Характеристика 
кода Аргум...
Copyright © 2014, Oracle and/or its afliates. All rights reserved.41 
Ранжирование результатов 
● Формула (1 – cc) * (a1*x...
Фильтрация 
• Оставить только код который интересен 
–Код приложения – не тестов 
–Только один модуль 
–Только код выполня...
Пример использования. Демо. 
• Публичный программный интерфейс 
–А точно нужно все методы покрывать? 
–А точно это важнее ...
Contnuous integraton process с покрытием кода 
Кодирование Запуск тестов Молодцы :) 
Copyright © 2014, Oracle and/or its a...
69 
68 
67 
66 
65 
64 
63 
62 
61 
60 
59 
Copyright © 2014, Oracle and/or its afliates. All rights reserved.45 
Контроль...
Copyright © 2014, Oracle and/or its afliates. All rights reserved.46 
Сравнение. Демо
Полезное покрытие 
• Понятно сколько еще осталось 
–“Опыт – сын ошибок трудных” 
• Понятно что делать сначала а что - пото...
Метрики! 
• Покрытие кода суть метрика качества тестов 
… но ... 
• Не доказывает достаточность тестов 
–см. выше 
• Не до...
Метрики. Продолжение. 
• Покрытие кода отфильтрованное специальныи образом 
• Не доказывает достаточность тестов 
–см. выш...
Резюме 
• Получение данных 
–JCov – много разных способов 
• Использование данных 
–Использование сырых данных не полезно ...
Информация 
• Jcov вики: 
htps://wiki.openjdk.java.net/display/CodeTools/jcov 
• Туториал: 
htp://hg.openjdk.java.net/code...
Информация 
• slideshare.net 
–“Pragmatc code coverage” 
–“Java code coverage with JCov. Implementaton details and 
use ca...
Copyright © 2014, Oracle and/or its afliates. All rights reserved.53 
Планируемые улучшения 
• Плагины 
–IDE: Netbeans, Ec...
Полезное 
покрытие Java 
кода 
Александр (Шура) 
Ильин 
JDK Test Architect 
JDK SQE team
Upcoming SlideShare
Loading in …5
×

Полезное покрытие кода

1,025 views

Published on

Презентация Александра Ильина на SQA Days-16
14-15 ноября 2014, Санкт-Петербург, Россия
www.sqadays.com

Published in: Education
  • Be the first to comment

  • Be the first to like this

Полезное покрытие кода

  1. 1. Полезное покрытие Java кода Александр (Шура) Ильин JDK Test Architect JDK SQE team
  2. 2. Safe Harbor Statement The following is intended to outline our general product directon. It is intended for informaton purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functonality, and should not be relied upon in making purchasing decisions. The development, release, and tming of any features or functonality described for Oracle’s products remains at the sole discreton of Oracle. Copyright © 2014, Oracle and/or its afliates. All rights reserved. 2
  3. 3. Copyright © 2014, Oracle and/or its afliates. All rights reserved. 3 Contnuous integraton process Кодирование Запуск тестов Молодцы :) Не молодцы :(
  4. 4. Copyright © 2014, Oracle and/or its afliates. All rights reserved. Покрытие кода ● Информация о том, какой исходный код исполнен при выполнении программы. 4
  5. 5. чаще всего ... где ... Copyright © 2014, Oracle and/or its afliates. All rights reserved. Покрытие кода ● Информация о том, какой исходный код исполнен при тестировании программы 5 Тестирование ● Действия направленные на проверку того что программа работает как ожидается.
  6. 6. Copyright © 2014, Oracle and/or its afliates. All rights reserved. 6 Contnuous integraton process Кодирование Запуск тестов Молодцы :) Не молодцы :( Покрытие кода
  7. 7. Copyright © 2014, Oracle and/or its afliates. All rights reserved. 7 JCov. Демо.
  8. 8. JCov (жи-ков) • JCov – инструмент для получения и анализа исходного кода Java • Используется для JCK • Используется для Oracle JDK. • А также: –JavaFX –SceneBuilder –... Copyright © 2014, Oracle and/or its afliates. All rights reserved. 8
  9. 9. История • 1996: Прототип • 1997: Интеграция с JDK 1.1 • 1998: Начало использрвания “в поле” • JDK 1.2 • … • JDK 7 • 2014: Открытие кода в рамках penJDK codetools project. • 2014: JCov 3.0 – публичный “релиз” для JDK 8 • JDK 9 – в процессе Copyright © 2014, Oracle and/or its afliates. All rights reserved. 9
  10. 10. Дима Фазуненко Copyright © 2014, Oracle and/or its afliates. All rights reserved.10 JCov development Алексей Федорченко
  11. 11. Copyright © 2014, Oracle and/or its afliates. All rights reserved. Приложили руку ... 1.5 инженера, в среднем :) Леонид Арбузов, Александр Петров, Владимир Генералов,Сергей Чухонцев, Олег Ульянкин, Gregory Steuck, Павел Ождихин, Константин Бобровский, Robert Field, Саша Кузьмин, Леня Месник, Сергей Бородин, Андрей Титов, Дима Фазуненко, Алексей Федорченко
  12. 12. Тестовое покрытие OpenJDK. Не просто – очень просто! • Темплэйт java -jar jcov.jar TmplGen -t template.xml rt.jar • Запустить “граббер” java -jar jcov.jar Grabber -v -t template.xml start • Запустить тесты jtreg … -javaoptions:"-javaagent:$JCOV_JAR=grabber" <tests> • Остановить граббер, присоединить темплэйт, сгенерировать репорт java -jar jcov.jar GrabberManager -kill java -jar jcov.jar Merger -o merged.xml -t template.xml Copyright © 2014, Oracle and/or its afliates. All rights reserved. result.xml java -jar jcov.jar RepGen -src jdk/src/share/classes merged.xml
  13. 13. Copyright © 2014, Oracle and/or its afliates. All rights reserved.13 Принципы работы JCov • Инструментация байткода Java • Сброс данных • Генерация отчета • Другая обработка данных
  14. 14. Возможности JCov • Покрытие по блокам, строкам, веткам и методам • Динамическая или статическая инструментация • Сохранение данных в файл или на сервер • Индивидуальное тестовое покрытие • Покрытие публичного пользовательского интерфейса • Сравнение и объединение покрытия разных версий • Покрытие полей • Покрытие абстрактного кода • Подсчет прямого покрытия • API и SPI Copyright © 2014, Oracle and/or its afliates. All rights reserved.14
  15. 15. Динамическая/статическая инструментация • Статическая инструментация ● Тестируемый продукт подготавливается Copyright © 2014, Oracle and/or its afliates. All rights reserved. ● инструментируется байткода Java ● class, jar, zip, war файлы меняются ● Тесты запускаются обычным образом • Динамическая инструментация ● Тестируемый продукт используется как есть ● Тесты запускаются специальным образом ● передаются дополнительные опции для запуска Java машины
  16. 16. Динамическая/статическая инструментация Динамическая Статическая Copyright © 2014, Oracle and/or its afliates. All rights reserved. Изменения тестируемого продукта Нужно Не нужно Поурытие собирается для Вмего загружаемого кода(*) Только для инструментированного кода Запуск тестов Изменяется Не изменяется (**) Производительность (***) Замедляет загрузку классов Незначительное замедление 16 * Существуют механизмы сужения инструментируемого кода ** Классы самого JCov могут быть добавлены прямо в приложение *** Не включает расходы на сохранение данных
  17. 17. Copyright © 2014, Oracle and/or its afliates. All rights reserved. Данные в файл или на граббер • Файл ● Файл специфицируется при инструментации ● Для каждого теста файл загружается и сохраняется • Граббер ● Отдельный процесс для граббера ● На той-же или на другой машине ● Данные передаются на сервер
  18. 18. Какой способ использовать • Выбрать между динамическим и статическим тестированием • Файл –Один для всех тестов – увеличивается со временем – существенное замедление в случае многих VM –Сыой файл для каждого теста – долно мержить • Граббер –Последовательный запуск тестов если нужно индивидуальное тестовое покрытие. Copyright © 2014, Oracle and/or its afliates. All rights reserved.
  19. 19. Индивидуальное тестовое покрытие • Какими тестами покрыт тот или иной код • Ограничение набора тестов Copyright © 2014, Oracle and/or its afliates. All rights reserved. Test 2 Code Code Code Test 1
  20. 20. Индивидуальное тестовое покрытие. Демо. Copyright © 2014, Oracle and/or its afliates. All rights reserved.
  21. 21. Покрытие публичного программного интерфейса • “Набор методов предназначенных для прямого использования пользователями библиотеки” • Каждый метод публичного программного интерфейса должен быть вызван хотя бы один раз в цикле тестирования (*) • 100% покрытия публичного программного интерфейса ничего не доказывает - необходимо и не достаточно * продолжение следует Copyright © 2014, Oracle and/or its afliates. All rights reserved.21
  22. 22. Покрытие публичного программного интерфейса. Демо Copyright © 2014, Oracle and/or its afliates. All rights reserved.
  23. 23. Замыкание публичного программного интерфейса ArrayList.java Copyright © 2014, Oracle and/or its afliates. All rights reserved. My code
  24. 24. Покрытие абстрактного программного интерфейса Демо “Хороший ЭйПиАй – абстрактный ЭйПиАй” (c) кто-то Copyright © 2014, Oracle and/or its afliates. All rights reserved.
  25. 25. Copyright © 2014, Oracle and/or its afliates. All rights reserved. Покрытие полей. Демо
  26. 26. Прямое покрытие • Только методы использованные напрямую из тестов. • “Честное” покрытие Copyright © 2014, Oracle and/or its afliates. All rights reserved. Test Code Code Code
  27. 27. Copyright © 2014, Oracle and/or its afliates. All rights reserved. There is more. Exec Executes a command collecting coverage data Agent print help on usage jcov in dynamic mode Instr instruments classfiles and creates template.JREInstr instrumenter designed for instumenting rt.ProductInstr Instr2 instrumenter designed for abstract, native TmplGen generates the jcov template.xml Grabber gathers information from JCov runtime via GrabberManager control commands to the Grabber server Merger merges several jcov data files RepMerge merges jcov data files at method level not Filter filters out result data DiffCoverage check whether changed lines were covered RepGen generates text or HTML (or custom) reports JCov gets product coverage with one command
  28. 28. There is more. TmplGen Verbosity: -verbose Template specification: -template(t) 'string value' Type of template: -type [all|branch|block|method] Filtering conditions: -include(i) 'string value', -exclude(e) 'string Copyright © 2014, Oracle and/or its afliates. All rights reserved. value', -include_list 'string value', -exclude_list 'string value' Specify which items should be additionally included in template: -abstract [on|off], -native [on|off], -field [on|off] -synthetic [on|off], -anonym [on|off] Flush instrumented classes: -flush 'string value' Basic options: -help(h, ?), -help-verbose(hv) -print-env(env), -propfile 'string value' -plugindir 'string value', -log.file 'string value' -log.level(log) 'string value'
  29. 29. There is more. Instr Output: -instr.output(output, o) 'string value' Verbose mode: -verbose Type of template: -type [all|branch|block|method] Filtering conditions: -include(i) 'string value’, -include_list 'string value’, -exclude(e) 'string value’, -caller_include(ci) 'string value’, -caller_exclude(ce) 'string value’, -exclude_list 'string value' Save points: -savebegin 'string value’, -saveatend 'string value' Template specification: -template(t) 'string value’, -subsequent Items to be included: -abstract [on|off], -native [on|off], -field [on|off], -synthetic [on|off], -anonym [on|off], -innerinvocation [on|off] Flush instrumented classes: -flush 'string value' Runtime management: -implantrt(rt) 'string value’, -recursive Basic options: -help(h, ?), -help-verbose(hv), -print-env(env), -propfile 'string value’, -plugindir 'string value’, -log.file 'string value’, -log.level(log) 'string value' Copyright © 2014, Oracle and/or its afliates. All rights reserved.
  30. 30. There is more. Merger. Output file: -merger.output(output, o) 'string value' File to read jcov input files from: -filelist 'string value' Filtering conditions: -include(i) 'string value' -exclude(e) 'string value', -fm 'string value' -include_list 'string value', -exclude_list 'string value' -fm_list 'string value' Process/generate test scales: -scale, -outTestList 'string value' Verbose mode: -verbose(v) Looseness level: -loose [0|1|2|3|blocks] Compress test scales: -compress Break on error: -breakonerror [file|error|test|skip|none], -critwarn Template path: -template(tmpl, t) 'string value' Skipped files: -outSkipped 'string value' Basic options: -help(h, ?) -help-verbose(hv) -print-env(env) -propfile 'string value' -plugindir 'string value -log.file 'string value' -log.level(log) 'string value Copyright © 2014, Oracle and/or its afliates. All rights reserved.
  31. 31. Contnuous integraton process с покрытием кода Кодирование Запуск тестов Молодцы :) Copyright © 2014, Oracle and/or its afliates. All rights reserved.31 Не молодцы :( Покрытие кода ???
  32. 32. Copyright © 2014, Oracle and/or its afliates. All rights reserved.32 покрытие Не слишком полезное • Видимость деятельности –“Самая короткая жизнь — у занятых людей.” Сенека • Доказательство недостаточности тестирования ● “Program testing can be used to show the presence of bugs, but never to show their absence. ”[“Structured programming”, Dahl O.J., Dijkstra E.W. and Hoare C.A.R.] –SQADays 12. Формальная верификация как средство тестирования (в Java) • Репорт по покрытию –Штурман, приборы! –16! –Что 16? –А что приборы?
  33. 33. Contnuous integraton process с покрытием кода Кодирование Запуск тестов Молодцы :) Copyright © 2014, Oracle and/or its afliates. All rights reserved.33 Не молодцы :( Покрытие кода
  34. 34. Copyright © 2014, Oracle and/or its afliates. All rights reserved.34 Да, тестов недостаточно ... А сколько достаточно? 100%? Необходимо? Достаточно? Достижимо?
  35. 35. Цель для имплементационного покрытия Copyright © 2014, Oracle and/or its afliates. All rights reserved.35 Cost of testing - Defects found * COD = Return
  36. 36. 100% покрытие по блокам 1 false Copyright © 2014, Oracle and/or its afliates. All rights reserved.36 • 1 тест • 100% тестов проходит • 100% покрытие • Баг не найден
  37. 37. 100% block and branch coverage 1 • 2 теста true false • 100% тестов проходит • 100% покрытие по блокам и веткам • Баг не найден -1 Copyright © 2014, Oracle and/or its afliates. All rights reserved.37
  38. 38. Copyright © 2014, Oracle and/or its afliates. All rights reserved.38 Да, тестов недостаточно ... 100500 непокрытых строк кода – с чего начать? 100% не нужно! А сколько нужно? Что нужно? Приоретизация кода!!!
  39. 39. Приоретизация кода для покрытия • Сортировать по важности –возраст –сложность –плотность багов • Выбрать под-набор –Публичный программный интерфейс –Пользовательский интерфейс –Код контроллера Copyright © 2014, Oracle and/or its afliates. All rights reserved.39
  40. 40. Copyright © 2014, Oracle and/or its afliates. All rights reserved.40 Ранжирование результатов Характеристика кода Аргументы Возраст Код лучше бы оттестировать до того как он попадет к пользователям. Старый код или оттестирован или не нужен :) Количество изменений Каждое изменение – свидетельство изменения отдельного улучшения Плотность багов Чем больге багов найдено – тем больге осталось. (?) И каждое исправление создает ушрозу регрессии. Сложность При прочих равных, чем сложнее код, тем выше вероятность багов.
  41. 41. Copyright © 2014, Oracle and/or its afliates. All rights reserved.41 Ранжирование результатов ● Формула (1 – cc) * (a1*x1 + a2*x2 + a3*x3 + ...) –cc – покрытие (0, 1) –xi - характеристика –ai – коэффициент важности • Коэффициенты важны • Легко имплементировать с помощью JCov API
  42. 42. Фильтрация • Оставить только код который интересен –Код приложения – не тестов –Только один модуль –Только код выполняющий определенные функции –Только код обладающий определенными свойствами (след слайд). • JCov –Фильтрация по классам, пакетам – просто –Фильтрация по произвольным признакам – возможна с использованием API/SPI Copyright © 2014, Oracle and/or its afliates. All rights reserved.42
  43. 43. Пример использования. Демо. • Публичный программный интерфейс –А точно нужно все методы покрывать? –А точно это важнее чем писать тесты для сложных случаев? –А что если Copyright © 2014, Oracle and/or its afliates. All rights reserved.43 ● Код очень простой ● Не используемый ● Не критично ечли там дефект ● Сложно протестировать
  44. 44. Contnuous integraton process с покрытием кода Кодирование Запуск тестов Молодцы :) Copyright © 2014, Oracle and/or its afliates. All rights reserved. Тестирование 44 Не молодцы :( Покрытие кода Разработка тестов
  45. 45. 69 68 67 66 65 64 63 62 61 60 59 Copyright © 2014, Oracle and/or its afliates. All rights reserved.45 Контроль за тестированием билд 15 билд 16 билд 16 • Неухудшение покрытия –В теории: контроль за тестированием –На практике: непрактично • Контроль за тестированием входящего кода – Работает только при разработке тестов до интеграции
  46. 46. Copyright © 2014, Oracle and/or its afliates. All rights reserved.46 Сравнение. Демо
  47. 47. Полезное покрытие • Понятно сколько еще осталось –“Опыт – сын ошибок трудных” • Понятно что делать сначала а что - потом –Достигнуто согласие ключевых участников • Понятно какие тесты полезней • Можно быть уверенным что не становится хуже Copyright © 2014, Oracle and/or its afliates. All rights reserved.47
  48. 48. Метрики! • Покрытие кода суть метрика качества тестов … но ... • Не доказывает достаточность тестов –см. выше • Не доказывает недостаточность тестов –см. выше • Не имеет конкретной цели –см. выше Copyright © 2014, Oracle and/or its afliates. All rights reserved.48
  49. 49. Метрики. Продолжение. • Покрытие кода отфильтрованное специальныи образом • Не доказывает достаточность тестов –см. выше • Доказывает недостаточность тестов • Имеет конкретную цель –см. выше Copyright © 2014, Oracle and/or its afliates. All rights reserved.49
  50. 50. Резюме • Получение данных –JCov – много разных способов • Использование данных –Использование сырых данных не полезно –Фильтрация –Приоретизация • Контроль • Метрики Copyright © 2014, Oracle and/or its afliates. All rights reserved.50
  51. 51. Информация • Jcov вики: htps://wiki.openjdk.java.net/display/CodeTools/jcov • Туториал: htp://hg.openjdk.java.net/code-tools/jcov/raw-fle/tp/examp les/tutorial/Tutorial.html • Ка построить JCov: htps://wiki.openjdk.java.net/display/CodeTools/How+To+Bu ild+JCov Copyright © 2014, Oracle and/or its afliates. All rights reserved.51
  52. 52. Информация • slideshare.net –“Pragmatc code coverage” –“Java code coverage with JCov. Implementaton details and use cases.” • SQADays 10. Полезные метрики покрытия. Практический опыт и немного теории. Copyright © 2014, Oracle and/or its afliates. All rights reserved.52
  53. 53. Copyright © 2014, Oracle and/or its afliates. All rights reserved.53 Планируемые улучшения • Плагины –IDE: Netbeans, Eclipse, Intellij Idea –maven • Бэкенд –Coverage storage database –Trends, statstcs –Ranking • Расчет уменьшения тестовой базы Эй, это open-source! Сделай сам и поделись.
  54. 54. Полезное покрытие Java кода Александр (Шура) Ильин JDK Test Architect JDK SQE team

×