Automate Your Pipeline Tests

โดย Tom White

ได้เขียน guidelines พวกนี้ไว้สำหรับตอนที่เราสร้าง data pipeline ก็จะทำให้ pipeline ของเราดูดี น่าเชื่อถือ และแข็งแกร่ง

Build an End-to-End Test of the Whole Pipeline

ที่จุดนี้ยังไม่ต้องไปดูว่า pipeline นั้น ๆ ทำอะไรมาก ให้ดูที่ infrastructure ดูว่าเราถ้าเราให้ input เข้าไป เกิด transformation เสร็จแล้ว output ตรงตามที่เราคาดหวังหรือเปล่า ใช้ JUnit หรือ pytest ในการเขียนเทส

Use a Small Amount of Representative Data

ใช้ข้อมูลในขนาดที่พอเหมาะต่อการทดสอบ เพื่อให้เทสไม่รันนานจนเกินไป ถ้าเป็นไปได้ ก็ใช้ข้อมูล production เลย (ที่ anonymized แล้วนะ)

Prefer Textual Data Formats over Binary

ไฟล์ข้อมูลควรจะดูความแตกต่างได้ (diff-able) จะได้เห็นว่าอะไรทำให้เทสพัง ซึ่งเราสามารถเอา input และ output เข้า version control ได้เลย แล้วก็ track changes

ซึ่งถ้า pipeline ของเราพ่น binary ออกมา (เช่น Parquet) ก็ให้เราเขียนให้สามารถพ่น text ออกมาให้ได้ด้วย สำหรับเพื่อการทดสอบ

Ensure That Tests Can Be Run Locally

การที่เรารันเทสบนเครื่องได้ (locally) จะทำให้เราสามารถ debug ได้ง่าย และเร็วขึ้นมาก ๆ ถ้าใช้ Spark ก็ใช้ local mode ถ้าใช้ HBase ก็เซต mini cluster เพื่อให้สามารถรันบนเครื่องได้ ซึ่งแน่นอนว่าของพวกนี้ เราสามารถเอาขึ้นไปรันบน CI ได้เช่นกัน

Make Tests Deterministic

หลีกเลี่ยงความ random ที่เกิดขึ้นในเทส ให้เราควบคุมมันให้ได้ เช่น อาจจะใช้ seed มาช่วย เพื่อให้ผลลัพธ์เหมือนเดิมทุกครั้งตอนที่เรารันเทส หรืออาจจะใช้ mock ก็ได้เช่นกัน พวกควบคุมตัวแปรบางตัว เช่น เวลา เป็นต้น

Make It Easy to Add More Tests

ถ้าเราเริ่มมีเทสที่ซ้ำ ๆ กัน ก็ลองหาวิธีทำ parameterized tests ดู ก็จะทำให้เราเพิ่มเทสเข้ามาได้ง่ายมากขึ้น โค้ดไม่ซ้ำกันเยอะ พวกเทสต่าง ๆ เราควรกลับมารีวิวอยู่เรื่อย ๆ นะ ไม่ใช่เอาแต่เขียนเพิ่มเข้าไปอย่างเดียว

1 Like

เขียนเทสก็ว่ายาก

แต่ ขอเวลามาเขียนเทส ยากกว่า :smiling_face_with_tear: (read: cost-center vs profit-center)

1 Like