ݺߣ

ݺߣShare a Scribd company logo
Московский Государственный Университет им М.В Ломоносова
   Факультет Вычислительной Математики и Кибернетики




    Автоматическая генерация
     тестов по комментариям к
        программному коду
                    Носков А. А.
             alexey.noskov@gmail.com
Проблемная область


    Среди характеристик качественного ПО:
      
          Надежность (достигается тестированием)
      
          Наличие документации к коду


    В тестах фиксируется поведение, ожидаемое
    от элементов ПО

    В документацию входит описание того, какое
    поведение ожидается


                Дублирование ?
                                                   2
Конкретизация области


    Документация
      
          Интерфейсные комментарии в элементам
          кода (функциям, классам, методам, ...)
      
          Предназначены для программиста,
          использующего эти элементы
      
          JavaDoc, RDoc, Doxygen, ...

    Тесты
      
          Модульные тесты, проверяющие корректность
          поведения элементов кода
      
          JUnit, CppUnit, Test::Unit
                                                   3
Задачи работы


    Метод генерации модульных тестов
      
          На основе описания поведения объектов кода
          в комментариях
      •
          Ограниченный ЕЯ, удобный для человека и
          автоматической обработки


    НЕ включается:
      ‒ Построение тестов по произвольным
        комментариям
      ‒ Генерация полного тестового покрытия
      ‒ Генерация регрессионных тестов
                                                       4
Реализация метода


    Плагин для IDE Eclipse, осуществляющий
    генерацию модульных тестов JUnit


    Генерация тестов к коду на Java

    Обрабатываемые комментарии – JavaDoc


    Язык реализации – Java

    Для выделения конструкций ЕЯ – LSPL
      
          Язык лексико-синтаксических шаблонов

    Для морфологического анализа – AOT
                                                 5
Схема метода

Комментарии на ЕЯ

  Выделение
                    LSPL-шаблоны
  именований
                     именований
 объектов кода

   Выделение
                    LSPL-шаблоны
    описаний
                       свойств
свойств объектов

Генерация тестов

     Тесты                         6
Примеры комментариев
/**
 * Вычислить факториал.
 *
 * Например, если аргумент равен 3, то факториал 6.
 * А если аргумент 4, то 24
 *
 * @param value аргумент, больше 0
 * @return значение факториала, не меньше аргумента
 * @throws IllegalArgumentException если аргумент меньше 0
 */
public static int factorial( int value )



/**
 * Нахождение наибольшего общего делителя двух чисел.
 *
 * @param a первое число
 * @param b второе число
 *
 * Остаток от деления первого числа на результат равен 0.
 * Остаток от деления второго числа на результат равен 0.
 *
 * @return наибольший общий делитель чисел
 */
public static int nod(int a, int b)                          7
Выделение именований


    Объекты кода именуются в комментариях

    Эти имена используются человеком при описании
    свойств в комментариях


    Для выделения именований можно использовать
    разметку комментариев в виде тэгов (JavaDoc,
    Doxygen, Rdoc)


    Выделяются по шаблонам именных групп,
    описанным на LSPL (NG = {A|Num} N)
   Стандартные именования (“аргумент”, “результат”)
                                                    8
Выделение именований
                    Примеры
/**
 * Вычислить факториал.
 *
 * Например, если аргумент равен 3, то факториал 6.
 * А если аргумент 4, то 24
 *
 * @param value аргумент, больше 0
 * @return значение факториала, не меньше аргумента
 * @throws IllegalArgumentException если аргумент меньше 0
 */
public static int factorial( int value )



/**
 * Нахождение наибольшего общего делителя двух чисел.
 *
 * @param a первое число
 * @param b второе число
 *
 * Остаток от деления первого числа на результат равен 0.
 * Остаток от деления второго числа на результат равен 0.
 *
 * @return наибольший общий делитель чисел
 */
public static int nod(int a, int b)                          9
Выделение описаний свойств
             объектов

    LSPL-шаблоны:
      
          Объектов кода (аргументы, результат) –
          генерируются на основе именований
      
          Описаний свойств – описываются заранее

    Распознование в тексте комментария
    описания свойств объектов на основе
    шаблонов


    Результаты распознавания => внутреннее
    представление свойств
                                                   10
Выделение свойств
                    Примеры
/**
 * Вычислить факториал.
 *
 * Например, если аргумент равен 3, то факториал 6.
 * А если аргумент 4, то 24
 *
 * @param value аргумент, больше 0
 * @return значение факториала, не меньше аргумента
 * @throws IllegalArgumentException если аргумент меньше 0
 */
