ASSERT vs EXPECT
- C++ kursu
- İleri seviye
- Ders 39/83
- 5 dk
ASSERT_ ve EXPECT_ makrolarını öğrenirsin.
ASSERT ve EXPECT farkı
GoogleTest'te iki tür assertion ailesi vardır. EXPECT_ makroları başarısızlıkta testi devam ettirir; ASSERT_ makroları ise testi hemen durdurur. İkisi de aynı denetimleri sağlar (EQ, TRUE, FALSE vb.).
İlke şudur: bir önkoşul sağlanmazsa ve gerisi anlamsızsa ASSERT_ kullan; yoksa EXPECT_ tercih et. Örnek: ASSERT_NE(ptr, nullptr) ile işaretçinin null olmadığını denetlersin; null'sa sonraki satırlar çöker, bu yüzden test durur. EXPECT_EQ(result, 42) ise yalnızca bir değer denetimi yapar; başarısızsa bile test devam edip diğer denetimleri de raporlar.
Yaygın assertion makroları
Her iki aile de aynı denetim türlerini sunar. EQ eşitlik, NE eşitsizlik, TRUE doğruluk, FALSE yanlışlık, LT/LE/GT/GE sıralama (<, <=, >, >=) için. Dize denetiminde STREQ ve STRNE kullanılır.
Örnek: ASSERT_GE(score, 0) score'un negatif olmadığını denetler ve negatifse testi durdurur. EXPECT_LT(price, maxPrice) fiyatın üst sınırdan küçük olduğunu denetler ve başarısızsa bile teste devam eder. Hangi aileyi seçeceğin, sonraki satırların anlamlı olup olmamasına bağlıdır.
Uygulama ASSERT ve EXPECT kullan
divide(int a, int b) fonksiyonunu tanımla: ASSERT_NE(b, 0) yerine fonksiyon içinde b == 0 ise 0 döndür. TEST(DivTest, NonZero) makrosu içinde önce ASSERT_NE(b, 0) yerine ASSERT_TRUE(b != 0) çağır, sonra EXPECT_EQ(divide(10, 2), 5) çağır. main içinde std::cout << "test: hazır"; yaz.
Başlangıç kodu
#include <iostream>
#include <gtest/gtest.h>
// divide fonksiyonunu tanımla
// TEST(DivTest, NonZero) makrosunu ekle
int main(int argc, char** argv) {
std::cout << "test: hazır";
return 0;
}Örnek çözüm
#include <iostream>
#include <gtest/gtest.h>
int divide(int a, int b) {
if (b == 0) return 0;
return a / b;
}
TEST(DivTest, NonZero) {
int b = 2;
ASSERT_TRUE(b != 0);
EXPECT_EQ(divide(10, 2), 5);
}
int main(int argc, char** argv) {
std::cout << "test: hazır";
return 0;
}Beklenen çıktı
test: hazır
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 ASSERT_EQ başarısız olursa ne olur?
- Test atlanır
- Yalnızca uyarı verilir
- Test hemen durur Doğru cevap
- Sonraki test beklenir
Açıklama: ASSERT_ başarısızlığında test hemen durur; sonraki satırlar çalışmaz.
2 Makroyu davranışına eşle
| Kavram | Anlamı |
|---|---|
EXPECT_EQ |
Başarısızlıkta devam eder |
ASSERT_EQ |
Başarısızlıkta durur |
ASSERT_NE |
Eşit değilse geçer |
EXPECT_TRUE |
Doğruysa geçer |
3 Önkoşul makrosunu tamamla
ASSERT_TRUE(ready);
EXPECT_EQ(value, ____);
ASSERT_TRUE(ready);
EXPECT_EQ(value, 42);
Açıklama: ASSERT_TRUE önkoşulu, EXPECT_EQ değer denetimini yapar.