sketch_unittest.cc ไฟล์

  • ในไฟล์นี้ประกอบด้วยเทมเพลต 2 รูปแบบ

    • เทมเพลต 1 - เมื่อใช้คอมโพเนนต์ทั่วไป เทมเพลตที่ใช้เมื่อต้องการให้โค้ดทำงานโดยไม่สนใจเงื่อนไข

      • ตัวอย่าง 1) ตั้งค่าการรับส่งข้อมูลของพินที่ 13 ถูกต้องหรือไม่?

      • ตัวอย่าง 2) ตั้งค่าความเร็วการสื่อสารด้วยซีเรียลเป็น 9600 ถูกต้องหรือไม่?

    • เทมเพลต 2 - เมื่อรับค่าจากเซ็นเซอร์ เทมเพลตที่ใช้เมื่อผลลัพธ์การดำเนินการขึ้นอยู่กับเงื่อนไข

      • ตัวอย่าง 1) ถ้าค่าการวัดของเซ็นเซอร์ตรวจจับการเคลื่อนไหวมีค่า HIGH แล้วไฟ LED เปิดอยู่หรือไม่?

      • ตัวอย่าง 2) ถ้าค่าการวัดของเซ็นเซอร์เสียงอัลตราโซนต่อเนื่องมีค่าเท่ากับ 17 ซม. หรือไม่?

ℹ️ เราสามารถคัดลอกเทมเพลตต่างๆ เพื่อตั้งเกณฑ์การตรวจคำตอบให้ได้เท่าที่เราต้องการ แต่อย่าลืมแก้ไขส่วนของชื่อของชุดคำถาม (quiz1) เป็น quiz1, quiz2, ... ตามที่เหมาะสมด้วยนะคะ

// ตัวอย่าง: ถ้าต้องการตรวจคำตอบ 3 ชุด
TEST(quiz1, case1) {
  ...
}
TEST(quiz2, case1) {
  ...
}
TEST(quiz3, case1) {
  ...
}

เทมเพลต 1 - เมื่อใช้คอมโพเนนต์ทั่วไป

  1. ① พื้นที่ - เขียนโค้ดที่ต้องการตรวจสอบว่าทำงานหรือไม่โดยไม่ต้องพิจารณาเงื่อนไข โดยไม่ต้องใส่เครื่องหมายอัฒภาค(;) ② พื้นที่ - กำหนดจำนวนครั้งขั้นต่ำที่โค้ดนี้ต้องทำงาน

