JavaRush /Курстар /All lectures for KY purposes /Тест сыноо аннотациялары JUnit Jupiter

Тест сыноо аннотациялары JUnit Jupiter

All lectures for KY purposes
Деңгээл , Сабак
жеткиликтүү

Төмөнкү аннотациялар SpringExtension жана JUnit Jupiter (б. а. JUnit 5 программалоо модели) менен колдонулганда колдоого алынат:

@SpringJUnitConfig

@SpringJUnitConfig – бул JUnit Jupiter`де @ExtendWith(SpringExtension.class) жана Spring TestContext Framework'дун @ContextConfiguration аннотацияларын бириктирген курама аннотация. Бул класстын деңгээлинде @ContextConfiguration ордуна колдонсо болот. Конфигурация параметрлерине келсек, @ContextConfiguration менен @SpringJUnitConfig аннотацияларынын ортосундагы жалгыз айырмачылык, @SpringJUnitConfig аннотациясында компонент класстары value атрибуту менен жаряланса болот.

Төмөнкү мисалда @SpringJUnitConfig аннотациясын конфигурация классы үчүн кантип колдонуу көрсөтүлгөн:

Java
@SpringJUnitConfig(TestConfig.class) 
class ConfigurationClassJUnitJupiterSpringTests {
    // класс денеси...
}
  1. Конфигурация классын беребиз.
Kotlin
@SpringJUnitConfig(TestConfig::class) 
class ConfigurationClassJUnitJupiterSpringTests {
    // класс денеси...
}
  1. Конфигурация классын беребиз.

Төмөнкү мисалда @SpringJUnitConfig аннотациясын конфигурация файлынын жайгашкан жери үчүн кантип колдонуу көрсөтүлгөн:

Java
@SpringJUnitConfig(locations = "/test-config.xml") 
class XmlJUnitJupiterSpringTests {
    // класс денеси...
}
  1. Конфигурация файлдын жайгашкан жери берилип жатат.
Kotlin
@SpringJUnitConfig(locations = ["/test-config.xml"]) 
class XmlJUnitJupiterSpringTests {
    // класс денеси...
}
  1. Конфигурация файлдын жайгашкан жери берилип жатат.

Кененирээк маалыматты "Контекстти башкаруу" бөлүмүнөн көрүңүз, ошондой эле @SpringJUnitConfig жана @ContextConfiguration боюнча javadoc көрө аласыз.

@SpringJUnitWebConfig

@SpringJUnitWebConfig – бул JUnit Jupiter`ден @ExtendWith(SpringExtension.class) аннотациясын жана Spring TestContext Framework`түн @ContextConfiguration жана @WebAppConfiguration аннотацияларын бириктирген курама аннотация. Бул класстын деңгээлинде @ContextConfiguration жана @WebAppConfiguration ордуна колдонсо болот. Конфигурация параметрлерине келсек, @ContextConfiguration менен @SpringJUnitWebConfig аннотацияларынын ортосундагы жалгыз айырмачылык, @SpringJUnitWebConfig аннотациясында компонентти класстар value атрибуту менен жарыяланат. Ошондой эле, @WebAppConfiguration аннотациясынан value атрибуту гана @SpringJUnitWebConfig аннотациясындагы resourcePath атрибуту аркылуу өзгөртүлө алат.

Төмөнкү мисалда @SpringJUnitWebConfig аннотациясын конфигурация классы үчүн кантип колдонуу көрсөтүлгөн:

Java
@SpringJUnitWebConfig(TestConfig.class) 
class ConfigurationClassJUnitJupiterSpringWebTests {
    // класс денеси...
}
  1. Конфигурация классын беребиз.
Kotlin
@SpringJUnitWebConfig(TestConfig::class) 
class ConfigurationClassJUnitJupiterSpringWebTests {
    // класс денеси...
}
  1. Конфигурация классын беребиз.

Төмөнкү мисалда @SpringJUnitWebConfig аннотациясын конфигурация файлынын жайгашкан жери үчүн кантип колдонуу көрсөтүлгөн:

Java
@SpringJUnitWebConfig(locations = "/test-config.xml") 
class XmlJUnitJupiterSpringWebTests {
    // класс денеси...
}
  1. Конфигурация файлдын жайгашкан жери берилип жатат.
Kotlin
@SpringJUnitWebConfig(locations = ["/test-config.xml"]) 
class XmlJUnitJupiterSpringWebTests {
    // класс денеси...
}
  1. Конфигурация файлдын жайгашкан жери берилип жатат.

Кененирээк маалыматты "Контекстти башкаруу" бөлүмүнөн көрүңүз, ошондой эле @SpringJUnitWebConfig, @ContextConfiguration жана @WebAppConfiguration боюнча javadoc көрө аласыз.

@TestConstructor

@TestConstructor – тесттик класстын конструкторунун параметрлери автоматтык түрдө аныкталып, тесттин ApplicationContext'индеги компоненттер менен байланыштырылышы үчүн колдонулган тип деңгээлиндеги аннотация.

Эгерде @TestConstructor аннотациясы жок болсо же тесттик класста мета-аннотация аркылуу бар болсо, анда тесттик конструктордун автоматтык түрдө аныкталуусу жана байланыш режиминин демейки режими колдонулат. Демейки режимди кантип өзгөртүү керектиги тууралуу кеңешти төмөн караңыз. Белгилей кетүүчү нерсе, конструкторго @Autowired аннотациясын жергиликтүү жарыялоо @TestConstructor аннотациясына жана демейки режимге артыкчылык берет.

Тесттик конструктордун автоматтык түрдө аныкталуусу жана байланыш режиминин демейки режимин өзгөртүү

Тесттик конструктордун автоматтык түрдө аныкталуусу жана байланыш режиминин демейки режими JVM`ден spring.test.constructor.autowire.mode системдик мүлктү all маанисине коюу менен өзгөртүлө алат. Ошондой эле демейки режимди SpringProperties механизми аркылуу да коюуга болот.

