Написание тестов для методов библиотек#
Пререквезиты при написании тестов для методов библиотек, расположенных в директории ru/sbrf/devops:
Актуальная версия SMDL.Core.
Подключенный фреймворк Gradle.
Заполненный build.gradle с логином/паролем для подключения к хранилищу зависимостей. Нельзя производить commit заполненного build.gradle в репозиторий.
Выполненная команда
gradle build. В результате выполнения которой, будут загружены и подключены все необходимые зависимости для написания тестов.
Написание теста:
Cоздать в директории
src/test/groovyдиректорию с именем библиотеки (если она отсутствует).Создать файл типа
GroovyClassв директории, созданной на предыдущем шаге, название которого должно удовлетворять маскеTest${название метода, первая буква метода в верхнем регистре}.

Рисунок. Структура директорий для теста метода
Использовать шаблон класса теста:
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.
Описать все тесты в классе теста, которые максимально возможно будут покрывать код метода библиотеки.
При написании тестов следует взять за правило, что все взаимодействия с другими библиотеками, с другими методами библиотеки или системами принимаются за успешные. Поэтому нужно писать 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.