0Pricing
C++ Academy · บทเรียน

การยืนยันและตัวจับคู่

เขียนการตรวจสอบที่สื่อความหมาย

การยืนยันและตัวจับคู่ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

การตรวจสอบยืนยันแสดงความคาดหวัง

การตรวจสอบยืนยันของ GTest ใช้ตรวจสอบเงื่อนไขภายในการทดสอบ โดยมีความรุนแรงอยู่สองระดับ

  • EXPECT_*: บันทึกความล้มเหลวไว้ แต่การทดสอบดำเนินต่อ
  • ASSERT_*: ความล้มเหลวจะหยุดการทดสอบปัจจุบันทันที

EXPECT เทียบกับ ASSERT

ใช้ ASSERT_* เมื่อการดำเนินการต่ออาจทำให้โปรแกรมหยุดทำงาน (เช่น หลังตรวจสอบค่า null) และใช้ EXPECT_* ในกรณีอื่น เพื่อให้เห็นความล้มเหลวทั้งหมดพร้อมกัน

#include <gtest/gtest.h>

TEST(Demo, MixedChecks) {
    int* p = new int(5);
    ASSERT_NE(p, nullptr);
    EXPECT_EQ(*p, 5);
    delete p;
}

การตรวจสอบยืนยันการเปรียบเทียบ

แมโครหลักสำหรับการเปรียบเทียบมีดังนี้:

  • EXPECT_EQ, EXPECT_NE
  • EXPECT_LT, EXPECT_LE
  • EXPECT_GT, EXPECT_GE
#include <gtest/gtest.h>

TEST(Compare, Numbers) {
    EXPECT_LT(2, 3);
    EXPECT_GE(5, 5);
}

การตรวจสอบยืนยันค่าบูลีน

EXPECT_TRUE และ EXPECT_FALSE ใช้ตรวจสอบเงื่อนไขบูลีนโดยตรง

#include <gtest/gtest.h>

bool is_even(int n) { return n % 2 == 0; }

TEST(Bool, Even) {
    EXPECT_TRUE(is_even(4));
    EXPECT_FALSE(is_even(3));
}

การเปรียบเทียบเลขทศนิยม

อย่าใช้ EXPECT_EQ กับค่าทศนิยม ใช้ EXPECT_FLOAT_EQ, EXPECT_DOUBLE_EQ หรือ EXPECT_NEAR พร้อมค่าความคลาดเคลื่อนที่ยอมรับได้

#include <gtest/gtest.h>

TEST(Floats, Approx) {
    EXPECT_DOUBLE_EQ(0.1 + 0.2, 0.3);
    EXPECT_NEAR(3.14159, 3.14, 0.01);
}

การตรวจสอบยืนยันสตริง

สำหรับสตริงแบบ C ให้ใช้ EXPECT_STREQ / EXPECT_STRNE สำหรับ std::string สามารถใช้ EXPECT_EQ ได้ เนื่องจากเป็นการเปรียบเทียบตามค่า

#include <gtest/gtest.h>
#include <string>

TEST(Strings, Compare) {
    EXPECT_STREQ("hi", "hi");
    EXPECT_EQ(std::string("ok"), "ok");
}

การตรวจสอบยืนยันข้อยกเว้น

ตรวจสอบว่าโค้ดโยนข้อยกเว้นที่คาดไว้

#include <gtest/gtest.h>
#include <stdexcept>

void check(int n) {
    if (n < 0) throw std::runtime_error("neg");
}

TEST(Throws, Negative) {
    EXPECT_THROW(check(-1), std::runtime_error);
    EXPECT_NO_THROW(check(1));
}

ข้อความความล้มเหลวแบบกำหนดเอง

ส่งบริบทเพิ่มเติมเข้าไปในการตรวจสอบยืนยันด้วย << เพื่อให้วิเคราะห์ความล้มเหลวได้ง่ายขึ้น

#include <gtest/gtest.h>

TEST(Message, WithContext) {
    int x = 7;
    EXPECT_EQ(x, 7) << "x had unexpected value " << x;
}

ตัวจับคู่ของ GMock ด้วย EXPECT_THAT

EXPECT_THAT รวมค่าเข้ากับ ตัวจับคู่ เพื่อการตรวจสอบที่สื่อความหมาย เช่น EXPECT_THAT(v, ElementsAre(1, 2, 3))

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <vector>
using ::testing::ElementsAre;

TEST(Matchers, Vector) {
    std::vector<int> v{1, 2, 3};
    EXPECT_THAT(v, ElementsAre(1, 2, 3));
}

ตัวจับคู่ที่มีประโยชน์

ตัวจับคู่ทั่วไป ได้แก่:

  • Eq, Ne, Gt, Lt
  • Contains, ElementsAre, UnorderedElementsAre
  • HasSubstr, StartsWith, EndsWith

การเลือกการตรวจสอบยืนยันที่เหมาะสม

เลือกใช้การตรวจสอบยืนยันที่เฉพาะเจาะจงที่สุด เพราะจะแสดงข้อความความล้มเหลวที่ชัดเจนกว่า EXPECT_TRUE ทั่วไป EXPECT_EQ(a, b) จะแสดงค่าทั้งสองค่า แต่ EXPECT_TRUE(a == b) จะไม่แสดง

ตรวจสอบอย่างรวดเร็ว

ทบทวนความแตกต่างระหว่าง EXPECT กับ ASSERT

สรุปทบทวน

คุณได้เรียนรู้การตรวจสอบยืนยันของ GTest

  • EXPECT_* ดำเนินการต่อ ส่วน ASSERT_* ยกเลิกการทดสอบ
  • แมโครสำหรับการเปรียบเทียบ ค่าบูลีน เลขทศนิยม สตริง และข้อยกเว้น
  • ส่งบริบทเพิ่มเติมด้วย <<
  • EXPECT_THAT + ตัวจับคู่สำหรับการตรวจสอบที่สื่อความหมาย

คำถามที่พบบ่อย

บทเรียน “การยืนยันและตัวจับคู่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การยืนยันและตัวจับคู่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การยืนยันและตัวจับคู่”

เขียนการตรวจสอบที่สื่อความหมาย คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การยืนยันและตัวจับคู่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า GTest
  2. การยืนยันและตัวจับคู่
  3. ฟิกซ์เจอร์และการตั้งค่า
  4. การจำลองด้วย GMock
← กลับไปที่ C++ Academy