54
Александр (Шура) Ильин JDK Test Architect JDK SQE team Полезное покрытие Java кода

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

  • Upload
    sqalab

  • View
    442

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

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

Александр (Шура) ИльинJDK Test ArchitectJDK SQE team

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

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

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.

2

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved. 3

Contnuous integraton process

Кодирование Запуск тестов Молодцы :)

Не молодцы :(

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Покрытие кода

● Информация о том, какой исходный код исполнен при выполнении программы.

4

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Покрытие кода

● Информация о том, какой исходный код исполнен при тестировании программы

5

● Действия направленные на проверку того что программа работает как ожидается.

Тестированиегде ...

чаще всего ...

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved. 6

Contnuous integraton process

Кодирование Запуск тестов Молодцы :)

Не молодцы :(

Покрытиекода

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved. 7

JCov. Демо.

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved. 8

JCov (жи-ков)

• JCov – инструмент для получения и анализа исходного кода Java

• Используется для JCK• Используется для Oracle JDK.• А также:

–JavaFX–SceneBuilder–...

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved. 9

История

• 1996: Прототип• 1997: Интеграция с JDK 1.1• 1998: Начало использрвания “в поле”• JDK 1.2• …• JDK 7• 2014: Открытие кода в рамках penJDK codetools project.• 2014: JCov 3.0 – публичный “релиз” для JDK 8 • JDK 9 – в процессе

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.10

Дима Фазуненко

JCov development

Алексей Федорченко

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Приложили руку ...

1.5 инженера, в среднем :)

Леонид Арбузов, Александр Петров, Владимир Генералов,Сергей Чухонцев, Олег Ульянкин, Gregory Steuck, Павел Ождихин, Константин Бобровский, Robert Field, Саша Кузьмин, Леня Месник, Сергей Бородин, Андрей Титов, Дима Фазуненко, Алексей Федорченко

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Тестовое покрытие 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 -killjava -jar jcov.jar Merger -o merged.xml -t template.xml \result.xml

java -jar jcov.jar RepGen -src jdk/src/share/classes merged.xml

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.13

Принципы работы JCov

• Инструментация байткода Java• Сброс данных• Генерация отчета• Другая обработка данных

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.14

Возможности JCov

• Покрытие по блокам, строкам, веткам и методам• Динамическая или статическая инструментация• Сохранение данных в файл или на сервер• Индивидуальное тестовое покрытие• Покрытие публичного пользовательского интерфейса• Сравнение и объединение покрытия разных версий• Покрытие полей• Покрытие абстрактного кода• Подсчет прямого покрытия• API и SPI

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Динамическая/статическая инструментация

• Статическая инструментация● Тестируемый продукт подготавливается

● инструментируется байткода Java ● class, jar, zip, war файлы меняются

● Тесты запускаются обычным образом • Динамическая инструментация

● Тестируемый продукт используется как есть● Тесты запускаются специальным образом

● передаются дополнительные опции для запуска Java машины

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Динамическая/статическая инструментация

Динамическая Статическая

Изменения тестируемого продукта Нужно Не нужно

Поурытие собирается для

Вмего загружаемого кода(*)

Только для инструментированного

кода

Запуск тестов Изменяется Не изменяется (**)

Производительность (***)

Замедляет загрузку классов

Незначительное замедление

16

* Существуют механизмы сужения инструментируемого кода** Классы самого JCov могут быть добавлены прямо в приложение*** Не включает расходы на сохранение данных

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Данные в файл или на граббер

• Файл● Файл специфицируется при инструментации● Для каждого теста файл загружается и сохраняется

• Граббер● Отдельный процесс для граббера

● На той-же или на другой машине● Данные передаются на сервер

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Какой способ использовать

• Выбрать между динамическим и статическим тестированием

• Файл –Один для всех тестов – увеличивается со временем –

существенное замедление в случае многих VM–Сыой файл для каждого теста – долно мержить

• Граббер–Последовательный запуск тестов если нужно

индивидуальное тестовое покрытие.

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Индивидуальное тестовое покрытие

• Какими тестами покрыт тот или иной код• Ограничение набора тестов

Test 2

Code

Code

Code

Test 1

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Индивидуальное тестовое покрытие. Демо.

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.21

Покрытие публичного программного интерфейса

• “Набор методов предназначенных для прямого использования пользователями библиотеки”

• Каждый метод публичного программного интерфейса должен быть вызван хотя бы один раз в цикле тестирования (*)

• 100% покрытия публичного программного интерфейса ничего не доказывает - необходимо и не достаточно

* продолжение следует

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Покрытие публичного программногоинтерфейса. Демо

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

ArrayList.java

My code

Замыкание публичного программного интерфейса

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Покрытие абстрактного программного интерфейсаДемо

“Хороший ЭйПиАй – абстрактный ЭйПиАй” (c) кто-то

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Покрытие полей. Демо

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Прямое покрытие

• Только методы использованные напрямую из тестов.• “Честное” покрытие

Test

Code

Code

Code

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

There is more. Exec Executes a command collecting coverage data in a grabber Agent print help on usage jcov in dynamic mode Instr instruments classfiles and creates template.xml JREInstr instrumenter designed for instumenting rt.jar ProductInstr Instr2 instrumenter designed for abstract, native methods and fields TmplGen generates the jcov template.xml Grabber gathers information from JCov runtime via sockets GrabberManager control commands to the Grabber server Merger merges several jcov data files RepMerge merges jcov data files at method level not caring of blocks <> 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

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

