Тест огурца a Spring Загрузка приложения
Кто-нибудь знает, где я могу найти пример приложения, в котором Cucumber используется для тестирования приложения Spring Boot через Gradle? Я могу хорошо запускать тесты, начиная с сервера на линии cmd и используя мою IDE, но мне нужно иметь возможность запускать их программно на сервере CI. Я видел ответ здесь, но это решение не сработало для меня, скорее всего, потому что у меня есть несколько файлов с несколькими шагами.
Вот моя настройка
build.grade(упоминается в другом вопросе)
testCompile ("org.springframework.boot:spring-boot-starter-test",
...
"info.cukes:cucumber-spring:${cucumberVersion}")
CucumberTest.java
@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest{
}
AbstractSpringTest.java(расширен всеми файлами StepDef)
@SpringApplicationConfiguration(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
@Ignore
public abstract class AbstractSpringTest
{ ... }
Это не делает правильную вещь при запуске, потому что она 1. пытается инициализировать мои файлы def def и 2. Мое приложение не запускается, и тесты огурца не могут установить соединение.
Спасибо.
EDIT: Или, если кто-то скажет мне, как запустить и остановить приложение с помощью gradle, это также будет приемлемым.
Ответы
Ответ 1
Я решил проблему с помощью этого вопроса.
Вот репозиторий с ответом:
https://github.com/jakehschwartz/spring-boot-cucumber-example
Короче говоря, класс AbstractSpringTest
должен иметь следующие аннотации:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DemoApplication.class, loader = SpringApplicationContextLoader.class)
@WebAppConfiguration
@IntegrationTest
Ответ 2
У меня был подобный симптом, мой огурец не запускал контекст Spring...
Оказывается, я пропустил (одну из) следующие зависимости:
build.gradle
testCompile "info.cukes:cucumber-junit:1.2.4"
testCompile "info.cukes:cucumber-java:1.2.4"
testCompile "info.cukes:cucumber-spring:1.2.4"
StepDefs.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
loader = SpringApplicationContextLoader.class,
classes = Application.class
)
@WebIntegrationTest(randomPort = true)
public class StepDefs {
@Value("${local.server.port}")
int port;
}
Обновление: SpringBoot 1.5.1
@ContextConfiguration(
loader = SpringBootContextLoader.class,
classes = Application.class
)
Ответ 3
В дополнение к @jakehschwartz, если вы хотите, чтобы веб-приложение запускалось на случайном доступном порту, для функции AbstractSpringTest необходимо:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class, loader = SpringApplicationContextLoader.class)
@WebIntegrationTest({"server.port=0"})
public abstract class AbstractSpringTest {
@Value("${local.server.port}")
protected int serverPort;
...}
Ответ 4
Я сделал что-то вроде этого, чтобы получить Spring для работы с параметризованными тестами JUnit. Это должно быть то же самое понятие для огурца, но я не пробовал. Я использовал XML-конфигурацию, чтобы это могло изменить ситуацию.
RunWithSpringJUnit4
public abstract class RunWithSpringJUnit4 {
private TestContextManager testContextManager;
public RunWithSpringJUnit4() {
try {
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
} catch (Exception e) {
e.printStackTrace();
}
}
}
CucumberTest
@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest extends RunWithSpringJUnit4 {
}
Ответ 5
Во-первых, вам нужно убедиться, что применяется spring -boot в gradle. Вызвать gradle build
, который будет создавать запущенную банку. Вместо того, чтобы ваш манифест вызывать класс Spring в качестве основного, у вас есть обертка, которая запускает его в потоке, ждет, пока он опустится и запустит Cucumber:
@RunWith(Cucumber.class)
public class LucasePsCucumberTest implements Runnable {
public static void main(String[] args) {
Thread t = new Thread(this);
t.start();
// wait for t
cucumber.api.cli.Main(null);
}
}