Pax Exam, как запустить несколько контейнеров

Для проекта, над которым я работаю, у нас есть необходимость в написании интеграционных тестов PaxExam, которые выполняются на нескольких контейнерах Karaf.

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

Это нужно для проверки производительности и прочего.

Кто-нибудь знает что-нибудь об этом? Это действительно возможно в PaxExam?

1 ответ

Решение

Я пишу ответ сам, найдя эту интересную статью.

В частности, посмотрите разделы Использование интегрированных тестов оболочки Karaf и распределенной интеграции в Karaf.

http://planet.jboss.org/post/advanced_integration_testing_with_pax_exam_karaf

Это в основном то, что говорится в статье:

Прежде всего, вы должны изменить заголовок тестового зонда, чтобы динамический пакет

@ProbeBuilder
public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
    probe.setHeader(Constants.DYNAMICIMPORT_PACKAGE, "*;status=provisional");
    return probe;
}

После этого в статье предлагается следующий код, способный выполнять команды в оболочке Karaf.

@Inject 
CommandProcessor commandProcessor;

protected String executeCommands(final String ...commands) {
    String response;
    final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    final PrintStream printStream = new PrintStream(byteArrayOutputStream);
    final CommandSession commandSession = commandProcessor.createSession(System.in, printStream, System.err);
    FutureTask<string> commandFuture = new FutureTask<string>(
            new Callable<string>() {
                public String call() {
                    try {
                        for(String command:commands) {
                         System.err.println(command);
                         commandSession.execute(command);
                        }
                    } catch (Exception e) {
                        e.printStackTrace(System.err);
                    }
                    return byteArrayOutputStream.toString();
                }
            });

    try {
        executor.submit(commandFuture);
        response =  commandFuture.get(COMMAND_TIMEOUT, TimeUnit.MILLISECONDS);
    } catch (Exception e) {
        e.printStackTrace(System.err);
        response = "SHELL COMMAND TIMED OUT: ";
    }

    return response;
}

Тогда все остальное будет тривиально, вам нужно будет реализовать слой, способный запустить дочерний экземпляр Karaf.

public void createInstances() {
    //Install broker feature that is provided by FuseESB
    executeCommands("admin:create --feature broker brokerChildInstance");
    //Install producer feature that provided by imaginary feature repo.
    executeCommands("admin:create --featureURL mvn:imaginary/repo/1.0/xml/features --feature producer producerChildInstance");
    //Install producer feature that provided by imaginary feature repo.
    executeCommands("admin:create --featureURL mvn:imaginary/repo/1.0/xml/features --feature consumer consumerChildInstance");

    //start child instances
    executeCommands("admin:start brokerChildInstance");
    executeCommands("admin:start producerChildInstance");
    executeCommands("admin:start consumerChildInstance");

    //You will need to destroy the child instances once you are done.
    //Using @After seems the right place to do that.
}
Другие вопросы по тегам