CodeBlanks Logo Icon CodeBlanks

ASSERT vs EXPECT

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

main.cpp
#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

main.cpp
#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

Soru
ASSERT_TRUE(ready);
EXPECT_EQ(value, ____);
Cevap
ASSERT_TRUE(ready);
EXPECT_EQ(value, 42);

Açıklama: ASSERT_TRUE önkoşulu, EXPECT_EQ değer denetimini yapar.

İleri seviye bölümündeki tüm dersler