Я хочу выполнить тестовые методы, которые аннотируются @Test
в определенном порядке.
Например:
public class MyTest {
@Test public void test1(){}
@Test public void test2(){}
}
Я хочу убедиться, чтобы бежать test1()
раньшеtest2()
каждым запуском MyTest
, но я не смог найти аннотацию вроде @Test(order=xx)
.
Я думаю, что это очень важная функция для JUnit, если автору JUnit не нужна функция заказа , почему?
java
unit-testing
junit
junit4
远 声 远 Shengyuan Lu
источник
источник
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
, сохранять@Test
аннотации для всех методов тестирования и переименовывать их в алфавитном порядке в зависимости от желаемого порядка выполнения, напримерt1_firstTest()
,t2_secondTest()
и т. Д.Ответы:
Я не уверен, что есть чистый способ сделать это с помощью JUnit, насколько мне известно, JUnit предполагает, что все тесты могут выполняться в произвольном порядке. Из FAQ:
Почему это так? Что ж, я считаю, что создание порядка выполнения тестов - это практика, которую авторы не хотят продвигать. Тесты должны быть независимыми, они не должны быть соединены и нарушающим это будет сделать все труднее поддерживать, сломается возможность запускать тесты по отдельности ( что очевидно), и т.д.
При этом, если вы действительно хотите пойти в этом направлении, рассмотрите возможность использования TestNG, поскольку он поддерживает запуск методов испытаний в любом произвольном порядке (и такие вещи, как указание, что методы зависят от групп методов). Седрик Беуст объясняет, как это сделать в порядке выполнения тестов в testng .
источник
Если вы избавитесь от существующего экземпляра Junit и загрузите JUnit 4.11 или выше по пути сборки, следующий код выполнит методы тестирования в порядке их имен, отсортированных в порядке возрастания:
источник
@Inherited
и, следовательно, становится неэффективной для моегоAbstractTestCase
родительского класса.Если заказ важен, вы должны сделать заказ самостоятельно.
В частности, вы должны перечислить некоторые или все возможные варианты заказа для проверки, если это необходимо.
Например,
Или полный тест всех перестановок:
Вот
permute()
простая функция, которая перебирает все возможные перестановки в коллекцию массивов.источник
test2
запускаетсяtest1
снова . Джунит может все еще бежатьtest2
раньшеtest1
. Это, вероятно, не то, что вы хотели, и не правильный ответ на вопрос.Миграция на TestNG кажется лучшим способом, но я не вижу здесь четкого решения для jUnit. Вот наиболее читаемое решение / форматирование, которое я нашел для jUnit:
Это гарантирует, что методы stage2 вызываются после stage1 и перед stage3.
источник
0
префикс, напримерvoid stage01_prepareAndTest(){ }
Это одна из главных проблем, с которой я столкнулся, когда работал над Junit, и я нашел следующее решение, которое отлично работает для меня:
также создайте интерфейс как ниже:
Теперь предположим, что у вас есть класс A, в котором вы написали несколько тестов, как показано ниже:
Таким образом, выполнение начнется с метода с именем "method ()". Спасибо!
источник
@RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(OrderedRunner.class)
JUnit в настоящее время позволяет тестовым методам выполнять упорядочение с использованием аннотаций классов:
По умолчанию методы испытаний запускаются в алфавитном порядке. Итак, чтобы установить определенный порядок методов, вы можете назвать их как:
Вы можете найти примеры здесь .
источник
Изменение (пока не выпущенное) https://github.com/junit-team/junit/pull/386 представляет собой
@SortMethodsWith
. https://github.com/junit-team/junit/pull/293 по крайней мере сделал заказ предсказуемым без этого (в Java 7 он может быть довольно случайным).источник
@FixMethodOrder
@SortMethodsWith
Посмотрите на отчет JUnit. JUnit уже организован по пакетам. Каждый пакет имеет (или может иметь) классы TestSuite, каждый из которых, в свою очередь, запускает несколько тестовых случаев. Каждый TestCase может иметь несколько методов тестирования в форме
public void test*()
, каждый из которых фактически станет экземпляром класса TestCase, к которому они принадлежат. Каждый метод тестирования (экземпляр TestCase) имеет имя и критерии прохождения / неудачи.То, что требует мое руководство, так это концепция индивидуального TestStep элементов , каждый из которых сообщает свои критерии прохождения / неудачи. Сбой любого шага теста не должен препятствовать выполнению последующих шагов теста.
В прошлом разработчики тестов, занимающие мою должность, организовывали классы TestCase в пакеты, соответствующие частям тестируемого продукта, создавали класс TestCase для каждого теста и делали каждый метод тестирования отдельным «шагом» в тесте. дополнить его собственными критериями прохождения / неудачи в выходных данных JUnit. Каждый TestCase является отдельным «тестом», но отдельные методы или «шаги» теста в пределах TestCase должны выполняться в определенном порядке.
Методы TestCase были шагами TestCase, и разработчики тестов получали отдельный критерий прохождения / неудачи для каждого шага теста. Теперь шаги теста перепутаны, и тесты (конечно) не пройдены.
Например:
Каждый метод тестирования утверждает и сообщает свои собственные критерии прохождения / неудачи. Объединение этого в «один большой метод тестирования» для упорядочения теряет гранулярность критериев прохождения / сбоя каждого «шага» в сводном отчете JUnit. ... и это расстраивает моих менеджеров. В настоящее время они требуют другой альтернативы.
Может ли кто-нибудь объяснить, как JUnit с упорядоченным методом проверки теста будет поддерживать отдельные критерии прохождения / отказа каждого последовательного шага тестирования, как показано выше и требуется моим руководством?
Независимо от документации, я вижу в этом серьезную регрессию в среде JUnit, которая усложняет жизнь многим разработчикам тестов.
источник
Обновление JUnit 5 (и мое мнение)
По умолчанию библиотеки модульного тестирования не пытаются выполнять тесты в порядке, указанном в исходном файле.
JUnit 5 как JUnit 4 работает таким образом. Почему ? Потому что, если порядок имеет значение, это означает, что некоторые тесты связаны между собой, и это нежелательно для модульных тестов .
Таким образом,
@Nested
функция, представленная JUnit 5, следует тому же подходу по умолчанию.Но для интеграционных тестов порядок метода тестирования может иметь значение, так как метод тестирования может изменить состояние приложения так, как этого требует другой метод тестирования. Например, когда вы пишете интеграционный тест для обработки заказа в интернет-магазине, первый метод тестирования, который должен быть выполнен, - это регистрация клиента, второй - добавление товаров в корзину, а последний - оформление заказа. Если участник теста не соблюдает этот порядок, сценарий тестирования имеет недостатки и не будет выполнен.
Таким образом, в JUnit 5 (из версии 5.4) у вас все равно есть возможность установить порядок выполнения, пометив тестовый класс с помощью
@TestMethodOrder(OrderAnnotation.class)
и указав порядок@Order(numericOrderValue)
для методов, для которых этот порядок важен.Например :
Вывод :
Кстати, указание
@TestMethodOrder(OrderAnnotation.class)
выглядит ненужным (по крайней мере, в версии 5.4.0, которую я тестировал).Заметка по
поводу вопроса: является ли JUnit 5 лучшим выбором для написания интеграционных тестов? Я не думаю, что это должен быть первый инструмент, который следует рассмотреть (Cucumber и co часто могут принести более специфическую ценность и возможности для интеграционных тестов), но в некоторых интеграционных тестах достаточно инфраструктуры JUnit. Так что это хорошая новость, что эта функция существует.
источник
Не уверен, что согласен. Если я хочу проверить «Загрузка файла», а затем проверить «Данные, добавленные при загрузке файла», почему бы мне не захотеть, чтобы они были независимы друг от друга? Я думаю, что вполне разумно запускать их отдельно, а не в обоих тестовых примерах Голиафа.
источник
То, что вы хотите, вполне разумно, когда тесты запускаются как набор.
К сожалению, сейчас нет времени дать полное решение, но взгляните на класс:
Что позволяет вызывать тестовые наборы (из любого тестового класса) в определенном порядке.
Они могут быть использованы для создания функциональных, интеграционных или системных тестов.
В результате ваши модульные тесты остаются без определенного порядка (как рекомендуется), независимо от того, выполняете ли вы их так или нет, а затем повторно используете тесты как часть более широкой картины.
Мы повторно используем / наследуем один и тот же код для модульных, интеграционных и системных тестов, иногда на основе данных, иногда на основе фиксации, а иногда и в качестве пакета.
источник
Смотрите мое решение здесь: "Junit и Java 7."
В этой статье я опишу, как запускать тесты junit по порядку - «как в исходном коде». Тесты будут запущены, чтобы ваши методы тестирования появились в файле класса.
http://intellijava.blogspot.com/2012/05/junit-and-java-7.html
Но, как сказал Паскаль Тивент, это не очень хорошая практика.
источник
С помощью JUnit 5.4 вы можете указать порядок:
вам просто нужно аннотировать свой класс
https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order
Я использую это в своем проекте, и это работает очень хорошо!
источник
Я прочитал несколько ответов и согласен с тем, что это не лучшая практика, но самый простой способ заказать ваши тесты - и способ, которым JUnit запускает тесты по умолчанию, - это алфавитное имя по возрастанию.
Так что просто назовите ваши тесты в алфавитном порядке, который вы хотите. Также обратите внимание, что название теста должно начинаться со слова test. Просто следите за номерами
test12 будет запущен до test2
так:
testA_MyFirstTest testC_ThirdTest testB_ATestThatRunsSecond
источник
Пожалуйста, проверьте это: https://github.com/TransparentMarket/junit . Он запускает тест в указанном порядке (определенном в скомпилированном файле класса). Также он включает в себя пакет AllTests для запуска тестов, определенных в подпакете. Используя реализацию AllTests, можно расширить решение, также фильтруя свойства (мы использовали аннотации @Fast, но они еще не были опубликованы).
источник
Вот расширение к JUnit, которое может производить желаемое поведение: https://github.com/aafuks/aaf-junit
Я знаю, что это противоречит авторам философии JUnit, но при использовании JUnit в средах, где нет строгого модульного тестирования (как практикуется в Java), это может быть очень полезно.
источник
Я оказался здесь, думая, что мои тесты были выполнены не по порядку, но правда в том, что беспорядок был в моих асинхронных заданиях. При работе с параллелизмом вам необходимо также выполнять проверки параллельности между вашими тестами. В моем случае задания и тесты имеют общий семафор, поэтому следующие тесты зависают до тех пор, пока запущенное задание не снимет блокировку.
Я знаю, что это не полностью связано с этим вопросом, но, возможно, может помочь в определении правильного вопроса.
источник
Вы можете использовать один из этих кусков кода:
источник