เขียน runtests script ให้เป็น executable document กันเถอะ

Chokchai Phatharamalai
odds.team
Published in
2 min readApr 29, 2024
Photo by Nathan Dumlao on Unsplash

ตอนที่แล้วผมกล่าวถึงความสำคัญของเอกสารที่สามารถ 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 ได้ตามตัวอย่างด้านล่าง

Captured by Chokchai Phatharamalai

บรรทัดที่ 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 ก็จะได้ผลตามด้านล่าง

Captured by Chokchai Phatharamalai

ด้วยเทคนิคนี้เราสามารถเขียน script พร้อมกันกับ document ที่อธิบายมันไปด้วยกัน เพื่อถนอมความรู้ที่จำเป็นสำหรับการ run test และ build software เอาไว้ได้

shellcheck

ผมมักจะทดสอบ script ด้วยคำสั่ง shellcheck คำสั่งนี้จะช่วยตรวจถ้า script ที่เราเขียนมีช่องโหว่ที่คนมักจะพลาดบ่อย ๆ เป็น syntaxic check ที่ช่วยกันความผิดพลาดเบื้องต้นได้

bach

และถ้าเราต้องการเขียน unit test สำหรับ bash script ก็มีเครื่องมือที่ชื่อว่า bach ให้ใช้ ซึ่งช่วยในการทำ semantic check เพื่อตรวจสอบว่า script ทำงานได้ตามที่เราคาดหวังได้

อ้างอิง

--

--