JUnit Assertions

All lectures for UZ purposes
Daraja, Dars
Mavjud

6.1 assert’лар

Ассертлар (asserts) — бу махсус текширувлар, уларни коднинг турли жойларига қўйиш мумкин. Улар қўпол қилиб айтганда, бирор нарса нотўғри кетган ёки йўлда бўлгани йўқлигини аниқ-лашни кўзлайди. Улар жойида эканлигини текширишни, буни турли усулларда белгилашга ёрдам беради.

Ўтган кодда сен баъзи ассертлар билан учрашгандирсан. Уларнинг биринчиси объектларни тенгликка текшириш. Агар объектлар тенг бўлмаса — истисно чиқади ва тест ёрилган бўлади.

Таққослашнинг тартиби муҳим, чунки JUnit охирги ҳисоботда бирор нарса “қабул қилинган қиймат 1, кутишга 3” каби ёзади. Бунинг умумий формати шундай кўринишга эга:

assertEquals(эталон, қиймат)

Мисол:


@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";
 
    assertEquals(expected, actual);
}

6.2 assertEquals, assertTrue, assertFalse методлари

Қуйида энг машҳур методлар — асертларнинг рўйхати келтирилади. Уларнинг номларидан қандай ишлаши ҳақида тахмин қилиш мумкин. Лекин шунга қарамай қисқача тушунтириш ёзаман:

assertEquals Икки объектнинг тенглигини текшириш
assertArrayEquals Икки массив тенг қийматларини текшириш
assertNotNull Аргумент null эмаслигини текшириш
assertNull Аргумент null эканлигини текшириш
assertNotSame Икки аргумент — бир хил объект эмаслигини текшириш
assertSame Икки аргумент — бир хил объект эканлигини текшириш
assertTrue Аргумент true эканлигини текшириш
assertFalse Аргумент false эканлигини текшириш

Улардан айримлари ортиқча бўлса керакдек туюлиши мумкин. Нега assertSame(a, b) ёзганингдан кўра assertTrue(a == b) ёзиғилиши мумкин?

Гап шундаки, assert — бу жуда ақлли метод. У кўп ёрдамдан фойдаланишни қилади ва шу жумладан хато ҳақида лог жўнатади. Биринчи ҳолда у “объект А кутилди, объект Б қабул қилинди” ёзади. Иккинчи ҳолда шунчаки true кутилганини ёзади.

Сенда юзлаб тестлар бўлганида, айниқса махсус тест сервисида бажарилганда, детализацияланган логлар жуда қўл келиши мумкин. Сен тушинасан, нимани назарда тутганимни.

Массивларни таққослаш мисоли:


@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();
   
    assertArrayEquals(expected, actual);
}

6.3 assertAll методи

Юқорида айтилганидек, assert методи фақат текширувни амалга оширмайди, балки таққослаш объектлари ҳақида кўп маълумот ёзувини олиб боради.

Масалан, таққослаш амалга ошириляпти:


Address address = unitUnderTest.methodUnderTest();
assertEquals("Вашингтон", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

Бироқ, агар параметрлардан бири мос келмаса, бошқа параметрлар текширилмайди. Аммо уларнинг натижаси логга ёзиб қолдирилишини хоҳлардинг. Лекин агар фақат битта текширув ўтмаса, тест ҳамма ҳолда муваффақиятсизликка учрайди.

Бунга махсус метод бор — assertAll(). Биринчи аргумент сифатида логга ёзилиши керак бўлган изоҳ қабул қилади, кейин эса исталган миқдорда асерт функциялар.

Мана бизнинг мисолимиз қандай қайта ёзилади:


Address address = unitUnderTest.methodUnderTest();
assertAll("Адресни мураккаб сценарий таққослаш",
    () -> assertEquals("Вашингтон", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

Агар адрес нотўғри бўлса, логда шундай ёзилади:

	Адресни мураккаб сценарий таққослаш (3 failures)
	expected: <Вашингтон> but was: <Сиэтл>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 assertTimeout методи

Эслейсизми @Timeout аннотациясини? Бу бутун методнинг иш вақтини назорат қилишига ёрдам берарди. Аммо баъзан методнинг ичидаги коднинг бир қисмининг иш жараёнига чеклов қўйиш фойда беради. Буни амалга ошириш учун assertTimeout() дан фойдаланиш мумкин.

Биринчи параметр сифатида вақтни, иккинчи параметр сифатида эса ушбу вақтда бажарилиши керак бўлган кодни (функция) қабул қилади. Мисол:


@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// бир секундлик танаффус
    	Thread.sleep(1000);
  	}
	);
}

Assert класида assertTimeout() методининг 12 та варианти бор. Агар улар билан батафсил танишмоқчи бўлсангиз, расмий документацияга хуш келибсиз.

6.5 assertThrows методи

Жуда кўп ҳолатларда сиз кодда керакли истисно чиқарилишини таъминлашингиз керак, муайян вазиятларда: хатони аниқлаб, керакли истисно чиқарилди. Бу жуда қўллаш имконияти кўп бўлган ҳолат.

Бундай ҳолат учун жуда фойдали assert метод бўлса — бу assertThrows(). Унинг умумий форматда чақирилиши кўриниши шундай:


assertThrows(истисно, код)

Ўз моҳиятида, у assertTimeout() методига жуда ўхшайди, фақат муайян кодни керакли истисно чиқаришини текширади. Мисол:


@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION