Мы разрабатываем приложение командной строки 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.
Мы явно что-то упускаем, поскольку наша ситуация с тестированием не является необычной! Любые предложения высоко ценятся.