ข้ามไปที่เนื้อหาหลัก

บทความ

กำลังแสดงโพสต์ที่มีป้ายกำกับ programming

สร้าง Stubs ภาษา C ด้วย cmocka

มีโอกาสได้เปิดวิชา Embedded Software Testing เลยต้องลองกลับไปเขียนภาษา C และ หาไลบรารีสำหรับทดสอบโปรแกรมภาษาซีมาใช้ มีให้เด็กๆ เลือกเล่นหลายๆ ตัวทั้ง Unity  (ไม่ไช้โปรแกรมสร้างเกมส์นะครับ :D)  CppUTest แต่มาลงตัวที่ CMocka เพราะสามารถใช้ทำ Stubs และ Mock ได้ด้วย โดยส่วนตัวแล้ว Unity ออกแบบมาค่อนข้างดีสำหรับการทดสอบ embedded แค่เวลาคอมไพล์ยังต้องคอมไพล์ไฟล์ภาษาซีของ Unity เข้าไปร่วมด้วยเลยอาจจะใช้งานยากหน่อย ส่วน CppUTest ก็ออกแนว C++ ไป ถึงแม้ว่าจะใช้ทดสอบโคดภาษาซีได้แต่ก็ไม่ได้เพียวซีจริงๆ CMocka ไม่ได้ออกแบบมาทดสอบ embedded โดยตรงแต่เป็น C ล้วน ใช้การคอมไพล์ช่วยในการสร้าง strub ถึงแม้ว่าเข้าใจยากนิดหน่อย แต่ใช้งานได้ดีทีเดียว เราจะทดลองสร้าง ฟังก์ชัน calculate โดยรับพรารามิเตอร์ 3 ค่า คือ operator, operand1 และ operand2 แล้วลองเรียก ฟังก์ชัน add แต่ ฟังก์ชัน add เป็น ฟังก์ชันที่เราสร้างขึ้มาเองแล้วถูกเรียกใช้ เราต้อง stub ฟังก์ชัน add เพื่อจะได้ทดสอบเฉพาะการทำงานของฟังก์ชัน calculate เท่านั้น โดยการสร้างฟังก์ชัน __wrap_add ขึ้นมา โดยที่ มี return type และ รับพารา...

ใช้ Watchdog ช่วยทำ TDD สำหรับ C++ ด้วย Gtest และ CMake

เห็นคนรู้จักหลายๆ คนทำ TDD กัน เลยอยากทำบาง โดยมากมักใช้ Watchr เพื่อช่วนในการรัน Test Case ทันทีที่บันทึกไฟล์ เห็นแล้วสะดวกดี แต่พอดีเขียน Ruby ไม่เป็นเลยมากหาไลบราลีภาษา Python แทน ก็ไปเจอ Watchdog  อาศัยแรงของตั้วเลยได้ Python script  อย่างง่ายมาเล่น TDD สำหรับ Python กัน วันนี้อยากเอามันมาใช้กับ C++ บ้างเล่นเอาเหนื่อยเหมือนกันกว่าจะเอา  Python script  ของตั้วมาใช้กับ C++ ซึ่งจากที่ดูๆ มา Google Test กับ CMake น่าจะตอบโจทย์ TDD ได้ระดับนึ่ง แต่ต้องอาศัยการจัดรูปแบบของไดเร็กทอรีเข้าร่วมด้วย ตอนนี้สคริปต์ยังมีการกำหนดหลายๆ อย่างตายตัวอยู่มาก อาจจะยังไม่เรียบร้อยดีเท่าที่ควร หน้าตาไดเร็กทอรีประมาณนี้ . ├── src │   └── xxx │   └── xxx.cpp ├── tests │   ├── CMakeLists.txt │   ├── external │   │   └── gtest │   │   └── CMakeLists.txt │   └── units │   └── xxx │   └── test_xxx.cpp ├── cpp-testrunner │ └── CMakeLists.txt สำหรับได...

ผ่านไปแล้วหนึ่งอาทิตย์ แก้โจทย์นี้ไม่ได้สักที

ให้โจทย์เขียนโปรแกรมไปกับเด็กคนนึง ให้เขียนด้วย Python 3 โจทย์ บางส่วนของโค้ด Python A = [random.randint(1, 150) for i in range(0,100)] หาค่าเฉลี่ยของสมาชิกของ A ที่ละ 10 ค่า ให้อยู่ในรูปของลิสท์ ผ่านไปแล้วหนึ่งอาทิตย์ แก้โจทย์นี้ไม่ได้สักที เลยแอบเอามาเฉลยไว้ :D import random A = [random.randint(1, 150) for i in range(0,100)] length = 10 average = [sum(A[a:a+length]) / len(A[a:a+length]) for a in range(0, len(A), length)] print(average) โจทย์นี้อาจจะยากสำหรับผู้เริ่มต้นเรียนโปรแกรมิ่ง แต่สำหรับนักศึกษาสายคอมพิวเตอร์ในระดับมหาวิทยาลัย โจทย์นี้น่าจะเป็นเรื่องง่ายมาก แทบจะไม่ต้องใช้ความรู้มากมายในการเขียนเลย เพียงแค่ลงมือทำเท่านั้น ไม่รู้ว่าป่านนี้จะเขียนได้ยัง !!_ _ ไม่ต้องการให้เขียนได้โค้ดแบบนี้ แค่คำตอบเหมือนก็ดีใจแล้ว เศร้าจริง.... เด็กไทย

ชุดไลบรารี date_time ของ Boost

เนื่องจากตอนนี้กลับมาเขียน C++ เป็นหลัก จึงอยากเขียนหลายๆ อย่างให้อยู่ในรูปของอ็อบเจกต์ด้วย จึงหาไลบรารีมาใช้งาน ที่สนใจตอนนี้คือไลบรารีเรื่องของวันและเวลาจากชุดไลบรารีของ boost ซึ่งชุดไลบรารีของ boost เองหลายชุดได้กลายเป็นแม่แบบมารตฐาน C++11 ด้วย สำหรับตอนนี้สนใจเรื่องเกี่ยบกับเวลา เราอาจจะเลือกใช้ ctime ได้แต่อาจจะอยู่ในรูปปของฟังก์ชันและพอยน์เตอร์ หรือ tm struct แต่การใช้ tm struct เราอาจจะต้องมาจัดการเรืองของช่วงเวลาเอง อาจจะยุ่งยากเล็กน้อย ลองมาดูไลบรารี date_time ของ boost กันดีกว่า // date_time.cpp #include <iostream> #include <boost/date_time/posix_time/posix_time.hpp> using namespace::std; int main(){ boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::local_time(); cout<<"time t1: " << boost::posix_time::to_simple_string(t1) <<endl; sleep(1); boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::local_time(); cout<<"time t2: " << boost::posix_time::to_simple_string(t2) ...