Написание тестов для методов библиотек#

Пререквезиты при написании тестов для методов библиотек, расположенных в директории ru/sbrf/devops:

  • Актуальная версия SMDL.Core.

  • Подключенный фреймворк Gradle.

  • Заполненный build.gradle с логином/паролем для подключения к хранилищу зависимостей. Нельзя производить commit заполненного build.gradle в репозиторий.

  • Выполненная команда gradle build. В результате выполнения которой, будут загружены и подключены все необходимые зависимости для написания тестов.

Написание теста:

  1. Cоздать в директории src/test/groovy директорию с именем библиотеки (если она отсутствует).

  2. Создать файл типа GroovyClass в директории, созданной на предыдущем шаге, название которого должно удовлетворять маске Test${название метода, первая буква метода в верхнем регистре}.

test_of_method_dir

Рисунок. Структура директорий для теста метода

  1. Использовать шаблон класса теста:

    import org.junit.jupiter.api.BeforeEach
    import org.junit.jupiter.api.Test
    import ru.sbrf.devops.TestHelper
    
    
    class TestMethodName extends TestHelper {
    
       @Override
       @BeforeEach
       void setUp() {
          // метод переопределения метода invokeMethod для класса, имитирующий окружение Jenkins
          registerNewInvokeMethod(JenkinsEnv)
       }
    }
    

TestHelper - класс, расширяющий библиотеку тестирования MPL Jenkins (описан в подразделе «Дополнительные файлы» раздела «Дополнительная документация» документа «Руководство прикладного разработчика»), JenkinsEnv - класс, имитирующий окружение Jenkins.

  1. Описать все тесты в классе теста, которые максимально возможно будут покрывать код метода библиотеки.

При написании тестов следует взять за правило, что все взаимодействия с другими библиотеками, с другими методами библиотеки или системами принимаются за успешные. Поэтому нужно писать mock (заглушки) методов библиотек, плагинов.

Возможные варианты регистрации mock плагинов и методов библиотек, предоставляемые классом TestHelper:

  • saveMockClosure - регистрация mock плагинов Jenkins.

  • mockMethodThroughMetaClass - регистрация mock метода класса библиотек из src/ru/sbrf/devops (Если в инициализации исходного метода прописан явно тип параметра, то в Closure mock также нужно указывать тип параметра).

Всегда проверяйте существование mock (заглушки) метода/плагина в других тестах, прежде чем писать свою реализацию mock.

Сравнение результата работы метода с ожидаемым результатом проводится посредством сторонних библиотек по сравнению Map. Пример:

  def output = dev.sortAnyMap([a:[value:1],b:[value:0],c:[value:100]],'value')
  def diff = Maps.difference([c:[value:100],a:[value:1],b:[value:0]],output)
  assertTrue(diff.areEqual())

Пример mock через saveMockClosure:

  saveMockClosure(DevCommon, 'echo', { String text ->
      println(text)
  })

Пример mock через mockMethodThroughMetaClass:

  mockMethodThroughMetaClass(DevCommon, 'withCustomCreds', { ArrayList a, Closure b ->
     b.mavenCredSettingXml = "cred"
     b.call()
     println("OK! withCustomCreds")
  })

Пример теста:

   @Test
   /**
    * Тест проверки сортировки сложной Map в нисходящем порядке
    */
   void testSetUpDescend() {
      JenkinsEnv jenkinsEnv = new JenkinsEnv()
      DevCommon dev = new DevCommon(jenkinsEnv,[:])
      def output = dev.sortAnyMap([a:[value:1],b:[value:0],c:[value:100]],'value')
      def diff = Maps.difference([c:[value:100],a:[value:1],b:[value:0]],output)
      assertTrue(diff.areEqual())
   }

Узнать о покрытии кода можно запустив тесты метода библиотеки с настройкой with Coverage.