Итак, ты уже разобрался с глобальной конфигурацией, валидацией настроек и накодил свой степ. Пришло время его протестировать (а можно было и начать с тестов, кстати).
Есть два основных способа тестирования плагинов. В зависимости от выполняемых функций, можно протестировать плагин как отдельную сущность или в контексте работающего инстанса Jenkins. Для первого способа нам понадобятся моки. Много моков. Билд степу требуется много всякого контекста для выполнения - глобальные настройки Jenkins и плагина, настройки самого степа, переменные окружения и т.п. Вот примерный список:
public class MyPluginBuildStepTest {
AbstractBuild build = mock(AbstractBuild.class);
Launcher launcher = mock(Launcher.class);
BuildListener listener = mock(BuildListener.class);
PrintStream logger = mock(PrintStream.class);
EnvVars env = mock(EnvVars.class);
AbstractProject project = mock(AbstractProject.class);
}
Дальше нужно настроить возвращаемые моками значения и можно выполнять наш степ:
@Test
public void myBuildStepExecutedSuccessfully() {
MyBuildStep buildStep = new MyBuildStep();
boolean result = buildStep.perform(build, launcher, listener);
assertThat("Build step should not fail", result, equalTo(true));
}
Этот способ близок к юнит-тестам - выполняется быстро, тестируется работа отдельных классов/методов. Его недостаток в том, что для проверки некоторых случаев требуется много первоначальной настройки.
Иногда лучше пожертвовать скоростью в пользу простоты и написать интеграционный тест. Для этого есть jenkins-рула, которая представляет собой конфигурируемый in-memory инстанс Jenkins. Тот же тест с использованием этой рулы будет выглядеть так:
@Rule
public JenkinsRule jenkins = new JenkinsRule();
@Test
public void myBuildStepExecutedSuccessfully() {
FreeStyleProject project = jenkins.createFreeStyleProject();
project.getPublishersList().add(new MyBuidStep());
FreeStyleBuild build = project.scheduleBuild2(0).get();
assertThat("Build should not fail",
build.getResult(),
equalTo(Result.SUCCESS));
}
Как видишь - никаких моков, честный Jenkins, честная джоба в нём, честный билд со всем окружением. Jenkins-рула берёт на себя заботу обо всём окружении и код получается лаконичней, но выполняется это всё ощутимо дольше. Как всегда, лучшим вариантом является комбинирование этих подходов в зависимости от тестируемой функциональности.
comments powered by Disqus