Это повторная публикация моей статьи на Medium.com с надеждой охватить больше разработчиков OSS в рамках #Hacktoberfest.
Приходилось ли вам когда-нибудь сталкиваться с нестабильными распараллеленными тестами, которые большую часть времени проходят успешно, но затем внезапно начинают терпеть неудачу с непоследовательными случайными ошибками? Вам когда-нибудь приходилось исправлять тесты, использующие одни и те же файлы ресурсов, и параллельно изменять их, чтобы запутать вас и результаты других ваших тестов? Вы провели бесчисленное количество ночей, пытаясь реорганизовать такой код, чтобы его можно было правильно распараллелить и получить воспроизводимые и гарантированные результаты?
Это сложная тема, которую не всегда легко решить, особенно в существующих больших базах кода. Однако следование простому набору правил может помочь вам в этом, и платформа Carlspring/idempotence призвана помочь в этом.
Чтобы тесты постоянно воспроизводились, вам необходимо убедиться, что их файлы ресурсов содержатся и изолированы только для них. Это означает, что каждый тест должен владеть исключительно своими тестовыми ресурсами, и другие тесты не должны их изменять.
Идемпотентность тестов означает, что ваши тесты всегда будут возвращать одни и те же результаты. Неважно, сколько раз они выполнялись и какие другие тесты выполнялись параллельно.
Это облегченная платформа, которая помогает изолированно определять и копировать файлы ресурсов тестов для ваших тестов JUnit5. Тестовые ресурсы определяются с помощью аннотаций и копируются в свои собственные каталоги, чтобы облегчить реализацию разделения и изоляции тестовых ресурсов.
Все общие тестовые ресурсы, как обычно, хранятся в каталоге src/test/resources. Затем каждый метод тестирования определяет необходимые ему ресурсы с помощью аннотации @TestResources. Платформа копирует эти ресурсы в изолированный каталог для каждого метода тестирования. Это гарантирует, что он имеет эксклюзивный доступ к необходимым ресурсам, предотвращая помехи от других тестов, выполняемых параллельно, включая другие методы тестирования в том же тестовом классе.
Для каждого инструмента сборки существует отдельная зависимость, которая содержит логику преобразования, связанную с путем, для конкретного макета каталога этого инструмента. (В качестве очень упрощенного примера, среди прочего. Maven помещает собранный код под target, тогда как Gradle использует для этой цели сборку; ресурсы размещаются по-другому и т. д.). Подробнее об этом будет рассказано ниже.
Вот шаг, с которого вам нужно начать.
Вам нужно будет определить соответствующую зависимость для вашего инструмента сборки. Вы можете проверить, какая последняя выпущенная версия здесь.
testImplementation "org.carlspring.testing.idempotence:idempotence-gradle:1.0.0-rc-3"
testImplementation("org.carlspring.testing.idempotence:idempotence-gradle:1.0.0-rc-3")
org.carlspring.testing.idempotence idempotence-maven 1.0.0-rc-3 test
Ваш тестовый класс должен быть помечен аннотацией @ExtendWith(TestResourceExtension.class). Эта аннотация отвечает за фактическое копирование ресурсов.
Вам также потребуется пометить свои тестовые методы аннотацией @TestResources, чтобы указать необходимые им ресурсы.
Например:
package com.foo; import org.carlspring.testing.idempotence.annotation.TestResource; import org.carlspring.testing.idempotence.annotation.TestResources; import org.carlspring.testing.idempotence.extension.TestResourceExtension; @ExtendWith(TestResourceExtension.class) class MyTest { @Test @TestResources({ @TestResource(source = "classpath:/foo.txt"), @TestResource(source = "classpath*:/**/bar.txt")} ) void testFoo() { // Perform whatever checks you need using these resources } }
Для каждого метода тестирования будет создан каталог следующего формата:
build/test-resources/MyTest-testFoo/nested/dir/foo.txt build/test-resources/MyTest-testFoo/bar.txt
target/test-resources/MyTest-testFoo/nested/dir/foo.txt target/test-resources/MyTest-testFoo/bar.txt
Таким образом, ваши тесты будут иметь необходимый им ресурс, скопированный в их собственные изолированные каталоги. На этом этапе вы можете изменить эти тестовые ресурсы из методов тестирования, к которым они принадлежат, и ваши результаты должны быть идемпотентными, при условии, что они зависят только от файловых ресурсов, а не от других типов общих ресурсов (база данных, сторонние службы и т. д.).
Документацию проекта Idempotence можно найти здесь.
Вы можете просмотреть концептуальный обзор для более подробного объяснения того, как все работает.
Это новый проект с уже готовыми основными функциями и инфраструктурой, но помощь всегда приветствуется.
Участники, имеющие опыт работы с JUnit, Springframework, MkDocs, могут помочь сформировать проект, предложив несколько замечательных идей и решений. Мы также приветствуем первых пользователей, которые могут оставить отзыв!
Проблемы с пометкой «Хактоберфест» или «Требуется помощь» доступны и помогут вам быстро приступить к работе. Вы можете найти их здесь.
Одна из самых важных вещей при написании тестовых примеров — это тестовые данные, которые будут использовать ваши тесты, и поддержание их в нормальном состоянии между запусками. Следуя набору простых правил, позволяющих изолировать эти данные между тестами, вы можете добиться идемпотентности и надежности своих результатов.
Проект Carlspring/idempotence предоставляет простую в использовании структуру, которая подходит как для новых проектов, так и для старых проектов рефакторинга.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3