SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
1
<Insert Picture Here>




70% чего или различные метрики измерения покрытия кода
Дмитрий Фазуненко
Ведущий инженер-программист
- Штурман, приборы.
- 70.
- Что 70?
- А что приборы?


                      3
Оценка тестирования


                                 Программный
   Техническое задание              продукт




                         Тесты




• Нужны ли еще тесты?
• Если нужны, то на какие компоненты?
• Сколько стоят тесты?

                                               4
Метрика - это мера, позволяющая получить
численное значение некоторого свойства


 Объект              Свойство             Значение
Программа   Размер исходного кода, байт   10 430 202
  Зебра       Количество полосок, шт.        29
 Больница    Средняя температура, °С       37,1102



                                                       5
Метрики тестового покрытия

• Покрытие исходного кода
  –   Методов
  –   Строк
  –   Линейных блоков
  –   Условий (branch)
  –   Путей или предикатов
• Покрытие требований
  – В ширину (Breadth coverage)
  – В глубину (Deapth coverage)


                                  6
Покрытие методов

                                class СтиральнаяМашина {
 Считать ли метод                  public void делать_всё() {
 протестированным, если он            стирать(20);
                                      полоскать(15);
 вызван не напрямую из теста?         отжимать(700);
                                   }
                                   public void стирать(int time) {...}
• Вариант ДА: 4 из 4 = 100%        public void полоскать(int time) {...}
• Вариант НЕТ: 1 из 4 = 25%        public void отжимать(int time) {...}
                                }


                                void test() { машина.делать_всё(); }




                                                                           7
Способы измерения покрытия кода

• Инструментация исходного кода
• Инструментация байт кода
  – перед исполнением
  – во время загрузки классов (java -javaagent:cov.jar …)
• Подписка на события VM
  – JVM TI
• Статический анализ классов приложения и тестов



                                                            8
Инструментация
                      class Счет {
                        void раз_два() {
                           Collector.data[191]++;
                           делай_раз();
                           делай_два();
 class Счет {             }
   void раз_два() {   }
      делай_раз();
      делай_два();
    }                 public class Collector {
 }                      long[] data = new long[10000];
                      }


                      ...
                      191=метод Счет.раз_два()
                      ...


                                                         9
Статический анализ

• Шаг 1: Сканировать приложение
  – Список классов
  – Список методов
• Шаг 2: Сканировать тесты
  – Поиск вызовов методов приложения


ApiCover http://sigtest.java.net



                                       10
Динамический и статический анализ



          Динамика
                          Вызван             Не вызван
Статика
                           Метод          Есть тест, который
  Присутствует
                       протестирован       не запускается
                       Метод, который        Метод не
   Отсутствует
                     вызван не напрямую    протестирован




                                                               11
Строки или линейные блоки?
public class МойКласс {
   public static int вычислить(int n) {
       if (n != 0) {
           System.out.println("Дано" + n);
           Датчик датчик = new Датчик();        Покрытие строк
           int воздух = датчик.воздух();        8 из 10 = 80%
           int вода = датчик.вода();
           int m = (вода + воздух) / n;
           System.out.println("Итог: " + m);    Покрытие блоков
           return m;
       }                                        1 из 2 = 50%
       return new Датчик().вода() / n;
   }
}

@test void testCalc() {
    assetFalse(МойКласс.вычислить(10) != 10);
}


                                                                  12
