Разница между webEnvironment = RANDOM_PORT и webEnvironment = MOCK - PullRequest
1 голос
/ 13 октября 2019

Я написал весенний тест интеграции загрузки, и он работает. Вот конфигурация теста:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureMockMvc
@Transactional
public class SomeTest {
   @Autowired
   private MockMvc mvc;

   @Test
   public void insertEventTest(){
      ...testing something...
   }

}

Я понимаю, что при установке webEnvironment = RANDOM_PORT spring инициализирует встроенный веб-сервер и запускает этот тест на этом веб-сервере. Я посмотрел журналы при запуске этого теста и увидел, что встроенный TomcatWebServer был запущен. Инициализация Tomcat занимает около 6 секунд, но между этими двумя частями журналов инициализировалось несколько других bean-компонентов, поэтому я уверен, что инициализация Tomcat была не 6, а менее чем 6 секундами. Одна часть журналов:

2019-10-13 16:03:20.065  INFO 8596 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 0 (http)
2019-10-13 16:03:20.098  INFO 8596 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-10-13 16:03:20.098  INFO 8596 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-10-13 16:03:20.108  INFO 8596 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
2019-10-13 16:03:20.228  INFO 8596 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext

... еще несколько журналов, а затем, наконец,

  2019-10-13 16:03:26.366  INFO 8596 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 38335 (http) with context path ''

Я запускаю тест 3 раза, и тестирование занимает 12, 11,4 и 12 секундполный. После этого я попытался установить @SpringBootTest(webEnvironment = MOCK). Я заметил, что на этот раз Tomcat не был инициализирован (веб-сервер был издевался над весной). Время выполнения составляло 11,3, 11 и 10,8 секунды. В обоих случаях все тесты были зелеными. Я думал о том, что я улучшу производительность своих тестов с помощью поддельного веб-сервера, но я получил 1 секунду. Если мы имеем в виду, что мой прикладной контекст кэшируется между тестовыми классами, я в принципе ничего не получил. Поэтому мой вопрос в том, в каких случаях тест пройдёт с @SpringBootTest(webEnvironment = RANDOM_PORT) и завершится неудачей с @SpringBootTest(webEnvironment = MOCK) или наоборот, и когда мне следует использовать RANDOM_PORT и когда MOCK?

1 Ответ

0 голосов
/ 13 октября 2019

Использование @SpringBootTest(webEnvironment = WebEnvironment.MOCK) загружает контекст веб-приложения и предоставляет имитацию веб-среды. Он не загружает реальный http-сервер, а просто имитирует поведение веб-сервера.

WebEnvironment.MOCK дает вам некоторые преимущества, такие как простота использования или изоляция других факторов, но это не может быть хорошей практикой интеграционных испытаний.

Интеграционные тесты должны быть максимально похожими на производственные. окружающая обстановка. Учитывая это, использование @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) было бы лучшим выбором. Этот подход ближе к тестированию реального приложения. Вы можете видеть, будет ли вся система работать должным образом.

Когда вы используете @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT), вы тестируете на реальном http-сервере. В этом случае вам нужно использовать TestRestTemplate. Это полезно, когда вы хотите протестировать некоторое окружающее поведение, связанное с веб-слоем.

TestRestTemplate - это удобная альтернатива SpringT RestTemplate, которая полезна в интеграционных тестах. ... если вы используете аннотацию @SpringBootTest с WebEnvironment.RANDOM_PORT или WebEnvironment.DEFINED_PORT, вы можете добавить полностью настроенный TestRestTemplate ... https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-rest-templates-test-utility

...