in Testing

Unit Testing กับตัวแปรแบบ float และวิธีแก้(แบบขอไปที)

คำเตือน: นี่ไม่ใช่ทางแก้ที่ดีที่สุด อย่ายึดติดนะครับ ลองพยายามหาวิธีที่ดีกว่าเนอะ (ผมก็พยายามเช่นกัน)

การคำนวนเกี่ยวกับทศนิยมนั้น
การแสดงผล อาจจะไม่ใช่ค่าที่แท้จริงก็เป็นได้

3.74166 อาจจะเกิดจากค่าจริงที่เป็น 3.741657313256…. (ทศนิยมไม่รู้จบ)
ดังนั้น การเอาตัวแปร float (ทศนิยม) มาตรวจสอบว่า เท่ากันหรือไม่
อาจจะได้ผลเป็น ไม่เท่ากัน ไม่สอดคล้องกับที่ตาเห็น ก็เป็นได้


float expect = 3.74166;
ASSERT_THAT(2.50710f + 1.23456f, testing::Eq(expect));

โค้ดตัวอย่างด้านบนนี้ จะได้ผล Test เป็นผ่าน เพราะเนื่องจาก ผลจากการบวกเกิดจากตัวแปรประเภท float ที่มีทศนิยมจำกัด ทั้งคู่นั่นเอง

แล้วทีนี้เราจะทำอย่างไรล่ะ
ถ้าเกิดเหตุที่ผลลัพธ์ที่เอามาทดสอบ
เกิดเป็นทศนิยมไม่รู้จบขึ้นมา

ผมก็ได้ลองไปเรื่อยๆ จนมาพบเอาว่า
“ก็แปลงเป็น string สิ เลือกจำนวนหลักหลังจุดที่ต้องการได้ด้วย”

หน้าตาของ test ที่ได้ก็จะเป็นดังนี้


TEST_F(ThreeDDistanceTest, TestExampleValueSet3){
	int point1[3] = {1,2,3};
	int point2[3] = {7,-4,5};	
	float expect = 8.7178;

	float actual = pSolver->GetDist3(point1[0], point1[1], point1[2],
					point2[0], point2[1], point2[2]);

	char buffer[32];
	sprintf(buffer, "%.5f", expect);
	string expectString = buffer;
	sprintf(buffer, "%.5f", actual);
	string actualString = buffer;
	
	ASSERT_THAT(actualString, testing::Eq(expectString));
}

ผลลัพธ์ที่ได้ ออกมาเป็นที่หน้าพอใจ (แต่ไม่ดีที่สุด) ครับ

Write a Comment

Comment