Запуск сквозных тестов с помощью JUnit

Мы разрабатываем приложение командной строки Java, для которого мы хотели бы применить управляемые данными тесты из многих внешних файлов (свойств) И позволить некоторым знающим пользователям добавлять тесты, не касаясь кодовой базы Java. Конечно, мы хотим гарантировать, что каждый раз, когда мы запускаем приложение, оно запускается из чистого состояния (то есть без побочных эффектов статического класса, с чистой файловой средой...). Вот несколько вариантов:

(a) Запустите все тесты одним методом в одном классе JUnit, вызвав метод main() приложения:

@Test
public void appTest () {
    <get all properties files>
    <for each property file>
        String[] args = <construct command line from property file>
        MyApp.main (args);
        <test result>
     ...
}

не работает, так как все это работает в одной JVM.

(b) Запустите все тесты в одном методе, разветвившем приложение:

@Test
public void appTest () {
    <get all properties files>
    <for each property file>
        String[] args = <construct command line from property file>
        <fork app with args>
        <test result>
     ...
}

действительно дает нам отдельные JVM, но JUnit (и Surefire) не знают об отдельных тестах, поэтому отчеты довольно бесполезны.

(c) Один тест на класс JUnit:

public class MyAppTest1 {
private static final String PROP_FILE = "src/test/resources/myapp/myapp1.properties
@Test
public void appTest () {
       String[] args = <construct command line from PROP_FILE>
        MyApp.main (args);
        <test result> 
}

}

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

(d) параметризованные тесты JUnit (@RunWith(Parameterized.class) бесполезны, поскольку они выполняются в одной и той же JVM.

(e) Распараллеливание Surefire выполняется ВНУТРИ JVM.

Мы явно что-то упускаем, поскольку наша ситуация с тестированием не является необычной! Любые предложения высоко ценятся.


person apattin    schedule 07.03.2014    source источник
comment
Зачем вам нужно, чтобы каждый тест выполнялся в отдельной JVM?   -  person Tom Norton    schedule 15.03.2014
comment
Потому что есть некоторые статические классы. Да, я знаю, что статика - это нет-нет, но вот...   -  person apattin    schedule 17.03.2014
comment
Вы смотрели на агрегированные параметры для уверенных отчетов, используя решение b?   -  person CharlieS    schedule 20.10.2014


Ответы (1)


По крайней мере, частичный ответ: Surefire поддерживает разветвление каждого тестового примера. Попробуйте выполнить следующие действия в разделе «Надежная конфигурация»:

<reuseForks>false<reuseForks>
<forkCount>1<forkCount>

Подробнее об этом читайте на http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html

Для общей проблемы с «тестами, управляемыми данными», лучше всего подойдет специальный бегун Junit. Это не так сложно, как вы думаете, просто взгляните на пакет runners в исходном коде Junit https://github.com/junit-team/junit/tree/master/src/main/java./org/junit/runners и переопределить/расширить Parameterized Runner с использованием внешних данных.

person Chrstian Beutenmueller    schedule 20.10.2014