There is more. TmplGenVerbosity: -verboseTemplate specification: -template(t) 'string value'Type of template: -type [all|branch|block|method]Filtering conditions: -include(i) 'string value', -exclude(e) 'string 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'

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

There is more. InstrOutput: -instr.output(output, o) 'string value'Verbose mode: -verboseType 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’, -subsequentItems 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’, -recursiveBasic options: -help(h, ?), -help-verbose(hv), -print-env(env), -propfile 'string value’, -plugindir 'string value’, -log.file 'string value’, -log.level(log) 'string value'

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

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: -compressBreak on error: -breakonerror [file|error|test|skip|none], -critwarnTemplate 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

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.31

Contnuous integraton process с покрытием кода

Кодирование Запуск тестов Молодцы :)

Не молодцы :(

Покрытиекода

???

Page 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?–А что приборы?

Не слишком полезное

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.33

Contnuous integraton process с покрытием кода

Кодирование Запуск тестов Молодцы :)

Не молодцы :(

Покрытиекода

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.34

Да, тестов недостаточно ...

А сколько достаточно?

100%?

Необходимо?

Достаточно?

Достижимо?

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.35

Цель для имплементационного покрытия

Cost of testing

Defects found * COD

-

=

Return

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.36

100% покрытие по блокам 1

false• 1 тест• 100% тестов проходит• 100% покрытие• Баг не найден

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.37

100% block and branch coverage 1

true

-1

false• 2 теста• 100% тестов проходит• 100% покрытие по блокам и веткам• Баг не найден

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.38

Да, тестов недостаточно ...

100500 непокрытых строк кода – с чего начать?

100% не нужно! А сколько нужно? Что нужно?

Приоретизация кода!!!

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.39

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

• Сортировать по важности–возраст–сложность–плотность багов

• Выбрать под-набор–Публичный программный

интерфейс–Пользовательский интерфейс–Код контроллера

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.40

Ранжирование результатов

Характеристика кода Аргументы

ВозрастКод лучше бы оттестировать до того как он попадет к

пользователям.Старый код или оттестирован или не нужен :)

Количество изменений

Каждое изменение – свидетельство изменения отдельного улучшения

Плотность багов Чем больге багов найдено – тем больге осталось. (?)И каждое исправление создает ушрозу регрессии.

Сложность При прочих равных, чем сложнее код, тем выше вероятность багов.

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.41

Ранжирование результатов

● Формула (1 – cc) * (a1*x

1 + a

2*x

2 + a

3*x

3 + ...)

–cc – покрытие (0, 1)

–xi - характеристика

–ai – коэффициент важности

• Коэффициенты важны• Легко имплементировать с помощью JCov API

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.42

Фильтрация

• Оставить только код который интересен–Код приложения – не тестов–Только один модуль–Только код выполняющий определенные функции–Только код обладающий определенными свойствами

(след слайд).• JCov

–Фильтрация по классам, пакетам – просто–Фильтрация по произвольным признакам – возможна с

использованием API/SPI

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.43

Пример использования. Демо.

• Публичный программный интерфейс–А точно нужно все методы покрывать?–А точно это важнее чем писать тесты для сложных

случаев?–А что если

● Код очень простой● Не используемый● Не критично ечли там дефект● Сложно протестировать

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.

Тестирование

44

Contnuous integraton process с покрытием кода

Кодирование Запуск тестов Молодцы :)

Не молодцы :(

Покрытиекода

Разработкатестов

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.45

Контроль за тестированием

билд 15 билд 16 билд 1659

60

61

62

63

64

65

66

67

68

69

Column 3

• Неухудшение покрытия–В теории: контроль за тестированием–На практике: непрактично

• Контроль за тестированием входящего кода– Работает только при разработке тестов до

интеграции

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.46

Сравнение. Демо

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.47

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

• Понятно сколько еще осталось–“Опыт – сын ошибок трудных”

• Понятно что делать сначала а что - потом–Достигнуто согласие ключевых участников

• Понятно какие тесты полезней• Можно быть уверенным что не становится хуже

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.48

Метрики!

• Покрытие кода суть метрика качества тестов… но ...• Не доказывает достаточность тестов

–см. выше• Не доказывает недостаточность тестов

–см. выше• Не имеет конкретной цели

–см. выше

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.49

Метрики. Продолжение.

• Покрытие кода отфильтрованное специальныи образом• Не доказывает достаточность тестов

–см. выше• Доказывает недостаточность тестов• Имеет конкретную цель

–см. выше

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.50

Резюме

• Получение данных–JCov – много разных способов

• Использование данных–Использование сырых данных не полезно–Фильтрация–Приоретизация

• Контроль• Метрики

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.51

Информация

• Jcov вики: htps://wiki.openjdk.java.net/display/CodeTools/jcov

• Туториал: htp://hg.openjdk.java.net/code-tools/jcov/raw-fle/tp/examples/tutorial/Tutorial.html

• Ка построить JCov: htps://wiki.openjdk.java.net/display/CodeTools/How+To+Build+JCov

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

Copyright © 2014, Oracle and/or its afliates. All rights reserved.52

Информация

• slideshare.net–“Pragmatc code coverage”–“Java code coverage with JCov. Implementaton details and

use cases.”• SQADays 10. Полезные метрики покрытия. Практический

опыт и немного теории.

Page 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! Сделай сам и поделись.

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

Александр (Шура) ИльинJDK Test ArchitectJDK SQE team

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