Рубрики
Без рубрики

Тестирование REST с несколькими типами MIME

Тестирование службы REST с несколькими типами средств массовой информации/представлениями.

Автор оригинала: Eugen Paraschiv.

Тестирование REST с несколькими типами MIME

1. Обзор

Эта статья будет сосредоточена на тестировании службы REST с несколькими типами средств массовой информации/представлениями.

Мы напишем интеграционные тесты, способные переключаться между несколькими типами представлений, поддерживаемых API. Цель состоит в том, чтобы иметь возможность запустить точно такой же тест, потребляющий точно такие же URL-адреса службы, просто попросив другой тип мультимедиа.

2. Цели

Любой API REST должен выставлять свои ресурсы в качестве представлений, используя один или несколько типов мультимедиа. Клиент установит Примите заголовок для выбора типа представления, который он запрашивает у службы.

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

Таким образом, если клиент просит приложение/xml , то он должен получить XML представление ресурса. И если он попросит приложение/json , то он должен получить JSON.

3. Тестирование инфраструктуры

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

public interface IMarshaller {
    ...
    String getMime();
}

Тогда нам нужен способ инициализации правильного маршала на основе той или иной формы внешней конфигурации.

Для этого мы будем использовать весенний ФабрикаБин инициализировать marshaller и простое свойство, чтобы определить, какой marshaller использовать :

@Component
@Profile("test")
public class TestMarshallerFactory implements FactoryBean {

    @Autowired
    private Environment env;

    public IMarshaller getObject() {
        String testMime = env.getProperty("test.mime");
        if (testMime != null) {
            switch (testMime) {
            case "json":
                return new JacksonMarshaller();
            case "xml":
                return new XStreamMarshaller();
            default:
                throw new IllegalStateException();
            }
        }

        return new JacksonMarshaller();
    }

    public Class getObjectType() {
        return IMarshaller.class;
    }

    public boolean isSingleton() {
        return true;
    }
}

Давайте посмотрим на это:

  • во-первых, Экологические абстракция введена весной 3.1 используется здесь – для получения дополнительной дополнительной на этом проверить подробная статья об использовании Свойства с весной
  • мы извлекаем test.mime свойство из среды и использовать его, чтобы определить, какой marshaller для создания – некоторые Java 7 включите string синтаксис на работе здесь
  • Далее, по умолчанию marshaller, в случае, если имущество не определено на всех, будет Jackson marshaller для поддержки JSON
  • наконец – это BeanFactory активен только в тестовом сценарии, так как мы используем @Profile поддержки, также введенной весной 3.1

Вот и все – механизм способен переключаться между маршалами на основе любой стоимости test.mime собственности.

4. JSON и XML Маршалловы острова

Двигаясь дальше, нам понадобится фактическая реализация marshaller – по одному для каждого поддерживаемого типа мультимедиа.

Для JSON мы будем использовать Джексон в качестве основной библиотеки:

public class JacksonMarshaller implements IMarshaller {
    private ObjectMapper objectMapper;

    public JacksonMarshaller() {
        super();
        objectMapper = new ObjectMapper();
    }

    ...

    @Override
    public String getMime() {
        return MediaType.APPLICATION_JSON.toString();
    }
}

Для поддержки XML маршалер использует XСтрим :

public class XStreamMarshaller implements IMarshaller {
    private XStream xstream;

    public XStreamMarshaller() {
        super();
        xstream = new XStream();
    }

    ...

    public String getMime() {
        return MediaType.APPLICATION_XML.toString();
    }
}

Обратите внимание, что эти marshallers не весенние бобы сами . Причина этого в том, что они будут bootstrapped в весенний контекст TestMarshallerFactory; нет необходимости делать их компонентами напрямую.

5. Потребление услуг как с JSON, так и с XML

На этом этапе мы должны иметь возможность проработать полный интеграционный тест против развернутой службы. Использование маршала просто: мы вводим Имаршаллер в тест:

@ActiveProfiles({ "test" })
public abstract class SomeRestLiveTest {

    @Autowired
    private IMarshaller marshaller;

    // tests
    ...

}

Весна будет решать точный marshaller вводить на основе стоимости test.mime свойство.

Если мы не предоставляем значение для этого свойства, TestMarshallerFactory будет просто отступить на маршала по умолчанию – JSON marshaller.

6. Мейвен и Дженкинс

Если Maven настроен для времени интеграционных тестов в отношении уже развернутой службы REST, мы можем запустить его с помощью:

mvn test -Dtest.mime=xml

Или, если это сборка использует интеграционный тест фаза жизненного цикла Maven:

mvn integration-test -Dtest.mime=xml

Для получения более подробной информации о том, как настроить сборку Maven для запуска интеграционных тестов, см.

С Jenkins, мы должны настроить работу с:

This build is parametrized

И Строка параметр : test.mime-xml Добавили.

Общей конфигурацией Jenkins было бы то, что заданиям, запуская один и тот же набор интеграционных тестов против развернутой службы , один с XML, а другой с представлениями JSON.

7. Заключение

Эта статья показала, как протестировать API REST, который работает с несколькими представлениями. Большинство API публикуют свои ресурсы под несколькими представлениями, поэтому тестирование всех этих данных имеет жизненно важное значение. Тот факт, что мы можем использовать точно такие же тесты по всем из них просто здорово.

Полную реализацию этого механизма – с помощью фактических интеграционных тестов и проверки представлений XML и JSON – можно найти в проект GitHub .