สวัสดีครับ ในบทความนี้ก็เป็น EP.7 แล้วนะครับ โดยเนื้อหาจะเป็นเรื่องเกี่ยวกับ Unit Testing ซึ่งเป็นเรื่องที่มีความสําคัญในการพัฒนาโปรแกรมมากๆครับ
สําหรับท่านใดที่ยังไม่ได้อ่าน EP.6 ท่านสามารถกลับไปอ่านก่อนได้นะครับที่นี่ Go EP.6 Go Channel
มาเริ่มเรียนรู้ไปด้วยกันตามหัวข้อด้านล่างเลยครับ
Unit Test เป็นส่วนหนึ่งในการพัฒนา Software ครับ ไม่ว่าเราจะพัฒนา Software ในภาษาใดๆก็ตาม เราจําเป็นจะต้องเขียน Unit Test เพื่อช่วยในการตรวจสอบการทํางานของโปรแกรมที่เราเขียนขึ้นเพื่อให้แน่ใจว่าการทํางานของโปรแกรมนั้นจะเป็นไปตามที่เราต้องการอย่างแน่นอน และเมื่อเรามาแก้ไข Software ภายหลัง ทําให้แน่ใจได้ว่า สิ่งที่เราแก้ไขนั้นไม่กระทบในส่วนอื่นๆ และยังสามารถทํางานได้อย่างถูกต้อง
ในการเขียน Unit Test นั้นมีกระบวนการเขียนที่เรียกว่า Test Driven Development (TDD) ดังนี้ครับ

Test Driven Development (TDD) จะเริ่มจากเขียน Test case ตาม Requirement ที่เราต้องการก่อน แล้วเมื่อ Run test จะไม่ผ่าน (Test fail) เนื่องจากเรายังไม่ได้ Implement อะไรเลย ขั้นตอนต่อไปให้เรา Implement ตาม Test case ที่ fail เพื่อให้ Test case นั้นผ่าน
เมื่อ Implement จน Test case ผ่านทั้งหมดแล้ว ขั้นตอนต่อไปเราก็จะทําการ Refactor code ให้ Code ของเราออกมาเป็นระเบียบง่ายต่อการมาแก้ไขภายหลังครับ
เริ่มแรกเรามาดูตัวอย่าง Requirement กันครับ ดังนี้
ลําดับความสําคัญจะเรียงตามบรรทัดด้านบนเลยครับ
ขั้นตอนแรกเราสร้าง Project ขึ้นมาก่อนครับ ในที่นี้ผมใช้ชื่อว่า go-fizzbuzz ละกันนะครับ
จากนั้นให้เราสร้างไฟล์ fizzbuzz.go ขึ้นมา โดยภายในจะมี function FizzBuzz ว่างๆ รอไว้ก่อน ดังนี้
package fizzbuzz
func Fizzbuzz(number int) string {
return ""
}
ขั้นตอนต่อไปเราก็จะมาเขียน Test case กันครับ ซึ่งในการเขียน Unit Test ในภาษา Go นั้นเราสามารถสร้างไฟล์โดยมี File name ที่มีรูปแบบตามนี้ “ชื่อไฟล์ที่เราจะเขียนทดสอบ_test.go” โดยปกติเราจะใช้ชื่อที่เหมือนกันกับไฟล์ที่เราต้องการจะเทส ตัวอย่างในบทความนี้เราก็จะใช้ชื่อ fizzbuzz_test.go และเราจะเอาไว้ที่เดียวกันกับไฟล์ fizzbuzz.go แล้วใส่ code ดังนี้
package fizzbuzz // --> (1)
import (
"testing" // --> (2)
)
func TestInputDivideBy15ShouldBeDisplayFizzBuzz(t *testing.T) { // --> (3)
inputList := []int{15, 30, 45, 60, 75, 90}
for _, n := range inputList {
v := Fizzbuzz(n)
if "FizzBuzz" != v {
t.Error("fizzbuzz of", n, "should be 'FizzBuzz' but have", v)
}
}
}
func TestInputDivideBy5ShouldBeDisplayBuzz(t *testing.T) { // --> (4)
inputList := []int{5, 10, 20, 25, 35, 40, 50}
for _, n := range inputList {
v := Fizzbuzz(n)
if "Buzz" != v {
t.Error("fizzbuzz of", n, "should be 'Buzz' but have", v)
}
}
}
func TestInputDivideBy3ShouldBeDisplayFizz(t *testing.T) { // --> (5)
inputList := []int{3, 6, 9, 12, 18, 21, 24}
for _, n := range inputList {
v := Fizzbuzz(n)
if "Fizz" != v {
t.Error("fizzbuzz of", n, "should be 'Fizz' but have", v)
}
}
}
func TestInputOtherNumberShouldBeDisplayInputNumber(t *testing.T) { // --> (6)
inputList := []int{1, 2, 4, 7, 11, 13, 17, 16}
for _, n := range inputList {
v := Fizzbuzz(n)
if fmt.Sprintf("%d", n) != v {
t.Error("fizzbuzz of", n, "should be '", n, "' but have", v)
}
}
}
จาก Code ผมจะอธิบายเป็นข้อๆตามผมายเลขด้านบนดังนี้
เมื่อเรารันเทสโดยใช้คําสั่งนี้
$ go test
จะได้ตามรูปด้านล่าง

จะเห็นว่า Test Fail เนื่องจากเรายังไม่ได้ Implement function Fizzbuzz เลย
ขั้นตอนต่อไปเราจะไป Implement function Fizzbuzz เพื่อให้ Test case ของเราผ่าน โดยเราจะ Implement และ Run test ไปเรื่อยๆตาม Test case ที่ fail จนกว่า Test case จะผ่านหมดทุก Test case ครับ
ก็จะได้ function Fizzbuzz ดังนี้ครับ
ackage fizzbuzz
import "fmt"
func Fizzbuzz(number int) string {
switch 0 {
case number % 15:
return "FizzBuzz"
case number % 5:
return "Buzz"
case number % 3:
return "Fizz"
default:
return fmt.Sprintf("%d", number)
}
}
และเมื่อรัน Test จะได้แบบนี้ครับ

หมายความว่า Function ของเราสามารถทํางานได้ถูกต้องครบถ้วนแล้วครับ
ในการใช้งานจริงจะเห็นว่าถ้าเราเขียน Test case ได้ถูกต้องครบถ้วนมากเท่าไร Software ของเราก็จะทํางานได้อย่าถูกต้องตามที่เราต้องการมากเท่านั้น
โหลด Project ตัวอย่างได้ที่นี่ครับ https://github.com/mrthiti/go-fizzbuzz.git
มาถึงจุดนี้เราก็สามารถเขียน Unit Test ในภาษา Go เบื้องต้นกันแล้วนะครับ จริงๆในการเขียน Unit Test ยังมีเนื้อหาอื่นๆอีกครับ เอาไว้ผมจะมาเล่าให้ฟังอีกทีในบทความต่อๆไปนะครับ
ใน EP.8 จะเป็นเรื่องเกี่ยวกับ Channel Select Multiple Communication Operations ท่านสามารถกดเข้าไปอ่านต่อกันได้ครับ
สําหรับบทความนี้ก็มีเพียงเท่านี้ครับ ขอให้สนุกกับการเขียน Code นะครับ ขอบคุณครับ
BASE64 คืออะไรBASE64 คือ วิธีการเข้ารหัสข้อมูลรูปแบบหนึ่ง ที่จะเปลี่ยนข้อความ หรือข้อมูลต้นฉบับไปเป็นข้อความ หรือข้อมูลชุดใหม่ ที่ไม่สามารถอ่าน หรือรู้ว่าข้อมูลชุดนี้คืออะไร ซึ่งการเข้ารหัสชนิดนี้จะแทนที่ข้อมูลด้วยตัวอักษร 64 ตัว นั่นคือที่มาของ BASE64 ตามตารางImageวิธีการเข้ารหัส BASE64ยกตัวอย่างที่ต้องการเข้ารหัสข้อความนี้ "abcd" จะมีขั้นตอนคือ1.นําข้อมูลที่ต้องการเข้ารหัสมาแปลงเป็นเลขฐานสอง 8 bita = 01100001b = 01100010c = 01100011d = 011001002.นําเลขฐานสองที่ได้มาเรียงต่อกันตามลําดับดังนี้01100001 01100010 01100011 011001003.แบ่งเลขฐานสองออกเป็นชุด ชุดละ 6 bit กรณีที่ชุดสุดท้ายไม่ครบ ให้เติม 0 ไปจนครบ 6 bit จะได้ดังนี้01100001 01100010 01100011 01100100 00004. นําเลขฐานสองที่แบ่งไว้มาแปลงเป็นตัวอักษรตามตาราง BASE64 (ตามรูปด้านบน) โดยใน BASE64 จะนับ bit ที่ถูกเติมเข้าไปที่เป็น 00 แทนด้วย "="011000 = "Y"010110 = "W"001001 = "J"100011 = "j"011001 = "Z"000000 = "A=="** bit ที่ถูกเติมเข้าไปที่เป็น 00 แทนด้วย "=" 5.นําตัวอักษรมาเรียงต่อกันตามลําดับ YWJjZA==วิธีการถอดรหัส BASE64วิธีการถอดรหัส BASE64 ก็ไม่ยาก ทําย้อนกลับครับให้นําข้อมูลมาแปลงเป็นฐานสอง 6 bit มาเรียงต่อกันก่อน แล้วนํามาจัดกลุ่ม กลุ่มละ 8 bit โดย bit สุดท้ายที่เหลือไม่ครบ 8 bit ให้ตัดทิ้ง หลังจากนั้นก็แปลงเลขฐานสอง 8 bit แต่ละชุดเป็นข้อมูล ASCII เท่านี้ก็จะได้ข้อมูลต้นฉบับแล้วครับ
หลังจากที่เราเรียนรู้ Component กันไปแล้ว ถ้ายังจํากันได้ภายใน Component มี Option ตัวนึงชื่อว่า Props ซึ่งมีหน้าที่ รับข้อมูลจากภายนอก Component เข้ามาใช้งานภายใน Component โดยจะรับข้อมูลผ่านทาง Attribute การใช้งาน Props สามารถใช้งานได้หลายรูปแบบ เราจะมาเรียนรู้ไปทีละแบบนะครับ
เมื่อใช้งาน TeamViewer แล้วในระหว่าง Remote มีการเปิดโปรแกรม Visual Studio 2015 ขึ้นมาใช้งาน จะเกิดปัญหาคือ หน้าจอจะไม่ตอบสนองต่อการกระทําเลย ดังภาพ