Подтвердить что ты не робот

Тест огурца 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, это также будет приемлемым.

4b9b3361

Ответ 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);
     }
}