public static int factorial( int value )



/**
 * Нахождение наибольшего общего делителя двух чисел.
 *
 * @param a первое число
 * @param b второе число
 *
 * Остаток от деления первого числа на результат равен 0.
 * Остаток от деления второго числа на результат равен 0.
 *
 * @return наибольший общий делитель чисел
 */
public static int nod(int a, int b)                          11
Генерация тестов


    Выделение тестируемых наборов свойств:
      
          Условия в конкретных примерах
      
          Взаимосвязи между аргументами и
          результатом

    Выбор значений аргументов, если они не
    заданы

    Генерация кода тестов для выделенных
    наборов свойств


                                             12
Генерация тестов
                              Примеры
                         @Test public void factorial0() {
                             int value = 3;
если аргумент равен 3,       int result = TestClass.factorial(value);
    то факториал 6
                             assertEquals( 6, result );
                         }

                         @Test public void factorial1() {
                             int value = 4;
                             int result = TestClass.factorial(value);
если аргумент 4, то 24
                             assertEquals( 24, result );
                         }

                         @Test public void nod0() {
                             int a = 12;
 Остаток от деления          int b = 16;
    первого числа            int result = TestClass.nod( a, b );
на результат равен 0
                             assertEquals( 0, a % result );
                         }

                         @Test public void nod1() {
                             int a = 5;
 Остаток от деления          int b = 10;
    второго числа            int result = TestClass.nod( a, b );
на результат равен 0
                             assertEquals( 0, b % result );             13
                         }
Ближайшие планы


    Расширения множества описываемых
    условий

    Обработка условий порождения исключени

    Описание изменения состояния объекта:
      
          Доступ к полям
      
          Вызов методов

    Обработка условий, заданных в контексте
    некоторого элемента


                                              14
?

More Related Content

Similar to Автоматическая генерация тестов по комментариям к программному коду (20)

Типы данных
Типы данныхТипы данных
Типы данных
MonsterXX
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
Andrey Karpov
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
yaevents
Kotlin first Kotlin first Kotlin firstKotlin first
Kotlin first Kotlin first Kotlin firstKotlin firstKotlin first Kotlin first Kotlin firstKotlin first
Kotlin first Kotlin first Kotlin firstKotlin first
pavelwordp1
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
Andrey Karpov
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
Noveo
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
Technopark
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9
Technopark
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
chashnikov
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
Stfalcon Meetups
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
Igor Shkulipa
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Dima Dzuba
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
metaform
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
Digital-агентство Мэйк
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
Alex.Kolonitsky
Типы данных
Типы данныхТипы данных
Типы данных
MonsterXX
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
Andrey Karpov
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
yaevents
Kotlin first Kotlin first Kotlin firstKotlin first
Kotlin first Kotlin first Kotlin firstKotlin firstKotlin first Kotlin first Kotlin firstKotlin first
Kotlin first Kotlin first Kotlin firstKotlin first
pavelwordp1
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
Andrey Karpov
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
Noveo
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
Technopark
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9
Technopark
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
chashnikov
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
Igor Shkulipa
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Dima Dzuba
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
metaform
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
Alex.Kolonitsky