Spring Framework 5.3`тен баштап, демейки режимди JUnit Platform`дун конфигурация параметри катары да орното аласыз.

Эгерде spring.test.constructor.autowire.mode мүлкү орнотулбаса, тесттик класстын конструкторлору автоматтык түрдө аныкталбайт жана байланыштырылбайт.

Spring Framework 5.2`дан баштап, @TestConstructor аннотациясы JUnit Jupiter менен колдонуу үчүн SpringExtension менен гана колдоого алынат. SpringExtension көп учурда автоматтык түрдө катталаарын белгилей кетүү керек – мисалы, @SpringJUnitConfig жана @SpringJUnitWebConfig же Spring Boot Test`тин ар кандай тестке байланыштуу аннотацияларын колдонуунун натыйжасында.

@NestedTestConfiguration

@NestedTestConfiguration – бул ички тесттик класстар үчүн класстер иерархиясында Spring тесттик конфигурация аннотациялары кандайча иштетилерин конфигурациялоо үчүн колдонулган тип деңгээлиндеги аннотация.

Эгерде @NestedTestConfiguration аннотациясы жок болсо же тесттик класста, анын супертип иерархиясында же анын камтыган класстар иерархиясында мета-аннотация аркылуу бар болсо, анда камтыган конфигурацияны мураска алуу режими демейки режим катары колдонулат. Демейки режимди кантип өзгөртүү керектиги тууралуу кеңешти төмөн караңыз.

Камтыган конфигурацияны мураска алуу демейки режимин өзгөртүү

Демейки камтыган конфигурацияны мураска алуу режими - INHERIT, бирок аны JVM'ден spring.test.enclosing.configuration системдык мүлктү OVERRIDE маанисине коюу менен өзгөртсө болот. Демейки режимди SpringProperties механизми аркылуу да коюуга болот.

Spring TestContext Framework @NestedTestConfiguration аннотациясынын семантикасын төмөнкү аннотациялар үчүн колдойт.

