Пишем плагин для Jenkins - тестирование

Пишем плагин для Jenkins - тестирование

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

Есть два основных способа тестирования плагинов. В зависимости от выполняемых функций, можно протестировать плагин как отдельную сущность или в контексте работающего инстанса 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