Во-первых, что утверждает? Утверждение — это предикат (утверждение «истина-ложь»), помещенный в программу, чтобы указать, что разработчик считает, что предикат всегда верен в этом месте. [Википедия]
Традиционные утверждения
Традиционные рамки тестирования начинались со встроенного ключевого слова assert .
Пример ключевого слова assert :
assert <condition> value
У Assert есть несколько недостатков, включая остановку выполнения теста, а также длинные и трудные для описания утверждения assert.
Утверждения второго поколения
Наряду с этим утверждают рамки JUnit. Построенный на основе ключевого слова assert , JUnit предоставил разработчикам возможность более подробно описывать утверждения тестирования.
Пример утверждений JUnit:
// asserts that the condition must be true assertTrue("This should be true", "abc".equalsIgnoreCase("ABC")); // asserts that the object must not be null assertNotNull(new MyObject()); //... assertFalse(false == true); // assertNull(null); // etc...
Хотя есть некоторые улучшения по читаемости и практичности к основному утверждают , ключевое слово предоставляемых JUnit, они разделяют некоторые из тех же недостатков , в том , что многие разработчики просто использовать « assertTrue () », « assertEquals () » и « assertFalse () » методы по-прежнему обеспечивает очень загадочное утверждение утверждения.
Утверждения третьего поколения
В попытке направить разработчиков на написание тестовых утверждений, которые были бы более удобочитаемыми и пригодными для использования, была создана библиотека Hamcrest, которая переключила философию со многих функций утверждения на одну базовую функцию. Основная мысль заключается в том, что утверждение такое же, но условия изменятся. Hamcrest был построен с использованием концепций BDD (дизайн, основанный на поведении), где утверждение теста ближе к предложению.
Пример утверждений подколенного сухожилия:
@Test public void showoffSomeHamcrestAssertsAndMatchers() { // asserts that string "abc" is "ABC" ignoring case assertThat("abc", is(equalToIgnoringCase("ABC"))); assertThat(myObject.getFirst(), is("Mike!")); assertThat(myObject.getAddress(), is(notNullValue)); }
Hamcrest — это отличное усовершенствование платформы JUnit, обеспечивающее гибкую и удобочитаемую платформу для тестирования. Hamcrest + JUnit — это комплексная среда тестирования, которая в сочетании с Mockito (или другой системой моделирования ) может обеспечить очень наглядное и полное решение для модульного тестирования. Один из недостатков использования Hamcrest заключается в том, что, хотя он описательный, необходимо сделать несколько утверждений, чтобы обеспечить охват тестового примера. Многие чистые TDD согласны, что контрольный пример должен содержать одно-единственное утверждение, но как это возможно для сложного объекта? (Чистейший скажет рефакторинг, но часто это неосуществимо)
Фреймворки четвертого поколения
И, наконец, мы подошли к настоящему с новейшими структурами утверждений. Фреймворк Fest Assertion начинает работать там, где Hamcrest прекратил предоставлять фреймворк свободного стиля, предоставляющий разработчику возможность тестировать объекты с помощью одного утверждения.
Пример утверждений Феста:
@Test public void getAddressOnStreet() { List<Address> addresses = addressDAO.liveOnStreet("main"); assertThat(addresses).hasSize(10).contains(address1, address2); assertThat(stringObj).hasSize(7).isEqualToIgnoringCase("abcdefg"); }
Как видите, исключения FEST обеспечивают более четкий подход к утверждениям. FEST очень расширяемый и простой в использовании.
Вывод
Утверждения являются ключевым инструментом в наборе инструментов профессионального разработчика, в котором стресс-тестирование их кода. Этот пост является частью серии, кульминацией которой является свободный стиль механизма ExpectedException, поддерживаемый Fest, в котором для большей ясности в ваших тестовых случаях, когда вводятся исключения. Не стесняйтесь читать руководство до этого поста; Разрешение известным ошибочным тестам JUnit проходить тестовые случаи .
ПРИМЕЧАНИЕ. В этом блоге представлен обзор платформ утверждений. Следует отметить, что существуют различные другие среды тестирования второго и третьего поколений, которые стремятся обеспечить лучшую ясность и удобство использования для тестирования, в том числе такие известные, как TestNG и JTest .