Покрытие требований
   class Собака {
      /** Издает громкий звук */
      public void лаять() { // TO DO }

       /** Кусает за ногу */
       public void кусать() { // TO DO }   Покрытие методов
                                           3 из 3 = 100%
       /** Крепко спит 30 минут */
       public void спать() { // TO DO }
   }                                       Покрытие требований:
                                           0 из 3 = 0%
   сlass Тест {
     void test() {
         Собака щенок = new Собака();
         щенок.лаять();
         щенок.кусать();
         щенок.спать();
     }
   }


                                                                  13
Процесс покрытия требований


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




                                                       14
Покрытие в глубину

• У1: "Модуль А выдает значение числа π"
• У2: "Модуль В реализует операцию сложения"

Список логических тестов для утверждения
• У1:
  – Выдаваемое значение: 3,14159265359
• У2
  –   Сложение положительного и отрицательного
  –   Сложение с 0
  –   Переполнение
  –   ...


                                                 15
Метод аппроксимации


• Оценить общее количество утверждений
• Определить классы сложности утверждений
• Выбрать по 10-20 случайных утверждений для каждого
  класса сложности
• Посчитать покрытие в глубину и в ширину для выбранных
  случайных утверждений
• Аппроксимировать результат



                                                      16
Стратегия эффективного тестирования

• Вызвать по методу из 90% классов
• Вызвать 90% методов
• Добиться 70% покрытия строк


                  80                                                                                  100




                                                                                  Выявленные ошибки
                                                                                                      90
                  70

                                                                                                      80
 Покрытие строк




                  60
                                                                                                      70

                  50
                                                                                                      60


                  40                                                                                  50


                                                                                                      40
                  30

                                                                                                      30
                  20
                                                                                                      20

                  10
                                                                                                      10


                   0                                                      Время                        0
                                                                                                                                                           Время
                       0     1     2    3       4     5    6    7     8                                     0   1    2    3    4     5    6    4       8




                           Эффективный подход       Линейный подход                                             Эффективный подход   Линейный подход




                                                                                                                                                                   17
Почему не нужно 100%
• Неэффективно
  – 20% кода — 80% ошибок
  – Тривиальный код
• Дорого
  – Труднодоступный код
  – Обработка исключений
• Нет гарантии отсутствия ошибок
• Минусы огромного числа тестов:
    • Возрастает время прогона
    • Много падений по одной причине
    • Больше затрат на переделку


                                       18
Заключение




Инструменты выдают числа, выводы делают люди




                                               19
Вопросы




Dmitry.Fazunenko@oracle.com



                              20

Mais conteúdo relacionado

Semelhante a "70% of what?" or various metrics to measure code coverage

Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутAndrey Karpov
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8chashnikov
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
Тестируем тесты с PIT (мутационное тестирование)
Тестируем тесты с PIT (мутационное тестирование)Тестируем тесты с PIT (мутационное тестирование)
Тестируем тесты с PIT (мутационное тестирование)Vitebsk Miniq
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysLiloSEA
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!RAMBLER&Co
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Andrey Karpov
 
Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Nikita Lipsky
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализаторAndrey Karpov
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 

Semelhante a "70% of what?" or various metrics to measure code coverage (20)

Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Тестируем тесты с PIT (мутационное тестирование)
Тестируем тесты с PIT (мутационное тестирование)Тестируем тесты с PIT (мутационное тестирование)
Тестируем тесты с PIT (мутационное тестирование)
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Victor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDays
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...
 
Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализатор
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 

"70% of what?" or various metrics to measure code coverage

  • 1. 1
  • 2. <Insert Picture Here> 70% чего или различные метрики измерения покрытия кода Дмитрий Фазуненко Ведущий инженер-программист
  • 3. - Штурман, приборы. - 70. - Что 70? - А что приборы? 3
  • 4. Оценка тестирования Программный Техническое задание продукт Тесты • Нужны ли еще тесты? • Если нужны, то на какие компоненты? • Сколько стоят тесты? 4
  • 5. Метрика - это мера, позволяющая получить численное значение некоторого свойства Объект Свойство Значение Программа Размер исходного кода, байт 10 430 202 Зебра Количество полосок, шт. 29 Больница Средняя температура, °С 37,1102 5
  • 6. Метрики тестового покрытия • Покрытие исходного кода – Методов – Строк – Линейных блоков – Условий (branch) – Путей или предикатов • Покрытие требований – В ширину (Breadth coverage) – В глубину (Deapth coverage) 6
  • 7. Покрытие методов class СтиральнаяМашина { Считать ли метод public void делать_всё() { протестированным, если он стирать(20); полоскать(15); вызван не напрямую из теста? отжимать(700); } public void стирать(int time) {...} • Вариант ДА: 4 из 4 = 100% public void полоскать(int time) {...} • Вариант НЕТ: 1 из 4 = 25% public void отжимать(int time) {...} } void test() { машина.делать_всё(); } 7
  • 8. Способы измерения покрытия кода • Инструментация исходного кода • Инструментация байт кода – перед исполнением – во время загрузки классов (java -javaagent:cov.jar …) • Подписка на события VM – JVM TI • Статический анализ классов приложения и тестов 8
  • 9. Инструментация class Счет { void раз_два() { Collector.data[191]++; делай_раз(); делай_два(); class Счет { } void раз_два() { } делай_раз(); делай_два(); } public class Collector { } long[] data = new long[10000]; } ... 191=метод Счет.раз_два() ... 9
  • 10. Статический анализ • Шаг 1: Сканировать приложение – Список классов – Список методов • Шаг 2: Сканировать тесты – Поиск вызовов методов приложения ApiCover http://sigtest.java.net 10
  • 11. Динамический и статический анализ Динамика Вызван Не вызван Статика Метод Есть тест, который Присутствует протестирован не запускается Метод, который Метод не Отсутствует вызван не напрямую протестирован 11
  • 12. Строки или линейные блоки? public class МойКласс { public static int вычислить(int n) { if (n != 0) { System.out.println("Дано" + n); Датчик датчик = new Датчик(); Покрытие строк int воздух = датчик.воздух(); 8 из 10 = 80% int вода = датчик.вода(); int m = (вода + воздух) / n; System.out.println("Итог: " + m); Покрытие блоков return m; } 1 из 2 = 50% return new Датчик().вода() / n; } } @test void testCalc() { assetFalse(МойКласс.вычислить(10) != 10); } 12
  • 13. Покрытие требований class Собака { /** Издает громкий звук */ public void лаять() { // TO DO } /** Кусает за ногу */ public void кусать() { // TO DO } Покрытие методов 3 из 3 = 100% /** Крепко спит 30 минут */ public void спать() { // TO DO } } Покрытие требований: 0 из 3 = 0% сlass Тест { void test() { Собака щенок = new Собака(); щенок.лаять(); щенок.кусать(); щенок.спать(); } } 13
  • 14. Процесс покрытия требований • Перевести техническое задание в список утверждений • Связать тесты и утверждения • Получить отчет 14
  • 15. Покрытие в глубину • У1: "Модуль А выдает значение числа π" • У2: "Модуль В реализует операцию сложения" Список логических тестов для утверждения • У1: – Выдаваемое значение: 3,14159265359 • У2 – Сложение положительного и отрицательного – Сложение с 0 – Переполнение – ... 15
  • 16. Метод аппроксимации • Оценить общее количество утверждений • Определить классы сложности утверждений • Выбрать по 10-20 случайных утверждений для каждого класса сложности • Посчитать покрытие в глубину и в ширину для выбранных случайных утверждений • Аппроксимировать результат 16
  • 17. Стратегия эффективного тестирования • Вызвать по методу из 90% классов • Вызвать 90% методов • Добиться 70% покрытия строк 80 100 Выявленные ошибки 90 70 80 Покрытие строк 60 70 50 60 40 50 40 30 30 20 20 10 10 0 Время 0 Время 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 4 8 Эффективный подход Линейный подход Эффективный подход Линейный подход 17
  • 18. Почему не нужно 100% • Неэффективно – 20% кода — 80% ошибок – Тривиальный код • Дорого – Труднодоступный код – Обработка исключений • Нет гарантии отсутствия ошибок • Минусы огромного числа тестов: • Возрастает время прогона • Много падений по одной причине • Больше затрат на переделку 18