EXPECT_CALL(*arduinoMock, _(1)_.Times(AtLeast(_(2)_));

--------------------

// ตัวอย่าง 1: ต้องการให้โค้ดที่ตั้งค่าพินที่ 13 เป็นโหมดการเอาท์พุตทำงานอย่างน้อย 1 ครั้งหรือไม่?
EXPECT_CALL(*arduinoMock, pinMode(13, OUTPUT)).Times(AtLeast(1));

// ตัวอย่าง 2: ต้องการให้โค้ดที่หยุดการทำงานชั่วคราว ทำงานอย่างน้อย 2 ครั้งหรือไม่?
EXPECT_CALL(*arduinoMock, delay(_)).Times(AtLeast(2));

⚠️ หากต้องการตรวจสอบโค้ดที่เกี่ยวข้องกับการสื่อสารซีเรียล ให้ละเว้นส่วนของ Serial. แล้วเหลือส่วนที่เกี่ยวข้องไว้เท่านั้น

// ตัวอย่าง 1: ต้องการให้โค้ดที่ตั้งค่าความเร็วการสื่อสารซีเรียลเป็น 9600 ทำงานอย่างน้อย 1 ครั้งหรือไม่?
EXPECT_CALL(*arduinoMock, begin(9600)).Times(AtLeast(1));

// ตัวอย่าง 2: ต้องการให้โค้ดที่ส่งออกข้อความซีเรียล "LED ON" (รวมถึงการเปลี่ยนบรรทัด) ทำงานอย่างน้อย 1 ครั้งหรือไม่?
EXPECT_CALL(*arduinoMock, println("LED ON")).Times(AtLeast(1));
  1. กำหนด setup(); หรือ loop(); ตามส่วนของโค้ดที่ต้องการตรวจคำตอบ

    1. หากต้องการตรวจสอบโค้ดภายในฟังก์ชัน setup() → ให้เหลือเฉพาะ setup(); และลบ loop(); ทิ้ง

    2. หากต้องการตรวจสอบโค้ดภายในฟังก์ชัน loop() → ให้เหลือเฉพาะ loop(); และลบ setup(); ทิ้ง

⚠️ ไม่สามารถตรวจสอบโค้ดภายใน setup(); และ loop(); พร้อมกันได้ จะต้องแยกเป็นสองส่วน แล้วเขียนเทสเคสเป็นลำดับตามตัวอย่างด้านล่าง

// ตัวอย่าง: หากต้องการตรวจสอบทั้งฟังก์ชัน setup() และ loop() พร้อมกัน
TEST(quiz1, case1) {
  ...
  setup();
  ...
}
TEST(quiz2, case1) {
  ...
  loop();
  ...
}

เทมเพลต 2 - เมื่อรับค่าจากเซ็นเซอร์

  1. ① พื้นที่ - เขียนโค้ดที่เซ็นเซอร์เรียกค่าได้โดยไม่ต้องใช้เครื่องหมายอัฒภาค(;) ② พื้นที่ - กำหนดค่าที่คาดว่าเซ็นเซอร์จะวัดได้

EXPECT_CALL(*arduinoMock, _(1)_.WillOnce(Return(_(2)_));

--------------------

// ตัวอย่าง 1: ถ้ามีการตรวจจับค่า HIGH จากพินที่ 2...
EXPECT_CALL(*arduinoMock, digitalRead(2)).WillOnce(Return(1));

// ตัวอย่าง 2: ถ้าค่าการวัดจากเอคโค้ว(เซ็นเซอร์เสียงอัลตราโซนต่อเนื่อง)เท่ากับ 1000 (ประมาณ 17 ซม.)...
EXPECT_CALL(*arduinoMock, pulseIn(ECHO, HIGH)).WillOnce(Return(1000));
  1. ① พื้นที่ - เขียนโค้ดที่ต้องการตรวจสอบว่าทำงานหรือไม่โดยไม่ต้องพิจารณาเงื่อนไข โดยไม่ต้องใส่เครื่องหมายอัฒภาค(;) ② พื้นที่ - กำหนดจำนวนครั้งขั้นต่ำที่โค้ดนี้ต้องทำงาน

EXPECT_CALL(*arduinoMock, _(1)_.Times(AtLeast(_(2)_));

--------------------

// ตัวอย่าง 1: ...เมื่อความถี่เสียงโดยโทนซี4อยู่ที่ 262Hz เล่นเป็นเวลา 200ms ทำงานอย่างน้อย 1 ครั้งหรือไม่?
EXPECT_CALL(*arduinoMock, tone(9, 262, 200)).Times(AtLeast(1));

// ตัวอย่าง 2: ...ไม่ว่าจะเป็นสีอะไรก็ตาม ทำให้ไฟ LED กระพริบทำงานอย่างน้อย 2 ครั้งหรือไม่?
EXPECT_CALL(*arduinoMock, analogWrite(RED, _)).Times(AtLeast(2));
EXPECT_CALL(*arduinoMock, analogWrite(GREEN, _)).Times(AtLeast(2));
EXPECT_CALL(*arduinoMock, analogWrite(BLUE, _)).Times(AtLeast(2));

⚠️ หากต้องการตรวจสอบโค้ดที่เกี่ยวข้องกับการสื่อสารซีเรียล ให้ละเว้นส่วนของ Serial. แล้วเหลือส่วนที่เกี่ยวข้องไว้เท่านั้น

// ตัวอย่าง 1: ต้องการให้โค้ดที่ตั้งค่าความเร็วการสื่อสารซีเรียลเป็น 9600 ทำงานอย่างน้อย 1 ครั้งหรือไม่?
EXPECT_CALL(*arduinoMock, begin(9600)).Times(AtLeast(1));

// ตัวอย่าง 2: ต้องการให้โค้ดที่ส่งออกข้อความซีเรียล "LED ON" (รวมถึงการเปลี่ยนบรรทัด) ทำงานอย่างน้อย 1 ครั้งหรือไม่?
EXPECT_CALL(*arduinoMock, println("LED ON")).Times(AtLeast(1));

Last updated