# Automate Your Pipeline Tests

**URL:** <https://discuss.dataengineercafe.io/t/automate-your-pipeline-tests/542>\
**Category:** 97 Things Every Data Engineer Should Know\
**Tags:** data-pipeline, testing\
**Created:** [March 23, 2023, 4:33am UTC](https://discuss.dataengineercafe.io/t/automate-your-pipeline-tests/542 "2023-03-23T04:33:58Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![zkan](https://yyz1.discourse-cdn.com/flex035/user_avatar/discuss.dataengineercafe.io/zkan/32/2_2.png) [@zkan](https://discuss.dataengineercafe.io/u/zkan)\
**Post date:** [March 23, 2023, 4:33am UTC](https://discuss.dataengineercafe.io/t/automate-your-pipeline-tests/542/1 "2023-03-23T04:33:58Z")

</div>

โดย [Tom White](https://tom-e-white.com/about/)

ได้เขียน 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 ดู ก็จะทำให้เราเพิ่มเทสเข้ามาได้ง่ายมากขึ้น โค้ดไม่ซ้ำกันเยอะ พวกเทสต่าง ๆ เราควรกลับมารีวิวอยู่เรื่อย ๆ นะ ไม่ใช่เอาแต่เขียนเพิ่มเข้าไปอย่างเดียว

---

<div class="post-metadata">

**Author:** ![kahnwong](https://yyz1.discourse-cdn.com/flex035/user_avatar/discuss.dataengineercafe.io/kahnwong/32/295_2.png) [@kahnwong](https://discuss.dataengineercafe.io/u/kahnwong)\
**Post date:** [March 30, 2023, 12:08pm UTC](https://discuss.dataengineercafe.io/t/automate-your-pipeline-tests/542/2 "2023-03-30T12:08:28Z")

</div>

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

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