Как проверить приложение консоли Java с Maven?

Эти тесты должны запускать после , созданный файл jar. Они должны проверить, работает ли он вообще, и независимо от того, производит ли он корректный вывод консоли при определенных входных файлах.

Не могли бы вы указать на некоторые примеры таких тестов для консольных приложений? Должны ли эти тесты записываться на Java для использования с Maven?

Существует аналогичный вопрос ( Тестирование консольных приложений/программ - Java ), но мне нужно тестирование Blackbox, а не модульное тестирование. И он не упоминает Maven.


<Сильный> UPDATE:

It turned out that it vas very easy to do. My first problem was a misconception of integration tests after seeing so many definitions here (What is Unit test, Integration Test, Smoke test, Regression Test?; What's the difference between unit, functional, acceptance, and integration tests?; What are unit testing and integration testing, and what other types of testing should I know about?; What is an integration test exactly?). The second problem was that I did not intend to write these test in Java, but in the end I had to learn how to use java.lang.Runtime.

Прежде всего, я добавил это в свой pom.xml :


    maven-failsafe-plugin
    2.6
    
        
            
                integration-test
                verify
            
        
    

Затем я создал файл * IT.java в src/test/java :

public class MyAppIT {

    @Test
    public void test() throws IOException {
        Runtime runtime = Runtime.getRuntime();
        String cmd = "java -cp target/myapp.jar my.app.Main";
        Process process = runtime.exec(cmd);
        InputStreamReader isr = new InputStreamReader(process.getErrorStream());
        BufferedReader br = new BufferedReader(isr);
        Boolean containsUsage = false;
        String line;
        while ((line = br.readLine()) != null) {
            if (line.contains("Usage")) {
                containsUsage = true;
            }
        }
        assertTrue(containsUsage);
    }
}

Теперь я использую mvn verify вместо mvn package .

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
2
nl ja de

2 ответы

Кажется, вы хотите интегрировать тестирование.

Во многих случаях приложение создается системой непрерывной интеграции (CI), такой как Hudson, Travis или sth. Этот CI компилирует и запускает модульные тесты после каждой фиксации на исходный код. После успешной компиляции запускаются проекты интеграции-тестирования.

Интеграционные тесты находятся в отдельном проекте источника maven. Вы бы создали интеграционные тесты-классы, такие как обычные модульные тесты в src/test/java. Конечно, вы не тестируете отдельный класс по отдельности - это модульное тестирование - вы настраиваете свою систему для тестирования интеграции (проводьте правильные компоненты) и выполняете необходимые тесты «тест дыма».

Таким образом, в вашем случае вы можете создать еще один проект для тестирования интеграции и выполнить его после сборки вашего приложения. Вы можете создать родительский помпа maven и использовать подмодули, чтобы избежать ручной интеграции-тестирования-сборки.

Тест-классы должны быть java и расположены в src/test/java, они выглядят как обычные модульные тесты и управляются maven. Конечно, вы можете запустить не-java-программу в этих тестах и ​​утвердить результат.

Консольное приложение имеет « основной » метод, поэтому я бы назвал основной метод в тесте. В противном случае вам нужно запустить команду оболочки или что-то в этом роде. (через java.lang.Runtime)

В тестировании консольных приложений нет специальности. Если вы не хотите протестировать пользовательский интерфейс - автоматическое тестирование пользовательских интерфейсов непросто и сложнее, пожалуйста, уточните, является ли это вашим фокусом.

3
добавлено
Да, я хочу проверить, действительно ли программа работает, а не при использовании метода « main ». Я бы не назвал это тестирование интерфейса для моей программы, не позволяющей взаимодействовать с пользователем. Он просто обрабатывает входные файлы и выводит результаты.
добавлено автор utapyngo, источник
Вызов командной строки вызывает вызов основного метода. Вы можете использовать Runtime для выполнения команды «java my.app.Main», у вас есть полные возможности java в тестовом проекте.
добавлено автор burna, источник
не удовлетворены - остались вопросы?
добавлено автор burna, источник

Я бы рекомендовал использовать maven-invoker-plugin в сочетании с exec-maven-plugin . Invoker создает подпроект и запускает его, где плагин exec запускает JAR. Затем invoker проверяет его вывод.

Например, взгляните на это pom.xml в проекте s3auth-relay . Сам модуль создает консольное приложение JAR, которое является демоном HTTP. pom.xml является частью конфигурации maven-invoker-plugin . Он запускает консольное приложение и проверяет, изящно ли он отключается. Чтобы предотвратить запуск JAR в качестве демона, мы используем необязательный флаг -d .

В примере не показана возможность проверки вывода JAR, но это можно сделать с помощью post build script механизм maven-invoker-plugin .

1
добавлено
Пока ваше консольное приложение не требует ввода пользователя, maven-invoker-plugin идеально подходит
добавлено автор yegor256, источник
Конечно, я только что обновил ответ
добавлено автор yegor256, источник
Да, только если он изящно выключается. Я обновил свой ответ, чтобы показать возможность анализа его вывода.
добавлено автор yegor256, источник
К сожалению, maven-invoker-plugin предназначен для запуска Maven как части для интеграционных тестов для maven-plugins, в частности, но не для консольного приложения.
добавлено автор khmarbaise, источник
Есть ли у вас примеры использования?
добавлено автор khmarbaise, источник
Насколько я понимаю, этот подход может только проверить, действительно ли приложение выполняется, а изящно отключается , не более того. Таким образом невозможно проанализировать его выход. Я прав?
добавлено автор utapyngo, источник
QA — вакансии и аналитика рынка вакансий
QA — вакансии и аналитика рынка вакансий
5 668 участник(ов)

Вакансии и поиск работы в сфере QA. Вопросы: @qa_ru Про деньги: @qa_fin При размещении вакансии указывать: - должность - компанию - требования к кандидату - условия и ЗП хэштеги: #город #типзанятости

QA — русскоговорящее сообщество
QA — русскоговорящее сообщество
3 625 участник(ов)

Общаемся про все виды тестирования и его автоматизацию. Без мата, грубостей и провокаций. События: @qaevents Вакансии: @qa_jobs Автоматизаторы: @qa_automation Слухи про компании: @qa_bad_company

pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

QA juniors
QA juniors
2 720 участник(ов)

Добро пожаловать в чат джуниоров QA! Общаемся обо всём, что связано с тестированием и не только :) В чате царит дружественная атмосфера, поэтому общаемся без мата, грубостей. @qa_automation - автоматизация @serious_tester - для тестировщиков и QA

QA - Bad Company!
QA - Bad Company!
2 602 участник(ов)

Позитив и негатив про компании или курсы, куда не стоит идти работать или учиться, а куда стоит. За пиратский контент - бан. @qa_fin о деньгах Русскоговорящее сообщество: @qa_ru Флудилка: @qaFlood Вакансии: @qa_jobs Финансы: @qa_fin

QA — Автоматизация
QA — Автоматизация
2 434 участник(ов)

1. Обсуждение технологий автоматизированного тестирования 2. Помощь начинающим Ru-сообщество: @qa_ru Джуночат: @qajuniors Вакансии: @qa_jobs Финансы: @qa_fin Митапы и события: @qaevents Паблики: @serious_tester, @automation_remarks, @atinfo

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

QA - Finance
QA - Finance
1 347 участник(ов)

Чат о деньгах тестировщиков. ЗП, релокейты,оферы. @qa_bad_company - обсуждение компаний/курсов и карьерного роста для QA @qa_automation - авто QA Холивары, политика, религия-бан Реклама, спам, оскорбления - бан Для флуда используйте другой чат

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async