@NestedTestConfiguration аннотациясын колдонуу көбүнчө JUnit Jupiter`дин @Nested менен белгиленген тест класстары менен гана мааниге ээ болушу мүмкүн; бирок ушул аннотацияны колдонгон Spring колдоосу жана чектеш тесттик класстары бар башка тесттик фреймворктор да болушу мүмкүн.

"Аннотацияланган @Nested тесттик класс конфигурациясы" бөлүмүн окуп, мисал жана кененирээк маалымат алыңыз.

@EnabledIf

@EnabledIf аннотациясы аннотацияланган JUnit Jupiter тесттик классы же тест методу иштетилген жана аткарылышы керек экенин билдирүү үчүн колдонулат, эгерде көрсөтүлгөн expression true болуп калса. Атап айтканда, эгерде expression мааниси Boolean.TRUE же String true менен барабар болсо (кейс көңүлгө алынбайт), тест иштетилет. Класс деңгээлинде колдонгондо, бул класстын ичиндеги бардык тесттик методдор да демейки боюнча автоматтык түрдө иштетилет.

Expression төмөнкү формалардын кайсынысы болбосун ала алат:

  • Spring Expression Language (SpEL) пайдалануу менен түзүлгөн expression. Мисалы: @EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

  • Spring фреймворктун Environment ичинде жеткиликтүү болгон орундаманын плейсхолдери. Мисалы: @EnabledIf("${smoke.tests.enabled}")

  • Тексттик арз турат. Мисалы: @EnabledIf("true")

Белгилей кетсек, тексттик арз турат, эгерде ал орундаманын динамиктуу чечилиши менен келип чыкпаса, практикалык мааниге ээ эмес, анткени @EnabledIf("false") аннотациясы @Disabled аннотациясы менен барабар, ал эми @EnabledIf("true") аннотациясы логикалык мааниси жок.

@EnabledIf аннотациясын мета-аннотация катары колдонуп, атайын курама аннотацияларды түзсө болот. Мисалы, @EnabledOnMac атайын аннотациясын төмөнкүдөй түзсө болот:

Java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
    expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
    reason = "Mac OS'те иштетилген"
)
public @interface EnabledOnMac {}
Kotlin
@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@EnabledIf(
        expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
        reason = "Mac OS'те иштетилген"
)
annotation class EnabledOnMac {}

@EnabledOnMac аннотациясы бул мүмкүн экендигинин гана мисалы катары кызмат кылат. Эгер сизде ушундай учур болсо, JUnit Jupiter'деги @EnabledOnOs(MAC) аннотациясынын орнотулган колдоосун колдонуңуз.

JUnit 5.7`дан баштап, JUnit Jupiter`де @EnabledIf аттуу шарттуу аннотация дагы бар. Ошондуктан, эгерде сизге анын Springдеги колдоосу керек болсо, анда туура пакеттерден аннотациянын типин импорттогонуңузга көз каранды болуңуз.

@DisabledIf

@DisabledIf аннотациясы аннотацияланган JUnit Jupiter тесттик класс же тест методу иштетилген эмес жана аткарылбашы керек экенин билдирүү үчүн колдонулат, эгерде берүүчү expression true деп табылса. Атап айтканда, expression мааниси Boolean.TRUE же String true менен барабар болсо (кейс көңүлгө алынбайт), тест иштетилбейт. Класс деңгээлинде колдонгондо, бул класстын бардык тесттик методдору да демейки боюнча автоматтык түрдө иштетилбей калат.

Expression төмөнкү формалардын кайсынысы болбосун ала алат:

  • Spring Expression Language (SpEL) пайдалануу менен түзүлгөн expression. Мисалы: @DisabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

  • Spring фреймворкта жеткиликтүү болгон орундаманын плейсхолдери. Мисалы: @DisabledIf("${smoke.tests.disabled}")

  • Тексттик арз турат. Мисалы: @DisabledIf("true")

Белгилей кетүүчү нерсе, тексттик арз турат, эгерде ал орундаманын динамиктуу чечилиши менен келип чыкпаса, практикалык мааниге ээ эмес, анткени @DisabledIf("true") аннотациясы @Disabled аннотациясы менен барабар, ал эми @DisabledIf("false") аннотациясы логикалык мааниси жок.

@DisabledIf аннотациясын мета-аннотация катары колдонуп, атайын курама аннотацияларды түзсө болот. Мисалы, @DisabledOnMac атайын аннотациясын төмөнкүдөй түзсө болот:

Java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(
    expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
    reason = "Mac OS'те иштетилбей калган"
)
public @interface DisabledOnMac {}
Kotlin
@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@DisabledIf(
        expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
        reason = "Mac OS'те иштетилбей калган"
)
annotation class DisabledOnMac {}

@DisabledOnMac аннотациясы бул мүмкүн экендигинин гана мисалы катары кызмат кылат. Эгер сизде ушундай учур болсо, JUnit Jupiter'деги @DisabledOnOs(MAC) аннотациясынын орнотулган колдоосун колдонуңуз.

JUnit 5.7`дан баштап, JUnit Jupiter`де @DisabledIf аттуу шарттуу аннотация дагы бар. Ошондуктан, эгерде сизге анын Springдеги колдоосу керек болсо, анда туура пакеттерден аннотациянын типин импорттогонуңузга көз каранды болуңуз.

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION