เขียน runtests script ให้เป็น executable document กันเถอะ
ตอนที่แล้วผมกล่าวถึงความสำคัญของเอกสารที่สามารถ execute เพื่อตรวจสอบดูว่ามันยังจริงอยู่ไหมได้ในรูปแบบของ unit tests ซึ่งเอาไว้เก็บบริบทของปัญหาที่เรากำลังแก้ หรือเรียกง่าย ๆ ว่า requirement
ตอนนี้เราจะมาพูดถึงเอกสารที่ใช้ในการ build software เช่น build script หรือแม้แต่วิธีการ run unit tests ก็สามารถเขียนในรูปแบบเอกสารได้เช่นกัน
ลองดูตัวอย่าง runtests.md
script ด้านล่าง
#!/bin/bash
#### Jump to the folder in which the `runtests.md` script is in. Return if we fail to jump to the expected folder so we do not run tests in the wrong folder.
cd "$(dirname "$0")" || return
#### Run all the tests
npm run test:unit:ci
บรรทัดแรก #!/bin/bash
เป็นตัวบอก operating system ว่านี่เป็น file bash script นะ ให้ run file นี้ด้วยโปรแกรม bash
แต่เพราะ file เป็นนาสกุล .md
ทำให้โปรแกรม editor มองมันเป็น file markdown ซึ่งทำให้ preview ดูเป็น document ได้ตามตัวอย่างด้านล่าง
บรรทัดที่ 3 เริ่มต้นด้วย # 4 ตัว ซึ่งเป็นเพียง comment ธรรมดาสำหรับ bash script แต่สำหรับ markdown เป็นการจัด format ให้เป็น heading ระดับ 4 เพื่ออธิบายบรรทัดถัดไป
dirname "$0"
คือการ run คำสั่ง dirname
เพื่อหา folder ที่ script นี้วางอยู่ที่ไหน เพราะแต่ละเครื่องอาจจะวางคนละที่กัน
cd "$(dirname "$0")"
คือการกระโดดเข้าไปใน folder ที่ script นี้อยู่ เพราะเราไม่รู้ว่าคนที่ run script จะ run มาจาก folder ไหน เราจึงอยากกระโดดมาอยู่ที่เดียวกับ script เพื่อให้สามารถ run script นี้จาก folder ไหนก็ได้ผลที่เหมือนกัน
|| return.
ด้านหลัง คือการออกจากโปรแกรมถ้าไม่สามารถกระโดดเข้ามาใน folder ที่เราคาดหวังได้ เพื่อป้องกันไม่ให้ script ทำงานต่อถ้าเกิดความผิดพลาดเพื่อป้องกันความเสียหายที่อาจจะเกิดขึ้นหาก script ทำงานต่อไป
เมื่อเราเขียนเสร็จ เราก็เพิ่ม execution mode ให้กับ file นี้ด้วยคำสั่ง chmod +x ./runtests.md
เสร็จแล้วเราก็สามารถ run script นี้บน command line ด้วยคำสั่ง ./runtests.md
ก็จะได้ผลตามด้านล่าง
ด้วยเทคนิคนี้เราสามารถเขียน script พร้อมกันกับ document ที่อธิบายมันไปด้วยกัน เพื่อถนอมความรู้ที่จำเป็นสำหรับการ run test และ build software เอาไว้ได้
shellcheck
ผมมักจะทดสอบ script ด้วยคำสั่ง shellcheck
คำสั่งนี้จะช่วยตรวจถ้า script ที่เราเขียนมีช่องโหว่ที่คนมักจะพลาดบ่อย ๆ เป็น syntaxic check ที่ช่วยกันความผิดพลาดเบื้องต้นได้
bach
และถ้าเราต้องการเขียน unit test สำหรับ bash script ก็มีเครื่องมือที่ชื่อว่า bach
ให้ใช้ ซึ่งช่วยในการทำ semantic check เพื่อตรวจสอบว่า script ทำงานได้ตามที่เราคาดหวังได้