คิดก่อนเขียนเหอะ โค้ดอ่ะ จงทำ TDD ซะ
หลังจากที่ได้อ่านเรื่องการเขียน test และการทำ tdd มามากมายหลายปี ปรากฏว่า เห้ยเราเข้าใจคอนเซปต์มันว่ะ แต่พอจะทำจริงๆ กลับทำไม่ได้ ส่วนใหญ่จะติดปัญหาว่าแล้วเราจะเขียนเทสมันยังไง
เอาล่ะพอเข้าเนื้อหาของการเขียนเทสมันก็จะประกอบไปด้วยหลายๆอย่าง ทั้งการ mock ข้อมูล หรือกระทั่ง service ที่มีการ integrate กันทั้งหลายแหล่
แต่บทความนี้ผมจะพูดถึงแค่คอนเซปต์การคิดก่อนทำ ง่ายๆสบายๆ แค่อย่างเดียว โดยยกตัวอย่างด้วย ภาษา ruby และใช้ rspec ในการเขียนเทส
ผมจะยกตัวอย่างว่าเรามี input อันนึงเป็น text ชื่อไฟล์ว่า data.txt
// id, name, atd1, atd2, atd3, atd4, atd5, hw1, hw2, hw3, hw4, hw5
1,Jordan Sims,0,1,1,1,1,{},{ if books.count > 1; return true; end },{},{},{}
2,Peter Wong,1,1,0,1,1,{},{ if books.count > 1; true ; end },{},{ arrays = [1.4, 5.5]; },{}…
แล้วสิ่งที่เราต้องการจากโปรเจคนี้คือการสรุปคะแนนจากการเข้าห้องเรียนทั้งหมด 5 ครั้ง และการบ้าน 5 ข้อ
เริ่มต้นจาก no idea เลยคือผมจะ parse data พวกนั้นเป็น json ด้วย ruby ละกัน
ถ้าเรารู้ output ของสิ่งที่จะทำแล้ว เราก็เขียน test มันซะ เท่านั้นเอง
เริ่มจาก สร้าง library เปล่าๆ มา 1 project
bundle gem g_homework_parser
ซึ่งแน่นอนว่า พอขึ้น lib ใหม่ จะมี rspec สำหรับ test ติดมาให้อยู่แล้ว
จากนั้น ผมเอา data สักบรรทัดนึงมาไว้ที่ spec/sample_data/sample_data_01.txt
1,Jordan Sims,0,1,1,1,1,{},{ if books.count > 1; return true; end },{},{},{}แล้วสิ่งที่คิดตอนนี้คือ อ่ะ ถ้า file มี data 1 บรรทัด ถ้าเรารัน แล้วมันต้องได้ข้อมูลมา 1 อันใน array จากนั้นก็เขียน test ซะ
require "spec_helper"RSpec.describe GHomeworkParser do
context "parse sample data to json" do
it 'has correct amount of data' do
parser = GHomeworkParser.new(input: 'spec/sample_data/sample_data_01.txt')
result = parser.parse
expect(result.count).to eq(1)
end
end
end
เขียนมันขึ้นมาโดยคิดว่า ถ้ามันรันแบบนี้ ด้วย input แบบนี้ มันควรจะได้ ผลลัพท์ แบบนี้
พอเขียน test แล้ว เราก็ไปเขียน code ให้ test รันผ่าน หลังจากนั้นก็คิดต่อว่าผลลัพท์มันควรจะเป็นยังไง แล้วค่อยๆ ทำไปเรื่อยๆ
แค่นี้เราก็ได้ทำ TDD อย่างง่ายๆแล้วโดยที่ Point อย่างเดียวของการทำคือเราต้องรู้เสมอว่าเรา กำลังจะเขียน ให้ผลลัพท์มันออกมาเป็นยังไง
GG Easy เน้อะ