Автоматическая генерация тестов по комментариям к программному коду

  • 1. Московский Государственный Университет им М.В Ломоносова Факультет Вычислительной Математики и Кибернетики Автоматическая генерация тестов по комментариям к программному коду Носков А. А. alexey.noskov@gmail.com
  • 2. Проблемная область  Среди характеристик качественного ПО:  Надежность (достигается тестированием)  Наличие документации к коду  В тестах фиксируется поведение, ожидаемое от элементов ПО  В документацию входит описание того, какое поведение ожидается Дублирование ? 2
  • 3. Конкретизация области  Документация  Интерфейсные комментарии в элементам кода (функциям, классам, методам, ...)  Предназначены для программиста, использующего эти элементы  JavaDoc, RDoc, Doxygen, ...  Тесты  Модульные тесты, проверяющие корректность поведения элементов кода  JUnit, CppUnit, Test::Unit 3
  • 4. Задачи работы  Метод генерации модульных тестов  На основе описания поведения объектов кода в комментариях • Ограниченный ЕЯ, удобный для человека и автоматической обработки  НЕ включается: ‒ Построение тестов по произвольным комментариям ‒ Генерация полного тестового покрытия ‒ Генерация регрессионных тестов 4
  • 5. Реализация метода  Плагин для IDE Eclipse, осуществляющий генерацию модульных тестов JUnit  Генерация тестов к коду на Java  Обрабатываемые комментарии – JavaDoc  Язык реализации – Java  Для выделения конструкций ЕЯ – LSPL  Язык лексико-синтаксических шаблонов  Для морфологического анализа – AOT 5
  • 6. Схема метода Комментарии на ЕЯ Выделение LSPL-шаблоны именований именований объектов кода Выделение LSPL-шаблоны описаний свойств свойств объектов Генерация тестов Тесты 6
  • 7. Примеры комментариев /** * Вычислить факториал. * * Например, если аргумент равен 3, то факториал 6. * А если аргумент 4, то 24 * * @param value аргумент, больше 0 * @return значение факториала, не меньше аргумента * @throws IllegalArgumentException если аргумент меньше 0 */ public static int factorial( int value ) /** * Нахождение наибольшего общего делителя двух чисел. * * @param a первое число * @param b второе число * * Остаток от деления первого числа на результат равен 0. * Остаток от деления второго числа на результат равен 0. * * @return наибольший общий делитель чисел */ public static int nod(int a, int b) 7
  • 8. Выделение именований  Объекты кода именуются в комментариях  Эти имена используются человеком при описании свойств в комментариях  Для выделения именований можно использовать разметку комментариев в виде тэгов (JavaDoc, Doxygen, Rdoc)  Выделяются по шаблонам именных групп, описанным на LSPL (NG = {A|Num} N)  Стандартные именования (“аргумент”, “результат”) 8
  • 9. Выделение именований Примеры /** * Вычислить факториал. * * Например, если аргумент равен 3, то факториал 6. * А если аргумент 4, то 24 * * @param value аргумент, больше 0 * @return значение факториала, не меньше аргумента * @throws IllegalArgumentException если аргумент меньше 0 */ public static int factorial( int value ) /** * Нахождение наибольшего общего делителя двух чисел. * * @param a первое число * @param b второе число * * Остаток от деления первого числа на результат равен 0. * Остаток от деления второго числа на результат равен 0. * * @return наибольший общий делитель чисел */ public static int nod(int a, int b) 9
  • 10. Выделение описаний свойств объектов  LSPL-шаблоны:  Объектов кода (аргументы, результат) – генерируются на основе именований  Описаний свойств – описываются заранее  Распознование в тексте комментария описания свойств объектов на основе шаблонов  Результаты распознавания => внутреннее представление свойств 10
  • 11. Выделение свойств Примеры /** * Вычислить факториал. * * Например, если аргумент равен 3, то факториал 6. * А если аргумент 4, то 24 * * @param value аргумент, больше 0 * @return значение факториала, не меньше аргумента * @throws IllegalArgumentException если аргумент меньше 0 */ public static int factorial( int value ) /** * Нахождение наибольшего общего делителя двух чисел. * * @param a первое число * @param b второе число * * Остаток от деления первого числа на результат равен 0. * Остаток от деления второго числа на результат равен 0. * * @return наибольший общий делитель чисел */ public static int nod(int a, int b) 11
  • 12. Генерация тестов  Выделение тестируемых наборов свойств:  Условия в конкретных примерах  Взаимосвязи между аргументами и результатом  Выбор значений аргументов, если они не заданы  Генерация кода тестов для выделенных наборов свойств 12
  • 13. Генерация тестов Примеры @Test public void factorial0() { int value = 3; если аргумент равен 3, int result = TestClass.factorial(value); то факториал 6 assertEquals( 6, result ); } @Test public void factorial1() { int value = 4; int result = TestClass.factorial(value); если аргумент 4, то 24 assertEquals( 24, result ); } @Test public void nod0() { int a = 12; Остаток от деления int b = 16; первого числа int result = TestClass.nod( a, b ); на результат равен 0 assertEquals( 0, a % result ); } @Test public void nod1() { int a = 5; Остаток от деления int b = 10; второго числа int result = TestClass.nod( a, b ); на результат равен 0 assertEquals( 0, b % result ); 13 }
  • 14. Ближайшие планы  Расширения множества описываемых условий  Обработка условий порождения исключени  Описание изменения состояния объекта:  Доступ к полям  Вызов методов  Обработка условий, заданных в контексте некоторого элемента 14
  • 15. ?