Запуск консольной программы в другом проекте: два способа тестирования

При тестировании консольных Java-приложений может возникнуть необходимость запускать их внутри тестового проекта. Я приведу два способа выполнения этой задачи, которые я нашла.

1. Добавление в локальный репозиторий и использование через зависимость

Этот способ позволяет добавить консольное приложение в локальный репозиторий Maven и использовать его как зависимость в проекте с тестами.

1. Для начала нужно установить консольное приложение в локальный репозиторий maven.

  • Переходим в директорию проекта с консольным приложением где храниться pom.xml файл. Чаще всего это корневая директория проекта.
  • Выполняем команду
mvn clean install

2. Добавляем зависимость в проект с тестами.
Теперь, когда артефакт установлен в локальный репозиторий, добавьте его как зависимость в pom.xml тестового проекта:
Пример:

<dependency> <groupId>practice.avtotes</groupId> <artifactId>my-project-java</artifactId> <version>1.0</version> </dependency>

Данные, которыми нужно заполнить, берем из pom.xml в консольном приложении.

3. Запуск приложения в коде:

В коде можно запустить консольное приложение следующим образом:

MenuConsoleApp.main(new String[]{});

Однако в таком случае программа будет выполняться в текущем потоке Java-процесса и не сможет получать пользовательский ввод через System.in. Наверняка есть способы получать пользовательский ввод, но я их не рассматривала.

2. Использование Maven-плагина exec-maven-plugin

Тут я выделю еще два разных способа запуска приложения в тестах.

Способ 1. Запуск консольного приложения в проекте с тестами с использованием jar файла из локального репозитория maven.

1. Для начало нужно добавить консольное приложение в локальный репозиторий maven. Этот пункт был рассмотреть в примере выше.

2. В pom.xml добавить плагин

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

<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>practice.autotest.MyApp</mainClass> </configuration> </plugin>

3. В pom.xml добавить зависимость с проектом консольного приложения.

<dependency> <groupId>practice.avtotes</groupId> <artifactId>my-project-java</artifactId> <version>1.0-SNAPSHOT</version> </dependency>

4. Запустить приложение в программе с тестами

mvn exec:java

Способ 2. Запуск консольного приложения в проекте с тестами с прямым указанием пути на jar файл.

1. Нужно собрать jar файл с консольной программой.
Для удобства я положила его в проект с тестами, но можно в другое место. Сделать это можно используя интерфейс intellij idea или средства maven.
Я использую интерфейс, мне так удобнее.

2. Добавляем зависимость на проект с консольной программой в pom.xml в проекте с тестами с указанием пути до jar файла в systemPath.

<dependency> <groupId>practice.avtotes</groupId> <artifactId>my-app</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/my_console_app_jar/my-console-app.jar</systemPath> </dependency>

3. Добавляем плагин mvn-exec как было описано выше.

4. Пример запуска.
Я запускала саму консольную программу используя expect скрипты для запуска программы используя TestNG.

Пример простого скрипта:

#!/usr/bin/expect set name "Vasya" spawn mvn exec:java expect "Введите ваше имя:" send "$name\r" //тут различные проверки

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

@Test(description = "Проверяем имя") public void checkName() { try { runExpectScript(GET_NAME); //ваша логика по запуску скриптов } catch (CustomExceptionErrorApp e) { fail(e.getMessage()); } }

Можно запустить тест из проекта с тестами просто используя команду:

mvn test

Все представленные способы позволяют запускать консольное приложение в тестовом проекте, даже если оба проекта находятся в разных git репозиториях.

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

Второй метод полезен, если требуется запускать программу в отдельном процессе через Maven. Я использовала последний способ.

Это позволило запускать консольную программу для проверки ее с использованием expect скриптов, т.к. программа представляла из себя консольное меню по работе с файлом.

Начать дискуссию