ข้อกำหนดอย่างละเอียดของสภาพแวดล้อมการดำเนินการทดสอบ
ที่มา
ภาษา Bazel BUILD มีกฎที่สามารถใช้เพื่อกำหนดโปรแกรมทดสอบอัตโนมัติในหลายภาษา
การทดสอบจะดำเนินการโดยใช้ bazel test
ผู้ใช้อาจเรียกใช้ไบนารีทดสอบโดยตรง เราอนุญาตแต่ไม่ได้รับการรับรอง เนื่องจากคำขอดังกล่าวไม่เป็นไปตามข้อกำหนดที่อธิบายไว้ด้านล่าง
การทดสอบควรเป็นแบบผลัดกันเล่น กล่าวคือ ต้องเข้าถึงเฉพาะทรัพยากรที่มีทรัพยากร Dependency ที่ประกาศไว้เท่านั้น หากการทดสอบไม่ได้ชัดเจนอย่างถูกต้อง การทดสอบก็ไม่ได้ให้ผลลัพธ์ที่สามารถทำให้เกิดซ้ำได้ในอดีต นี่อาจเป็นปัญหาสำคัญในการค้นหาผู้ต้องหา (ระบุว่าการเปลี่ยนแปลงใดทำให้การทดสอบเสียหาย) เผยแพร่ความสามารถในการตรวจสอบทางวิศวกรรม และการแยกทรัพยากรของการทดสอบ (เฟรมเวิร์กการทดสอบอัตโนมัติไม่ใช่ DDOS ในเซิร์ฟเวอร์เพราะการทดสอบบางอย่างเกิดขึ้นจากเซิร์ฟเวอร์)
วัตถุประสงค์
เป้าหมายของหน้านี้คือการสร้างสภาพแวดล้อมรันไทม์อย่างเป็นทางการสำหรับและลักษณะการทำงานที่คาดไว้ของการทดสอบ Bazel นอกจากนี้ยังกำหนดข้อกำหนดของตัวดำเนินการทดสอบและระบบบิลด์
ข้อกำหนดของสภาพแวดล้อมการทดสอบช่วยให้ผู้เขียนทดสอบหลีกเลี่ยงการพึ่งพาพฤติกรรมที่ไม่ระบุ และทำให้โครงสร้างพื้นฐานการทดสอบมีอิสระมากขึ้นในการเปลี่ยนแปลงการนำไปใช้งาน ข้อกำหนดจะทำให้ช่องบางช่องโหว่ลงผ่านการทดสอบหลายครั้งแม้จะไม่ได้ผ่อนปรน เปี่ยมด้วยความหมาย ไม่สม่ำเสมอ
หน้านี้มีจุดประสงค์เพื่อเป็นทั้งบรรทัดฐานและความน่าเชื่อถือ หากข้อกำหนดนี้และพฤติกรรมการใช้ตัวดำเนินการทดสอบมีความขัดแย้งกัน ข้อกำหนดดังกล่าวจะมีความสำคัญเหนือกว่า
ข้อกำหนดที่นำเสนอ
คำสำคัญที่ว่า "ต้อง" "ต้องไม่" "จำเป็น" "จะ" "จะไม่" "ควร" "ไม่ควร" "แนะนำ" "อาจ" และ "ไม่บังคับ" ได้รับการตีความตามที่อธิบายไว้ใน IETF RFC 2119
วัตถุประสงค์ของการทดสอบ
วัตถุประสงค์ของการทดสอบ Bazel คือการยืนยันพร็อพเพอร์ตี้บางรายการของไฟล์ต้นฉบับที่ตรวจสอบในที่เก็บ (ในหน้านี้ "ซอร์สไฟล์" จะมีข้อมูลการทดสอบ เอาต์พุต Golden และข้อมูลอื่นๆ ที่ควบคุมเวอร์ชัน) ผู้ใช้คนหนึ่งเขียนการทดสอบเพื่อยืนยันค่าความแปรปรวนที่ต้องการคงไว้ ผู้ใช้รายอื่นทำการทดสอบในภายหลังเพื่อตรวจสอบว่าค่าคงที่ได้เสียหายหรือไม่ หากการทดสอบขึ้นอยู่กับตัวแปรอื่นๆ ที่ไม่ใช่ไฟล์ต้นฉบับ (ไม่ผ่อนปรน) ค่าของตัวแปรจะลดลง เนื่องจากผู้ใช้ในภายหลังจะไม่แน่ใจว่าการเปลี่ยนแปลงนั้นเกิดจากความผิดพลาด เมื่อการทดสอบหยุดผ่านหรือไม่
ดังนั้นผลลัพธ์ของการทดสอบจึงขึ้นอยู่กับปัจจัยต่อไปนี้เท่านั้น
- ไฟล์ต้นฉบับที่การทดสอบมีทรัพยากร Dependency ที่ประกาศแล้ว
- ผลิตภัณฑ์ของระบบบิลด์ที่การทดสอบมีการขึ้นต่อกันที่ประกาศไว้
- ของทรัพยากรที่ผู้ทำการทดสอบรับประกันว่าพฤติกรรมนั้นคงที่
ลักษณะการทำงานเช่นนี้ยังไม่ได้บังคับใช้ในขณะนี้ อย่างไรก็ตาม ผู้ดำเนินการทดสอบขอสงวนสิทธิ์ในการเพิ่มการบังคับใช้ดังกล่าวในอนาคต
บทบาทของระบบบิลด์
กฎการทดสอบคล้ายกับกฎไบนารีตรงที่แต่ละกฎต้องมีโปรแกรมที่ดำเนินการได้ สำหรับบางภาษา นี่คือโปรแกรม Stub ซึ่งรวมสายมัดเฉพาะภาษาเข้ากับโค้ดการทดสอบ กฎการทดสอบต้องสร้าง เอาต์พุตอื่นๆ ด้วย นอกเหนือจากไฟล์ดำเนินการทดสอบหลักแล้ว ตัวดำเนินการทดสอบจะต้องมีไฟล์ Manifest ของ runfiles ไฟล์อินพุตที่ควรพร้อมใช้งานสำหรับการทดสอบระหว่างรันไทม์ และอาจต้องมีข้อมูลเกี่ยวกับประเภท ขนาด และแท็กของการทดสอบ
ระบบบิลด์อาจใช้ Runfiles เพื่อส่งโค้ดและข้อมูล (ซึ่งอาจใช้ในการเพิ่มประสิทธิภาพเพื่อทำให้ไบนารีของการทดสอบแต่ละรายการมีขนาดเล็กลงโดยการแชร์ไฟล์ระหว่างการทดสอบ เช่น ผ่านการใช้ลิงก์แบบไดนามิก) ระบบบิลด์ควรตรวจสอบว่าไฟล์สั่งการที่สร้างขึ้นโหลดไฟล์เหล่านี้ผ่านอิมเมจ Runfiles ที่ให้ไว้โดยตัวดำเนินการทดสอบ ไม่ใช่การอ้างอิงตำแหน่งแบบสัมบูรณ์ในซอร์สหรือทรีเอาต์พุต
บทบาทของผู้ดำเนินการทดสอบ
จากมุมมองของผู้ทำการทดสอบ การทดสอบแต่ละรายการเป็นโปรแกรมที่เรียกใช้ได้ด้วย execve()
อาจมีวิธีอื่นๆ ในการดำเนินการทดสอบ เช่น IDE อาจอนุญาตให้ดำเนินการทดสอบ Java ในระหว่างกระบวนการ อย่างไรก็ตาม ผลลัพธ์ของการทดสอบที่เป็นกระบวนการแบบสแตนด์อโลนจะต้องถือว่าเชื่อถือได้ หากกระบวนการทดสอบทำงานจนเสร็จสิ้นและสิ้นสุดลงตามปกติโดยมีรหัสการออกเป็น 0 หมายความว่าการทดสอบผ่านแล้ว ผลลัพธ์อื่นๆ จะถือว่าเป็นการทดสอบล้มเหลว โดยเฉพาะอย่างยิ่ง การเขียนสตริง PASS
หรือ FAIL
ไปยัง Stdout นั้นไม่มีความสำคัญใดๆ ต่อตัวดำเนินการทดสอบ
หากการทดสอบใช้เวลาดำเนินการนานเกินไป เกินขีดจำกัดทรัพยากรที่กำหนด หรือผู้ดำเนินการทดสอบตรวจพบพฤติกรรมต้องห้าม การดำเนินการดังกล่าวอาจเลือกหยุดการทดสอบและถือว่าการดำเนินการล้มเหลว นักวิ่งต้องไม่รายงานว่าผ่านการทดสอบหลังจากส่งสัญญาณไปยังกระบวนการทดสอบหรือเด็กผ่านกระบวนการทดสอบแล้ว
เป้าหมายการทดสอบทั้งหมด (ไม่ใช่แต่ละวิธีหรือการทดสอบแต่ละรายการ) จะมีเวลาจำกัดในการดำเนินการให้เสร็จสมบูรณ์ ขีดจำกัดเวลาสำหรับการทดสอบจะอิงตามแอตทริบิวต์ timeout
ของการทดสอบในตารางต่อไปนี้
เวลานอก | ขีดจำกัดเวลา (วินาที) |
---|---|
วิดีโอสั้น | 60 |
ปานกลาง | 300 |
long | 900 |
นิรันดร์ | 3,600 |
การทดสอบที่ไม่ได้ระบุระยะหมดเวลาไว้อย่างชัดเจนจะแสดงแบบโดยนัยโดยอิงตาม size
ของการทดสอบดังนี้
ขนาด | ป้ายกำกับการหมดเวลาโดยนัย |
---|---|
เล็ก | วิดีโอสั้น |
medium | ปานกลาง |
ใหญ่ | long |
มโหฬาร | นิรันดร์ |
การทดสอบ "ขนาดใหญ่" ที่ไม่มีการตั้งค่าระยะหมดเวลาอย่างชัดแจ้งจะได้รับการจัดสรรเวลา 900 วินาทีในการทำงาน การทดสอบ "ปานกลาง" ที่มีระยะหมดเวลาเป็น "สั้น" จะได้รับการจัดสรรเวลา 60 วินาที
นอกจากนี้ size
ยังกำหนดการใช้งานสูงสุดของทรัพยากรอื่นๆ (เช่น RAM) เมื่อทำการทดสอบภายในเครื่อง ซึ่งต่างจาก timeout
ตามที่อธิบายไว้ในคำจำกัดความทั่วไป
ชุดค่าผสมของป้ายกำกับ size
และ timeout
ทั้งหมดถูกกฎหมาย ดังนั้นจึงอาจมีการประกาศการทดสอบ "ขนาดใหญ่" ให้มีระยะหมดเวลาที่ "สั้น" คงจะทำเรื่องเลวร้ายๆ ขึ้นมาได้อย่างรวดเร็ว
การทดสอบอาจแสดงผลอย่างรวดเร็วเองโดยไม่คำนึงถึงระยะหมดเวลา การทดสอบไม่ได้ถูกลงโทษจากการหมดเวลาที่มากเกินไป แม้จะได้รับคำเตือนว่า โดยทั่วไปแล้วคุณควรตั้งค่าระยะหมดเวลาให้แน่นที่สุดเท่าที่จะทำได้โดยไม่ก่อให้เกิดความไม่สม่ำเสมอใดๆ
ลบล้างระยะหมดเวลาทดสอบได้ด้วยแฟล็กเบเซล --test_timeout
ที่ทำงานด้วยตนเองภายใต้เงื่อนไขที่ทราบว่าช้า ค่า --test_timeout
มีหน่วยเป็นวินาที ตัวอย่างเช่น --test_timeout=120
ตั้งค่าระยะหมดเวลาการทดสอบเป็น 2 นาที
นอกจากนี้ยังมีขอบเขตล่างที่แนะนำสำหรับระยะหมดเวลาในการทดสอบดังนี้
เวลานอก | เวลาขั้นต่ำ (วินาที) |
---|---|
วิดีโอสั้น | 0 |
ปานกลาง | 30 |
long | 300 |
นิรันดร์ | 900 |
ตัวอย่างเช่น หากการทดสอบ "ปานกลาง" เสร็จสมบูรณ์ใน 5.5 วินาที ให้พิจารณาตั้งค่า timeout =
"short"
หรือ size = "small"
การใช้ตัวเลือกบรรทัดคำสั่งแบบ Bazel --test_verbose_timeout_warnings
จะแสดงการทดสอบที่มีขนาดที่ระบุใหญ่เกินไป
ขนาดและระยะหมดเวลาทดสอบจะระบุไว้ในไฟล์ BUILD ตามข้อกำหนดที่นี่ หากไม่ระบุ ขนาดของการทดสอบจะมีค่าเริ่มต้นเป็น "กลาง"
หากขั้นตอนหลักของการออกจากการทดสอบมีลูกที่ยังทำงานอยู่ ผู้ดำเนินการทดสอบควรถือว่าการดำเนินการนั้นเสร็จสมบูรณ์แล้ว และนับว่าเป็นความสำเร็จหรือล้มเหลวโดยอิงตามโค้ดการออกที่สังเกตได้จากกระบวนการหลัก ตัวดำเนินการทดสอบ อาจทำลายกระบวนการที่หลงเหลืออยู่ได้ การทดสอบไม่ควรทำให้กระบวนการรั่วไหล
ทดสอบชาร์ดดิ้ง
คุณสามารถโหลดการทดสอบพร้อมกันผ่านชาร์ดดิ้งทดสอบได้ ดู --test_sharding_strategy
และ shard_count
เพื่อเปิดใช้ชาร์ดดิ้งทดสอบ เมื่อเปิดใช้ชาร์ด ตัวดำเนินการทดสอบจะเริ่มทำงาน 1 ครั้งต่อชาร์ด ตัวแปรสภาพแวดล้อม TEST_TOTAL_SHARDS
คือจำนวนชาร์ดและ TEST_SHARD_INDEX
คือดัชนีชาร์ดที่เริ่มต้นที่ 0 นักวิ่งใช้ข้อมูลนี้เพื่อเลือกการทดสอบที่จะเรียกใช้
เช่น การใช้กลยุทธ์แบบพบกันหมด ผู้ดำเนินการทดสอบบางคนไม่รองรับชาร์ดดิ้ง หากตัวเรียกใช้รองรับชาร์ดดิ้ง โปรแกรมเรียกใช้จะต้องสร้างหรืออัปเดตวันที่แก้ไขล่าสุดของไฟล์ที่ระบุโดย TEST_SHARD_STATUS_FILE
มิเช่นนั้น หากเปิดใช้ --incompatible_check_sharding_support
Bazel จะล้มเหลวการทดสอบหากมีการชาร์ด
เงื่อนไขเริ่มต้น
ขณะดำเนินการทดสอบ ผู้ดำเนินการทดสอบต้องกำหนดเงื่อนไขเริ่มต้นบางอย่าง
ผู้ดำเนินการทดสอบต้องเรียกใช้การทดสอบแต่ละรายการด้วยเส้นทางไปยังไฟล์ปฏิบัติการทดสอบใน argv[0]
เส้นทางนี้ต้องสัมพันธ์กันและอยู่ใต้ไดเรกทอรีปัจจุบันของการทดสอบ (ซึ่งอยู่ในโครงสร้าง Runfiles โปรดดูด้านล่าง) ตัวดำเนินการทดสอบไม่ควรส่งอาร์กิวเมนต์อื่นๆ ไปยังการทดสอบ เว้นแต่ผู้ใช้จะร้องขออย่างชัดแจ้ง
บล็อกสภาพแวดล้อมเริ่มต้นจะต้องมีลักษณะดังต่อไปนี้
ตัวแปร | ค่า | สถานะ |
---|---|---|
HOME |
ค่าของ $TEST_TMPDIR |
แนะนำ |
LANG |
ไม่ได้ตั้งค่า | จำเป็น |
LANGUAGE |
ไม่ได้ตั้งค่า | จำเป็น |
LC_ALL |
ไม่ได้ตั้งค่า | จำเป็น |
LC_COLLATE |
ไม่ได้ตั้งค่า | จำเป็น |
LC_CTYPE |
ไม่ได้ตั้งค่า | จำเป็น |
LC_MESSAGES |
ไม่ได้ตั้งค่า | จำเป็น |
LC_MONETARY |
ไม่ได้ตั้งค่า | จำเป็น |
LC_NUMERIC |
ไม่ได้ตั้งค่า | จำเป็น |
LC_TIME |
ไม่ได้ตั้งค่า | จำเป็น |
LD_LIBRARY_PATH |
รายการไดเรกทอรีที่คั่นด้วยโคลอนที่มีไลบรารีที่ใช้ร่วมกัน | ไม่บังคับ |
JAVA_RUNFILES |
ค่าของ $TEST_SRCDIR |
เลิกใช้งานแล้ว |
LOGNAME |
ค่าของ $USER |
จำเป็น |
PATH |
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:. |
แนะนำ |
PWD |
$TEST_SRCDIR/workspace-name |
แนะนำ |
SHLVL |
2 |
แนะนำ |
TEST_INFRASTRUCTURE_FAILURE_FILE |
เส้นทางสัมบูรณ์ไปยังไฟล์ส่วนตัวในไดเรกทอรีที่เขียนได้ (ไฟล์นี้ควรใช้เพื่อรายงานความล้มเหลวที่เกิดจากโครงสร้างพื้นฐานของการทดสอบเท่านั้น ไม่ใช่เพื่อเป็นกลไกทั่วไปสำหรับการรายงานความล้มเหลวที่ไม่สม่ำเสมอของการทดสอบ ในบริบทนี้ โครงสร้างพื้นฐานของการทดสอบหมายถึงระบบหรือไลบรารีที่ไม่ได้มีไว้สำหรับการทดสอบโดยเฉพาะ แต่อาจทำให้การทดสอบล้มเหลวจากการทำงานผิดพลาดได้ บรรทัดแรกคือชื่อของคอมโพเนนต์โครงสร้างพื้นฐานการทดสอบที่ทำให้เกิดความล้มเหลว บรรทัดแรกที่ 2 เป็นคำอธิบายความล้มเหลวที่มนุษย์อ่านได้ ระบบจะไม่ประมวลผลบรรทัดเพิ่มเติม) | ไม่บังคับ |
TEST_LOGSPLITTER_OUTPUT_FILE |
เส้นทางแบบสัมบูรณ์ไปยังไฟล์ส่วนตัวในไดเรกทอรีที่เขียนได้ (ใช้เพื่อเขียนบันทึก protobuffer ของ Loggingplitter) | ไม่บังคับ |
TEST_PREMATURE_EXIT_FILE |
เส้นทางสัมบูรณ์ไปยังไฟล์ส่วนตัวในไดเรกทอรีที่เขียนได้ (ใช้สำหรับการจับการเรียกไปยัง exit() ) |
ไม่บังคับ |
TEST_RANDOM_SEED |
หากใช้ตัวเลือก --runs_per_test ระบบจะตั้งค่า TEST_RANDOM_SEED เป็น run number (เริ่มต้นด้วย 1) สำหรับการเรียกใช้การทดสอบแต่ละครั้ง |
ไม่บังคับ |
TEST_RUN_NUMBER |
หากใช้ตัวเลือก --runs_per_test ระบบจะตั้งค่า TEST_RUN_NUMBER เป็น run number (เริ่มต้นด้วย 1) สำหรับการเรียกใช้การทดสอบแต่ละครั้ง |
ไม่บังคับ |
TEST_TARGET |
ชื่อของเป้าหมายที่กำลังทดสอบ | ไม่บังคับ |
TEST_SIZE |
การทดสอบ size |
ไม่บังคับ |
TEST_TIMEOUT |
การทดสอบ timeout ในไม่กี่วินาที |
ไม่บังคับ |
TEST_SHARD_INDEX |
ดัชนีชาร์ด (shard Index) ถ้าใช้ sharding |
ไม่บังคับ |
TEST_SHARD_STATUS_FILE |
เส้นทางไปยังไฟล์สำหรับแตะเพื่อระบุว่าการสนับสนุนสำหรับ sharding |
ไม่บังคับ |
TEST_SRCDIR |
เส้นทางสัมบูรณ์ไปยังฐานของโครงสร้าง Runfiles | จำเป็น |
TEST_TOTAL_SHARDS |
ทั้งหมด
shard count
หากใช้ sharding |
ไม่บังคับ |
TEST_TMPDIR |
เส้นทางแบบสัมบูรณ์ไปยังไดเรกทอรีส่วนตัวที่เขียนได้ | จำเป็น |
TEST_WORKSPACE |
ชื่อพื้นที่ทำงานของที่เก็บในเครื่อง | ไม่บังคับ |
TEST_UNDECLARED_OUTPUTS_DIR |
เส้นทางสัมบูรณ์ไปยังไดเรกทอรีส่วนตัวที่เขียนได้ (ใช้ในการเขียนเอาต์พุตทดสอบที่ไม่ได้ประกาศ) ระบบจะบีบอัดไฟล์ที่เขียนไปยังไดเรกทอรี TEST_UNDECLARED_OUTPUTS_DIR ไว้และเพิ่มลงในไฟล์ outputs.zip ภายใต้ bazel-testlogs |
ไม่บังคับ |
TEST_UNDECLARED_OUTPUTS_ANNOTATIONS_DIR |
เส้นทางแบบสัมบูรณ์ไปยังไดเรกทอรีส่วนตัวที่เขียนได้ (ใช้เพื่อเขียนคำอธิบายประกอบเอาต์พุตการทดสอบ .part และ .pb ที่ไม่ได้ประกาศ) |
ไม่บังคับ |
TEST_WARNINGS_OUTPUT_FILE |
เส้นทางสัมบูรณ์ไปยังไฟล์ส่วนตัวในไดเรกทอรีที่เขียนได้ (ใช้เพื่อเขียนคำเตือนเป้าหมายการทดสอบ) | ไม่บังคับ |
TESTBRIDGE_TEST_ONLY |
ค่าของ --test_filter หากระบุ |
ไม่บังคับ |
TZ |
UTC |
จำเป็น |
USER |
ค่าของ getpwuid(getuid())->pw_name |
จำเป็น |
XML_OUTPUT_FILE |
ตำแหน่งที่ตั้งที่การดำเนินการทดสอบควรเขียนไฟล์เอาต์พุต XML ของผลการทดสอบ ไม่เช่นนั้น Bazel จะสร้างไฟล์เอาต์พุต XML เริ่มต้นที่รวมบันทึกทดสอบเป็นส่วนหนึ่งของการดำเนินการทดสอบ สคีมา XML อิงตามสคีมาผลการทดสอบ JUnit | ไม่บังคับ |
BAZEL_TEST |
บ่งบอกว่า bazel test ขับเคลื่อนไฟล์ดำเนินการทดสอบ |
จำเป็น |
สภาพแวดล้อมอาจมีรายการเพิ่มเติม การทดสอบไม่ควรขึ้นอยู่กับการมีอยู่ การไม่มี หรือค่าของตัวแปรสภาพแวดล้อมใดๆ ที่ไม่ได้ระบุไว้ข้างต้น
ไดเรกทอรีการทำงานเริ่มต้นคือ $TEST_SRCDIR/$TEST_WORKSPACE
ไม่ได้ระบุรหัสกระบวนการปัจจุบัน รหัสกลุ่มกระบวนการ รหัสเซสชัน และรหัสกระบวนการระดับบนสุด กระบวนการนี้อาจเป็นผู้นำกลุ่มกระบวนการหรือผู้นำเซสชันหรือไม่ก็ได้ กระบวนการนี้อาจมีหรือไม่มีเทอร์มินัลควบคุม กระบวนการนี้อาจไม่มีโปรเซสย่อยใดทำงานอยู่เลยหรือมีโปรเซสย่อยที่ไม่มีการดำเนินการ กระบวนการนี้ไม่ควรมีเทรดหลายรายการเมื่อโค้ดทดสอบได้รับการควบคุม
ต้องเปิดตัวบ่งชี้ไฟล์ 0 (stdin
) ให้อ่านได้ แต่จะไม่ระบุสิ่งที่แนบอยู่ การทดสอบจะต้องไม่อ่านจากการทดสอบ ตัวบอกไฟล์ 1 (stdout
) และ 2
(stderr
) ต้องเปิดให้เขียนได้ แต่จะไม่มีการระบุสิ่งที่แนบมาด้วย โดยอาจเป็นเทอร์มินัล, ไปป์, ไฟล์ปกติ หรือสิ่งอื่นๆ ที่จะเขียนอักขระได้ โดยอาจแชร์รายการในตารางไฟล์ที่เปิดอยู่ (หมายความว่าไม่สามารถค้นหาได้อย่างอิสระ) การทดสอบไม่ควรรับค่า
ข้อบ่งชี้ไฟล์อื่นๆ ที่เปิดอยู่
ค่าตั้งต้นจะเป็น 022
หรือ 027
จะไม่มีการตั้งนาฬิกาปลุกหรือตัวจับเวลาแบบกำหนดช่วง
มาสก์เริ่มต้นของสัญญาณที่ถูกบล็อกจะต้องว่างเปล่า สัญญาณทั้งหมดต้องตั้งเป็น การทำงานเริ่มต้น
ขีดจำกัดทรัพยากรเริ่มต้น ทั้งแบบนุ่มและแข็ง ควรกำหนดดังนี้
ทรัพยากร | ขีดจำกัด |
---|---|
RLIMIT_AS |
ไม่จำกัด |
RLIMIT_CORE |
ไม่ระบุ |
RLIMIT_CPU |
ไม่จำกัด |
RLIMIT_DATA |
ไม่จำกัด |
RLIMIT_FSIZE |
ไม่จำกัด |
RLIMIT_LOCKS |
ไม่จำกัด |
RLIMIT_MEMLOCK |
ไม่จำกัด |
RLIMIT_MSGQUEUE |
ไม่ระบุ |
RLIMIT_NICE |
ไม่ระบุ |
RLIMIT_NOFILE |
อย่างน้อย 1024 |
RLIMIT_NPROC |
ไม่ระบุ |
RLIMIT_RSS |
ไม่จำกัด |
RLIMIT_RTPRIO |
ไม่ระบุ |
RLIMIT_SIGPENDING |
ไม่ระบุ |
RLIMIT_STACK |
ไม่จำกัด หรือ 2044KB <= rlim <= 8192KB |
ไม่มีการระบุเวลาในการประมวลผลเริ่มต้น (ตามที่ times()
ส่งคืน) และการใช้งานทรัพยากร (ตามที่ getrusage()
แสดงผล)
ไม่ได้ระบุนโยบายการกำหนดเวลาเริ่มต้นและลำดับความสำคัญ
บทบาทของระบบโฮสต์
นอกเหนือจากบริบทของผู้ใช้ที่อยู่ภายใต้การควบคุมตัวดำเนินการทดสอบโดยตรงแล้ว ระบบปฏิบัติการที่ใช้ทดสอบจะต้องมีคุณสมบัติตรงตามพร็อพเพอร์ตี้บางรายการเพื่อให้การทดสอบใช้งานได้
ระบบไฟล์
ไดเรกทอรีรากที่การทดสอบสังเกตได้อาจเป็นหรือไม่ใช่ไดเรกทอรีรากจริงก็ได้
ต้องต่อเชื่อม /proc
เครื่องมือสร้างทั้งหมดจะแสดงอยู่ในเส้นทางสัมบูรณ์ของ /usr
ซึ่งใช้โดยการติดตั้งภายใน
เส้นทางที่ขึ้นต้นด้วย /home
อาจไม่พร้อมใช้งาน การทดสอบไม่ควรเข้าถึง
เส้นทางลักษณะดังกล่าว
/tmp
ต้องเขียนได้ แต่การทดสอบควรหลีกเลี่ยงการใช้เส้นทางเหล่านี้
การทดสอบต้องไม่สันนิษฐานว่ามีเส้นทางคงที่ใดๆ ก็ตามที่พร้อมใช้งานสำหรับการใช้งานเฉพาะตัว
การทดสอบต้องไม่สันนิษฐานว่ามีการเปิดใช้ Atime กับระบบไฟล์ใดๆ ที่ต่อเชื่อม
ผู้ใช้และกลุ่ม
ต้องมีรูทผู้ใช้ ไม่มีผู้ใช้ และ unittest อยู่ รูทของกลุ่ม ไม่มีใคร และวิศวกร
การทดสอบต้องดำเนินการในฐานะผู้ใช้ที่ไม่ใช่ระดับรูท รหัสผู้ใช้จริงที่มีประสิทธิภาพต้องเท่ากัน และเช่นเดียวกันสำหรับรหัสกลุ่ม หลังจากนั้น จะไม่มีการระบุรหัสผู้ใช้ รหัสกลุ่ม ชื่อผู้ใช้ และชื่อกลุ่มปัจจุบัน ไม่ได้ระบุชุดรหัสกลุ่มเสริม
รหัสผู้ใช้และรหัสกลุ่มปัจจุบันต้องมีชื่อที่ตรงกันซึ่งดึงข้อมูลได้ด้วย getpwuid()
และ getgrgid()
ทั้งนี้ รหัสกลุ่มเสริมอาจไม่เหมือนกัน
ผู้ใช้ปัจจุบันต้องมีไดเรกทอรีหน้าแรก เนื่องจากอาจไม่สามารถเขียนได้ การทดสอบต้องไม่พยายามเขียน ไปยังข้อความทดสอบ
ระบบเครือข่าย
ไม่ได้ระบุชื่อโฮสต์ และอาจไม่มีจุดก็ได้ การแก้ไขชื่อโฮสต์ต้องระบุที่อยู่ IP ของโฮสต์ปัจจุบัน การแก้ไขชื่อโฮสต์ที่ตัดหลังจุดแรกก็ต้องได้ผลเช่นกัน ต้องแปลงชื่อโฮสต์ localhost
แหล่งข้อมูลอื่นๆ
การทดสอบจะได้รับ CPU อย่างน้อย 1 Core ฟังก์ชันอื่นๆ อาจมีให้ใช้ แต่เราไม่สามารถรับประกันได้ ไม่ได้ระบุแง่มุมด้านประสิทธิภาพอื่นๆ ของแกนนี้ คุณสามารถเพิ่มการจองให้มีจำนวนแกน CPU สูงขึ้นโดยการเพิ่มแท็ก "cpu:n" (โดยที่ n เป็นตัวเลขบวก) ในกฎทดสอบ หากเครื่องมีแกน CPU รวมน้อยกว่าที่ขอ Bazel จะยังคงทำการทดสอบ หากการทดสอบใช้การชาร์ด ชาร์ดแต่ละรายการจะสงวนจำนวนแกน CPU ที่ระบุไว้ที่นี่
การทดสอบอาจสร้างกระบวนการย่อย แต่ไม่อาจประมวลผลกลุ่มหรือเซสชัน
การทดสอบอาจใช้ไฟล์อินพุตได้เป็นจำนวนจำกัด ขีดจํากัดนี้อาจมีการเปลี่ยนแปลง แต่ขณะนี้อยู่ในช่วงอินพุตหลายหมื่นรายการ
เวลาและวันที่
ไม่ได้ระบุเวลาและวันที่ปัจจุบัน ไม่ได้ระบุเขตเวลาของระบบ
X Windows อาจไม่พร้อมใช้งาน การทดสอบที่ต้องใช้เซิร์ฟเวอร์ X ควรเริ่มต้น Xvfb
ทดสอบการโต้ตอบกับระบบไฟล์
เส้นทางไฟล์ทั้งหมดที่ระบุในตัวแปรสภาพแวดล้อมการทดสอบจะชี้ไปยังที่ใดก็ได้ในระบบไฟล์ในเครื่อง เว้นแต่จะระบุไว้เป็นอย่างอื่น
การทดสอบควรสร้างไฟล์เฉพาะภายในไดเรกทอรีที่ระบุโดย $TEST_TMPDIR
และ $TEST_UNDECLARED_OUTPUTS_DIR
(หากตั้งค่าไว้)
ในตอนแรกไดเรกทอรีเหล่านี้จะว่างเปล่า
การทดสอบต้องไม่พยายามลบ chmod หรือแก้ไขไดเรกทอรีเหล่านี้
ไดเรกทอรีเหล่านี้อาจเป็นลิงก์สัญลักษณ์
ยังไม่ได้ระบุประเภทระบบไฟล์ของ $TEST_TMPDIR/.
การทดสอบอาจเขียนไฟล์ .part ไปยัง $TEST_UNDECLARED_OUTPUTS_ANNOTATIONS_DIR
เพื่อสร้างคำอธิบายประกอบไฟล์เอาต์พุตที่ไม่ได้ประกาศด้วย
ในบางกรณีที่เกิดขึ้นไม่บ่อยนัก อาจมีการบังคับให้ทดสอบสร้างไฟล์ใน /tmp
ตัวอย่างเช่น โดยทั่วไปแล้วคุณจะต้องสร้างซ็อกเก็ตภายใต้ /tmp
เพื่อขีดจำกัดความยาวเส้นทางสำหรับซ็อกเก็ตโดเมน Unix Bazel จะติดตามไฟล์ดังกล่าวไม่ได้ ตัวการทดสอบเองต้องระวังอย่างไม่มีการเปลี่ยนแปลง เพื่อไม่ให้เกิดการชนกับไฟล์อื่น ทำการทดสอบและกระบวนการที่ไม่ใช่การทดสอบไปพร้อมๆ กัน รวมถึงล้างไฟล์ที่สร้างขึ้นใน /tmp
เฟรมเวิร์กการทดสอบที่ได้รับความนิยมบางรายการ เช่น JUnit4 TemporaryFolder
หรือ Go TempDir
ก็มีวิธีสร้างไดเรกทอรีชั่วคราวใน /tmp
เป็นของตัวเอง เฟรมเวิร์กการทดสอบเหล่านี้มีฟังก์ชันที่ช่วยล้างไฟล์ใน /tmp
คุณจึงใช้เฟรมเหล่านี้ได้แม้สร้างไฟล์ภายนอก TEST_TMPDIR
ก็ตาม
การทดสอบต้องเข้าถึงอินพุตผ่านกลไก runfiles หรือส่วนอื่นๆ ของสภาพแวดล้อมการดำเนินการที่มีไว้โดยเฉพาะเพื่อทำให้ไฟล์อินพุตพร้อมใช้งาน
การทดสอบต้องไม่เข้าถึงเอาต์พุตอื่นๆ ของระบบบิลด์ที่เส้นทางที่อนุมานจากตำแหน่งของไฟล์ปฏิบัติการของตัวเอง
จะไม่มีการระบุว่าโครงสร้าง Runfiles ประกอบด้วยไฟล์ปกติ ลิงก์สัญลักษณ์ หรือไฟล์ผสม โครงสร้าง Runfiles อาจมีลิงก์สัญลักษณ์ไปยังไดเรกทอรี
การทดสอบควรหลีกเลี่ยงการใช้เส้นทางที่มีคอมโพเนนต์ ..
ภายในแผนผัง Runfiles
ไม่ควรเขียนไดเรกทอรี ไฟล์ หรือลิงก์สัญลักษณ์ภายในแผนผัง Runfiles (รวมถึงเส้นทางข้ามสัญลักษณ์) ได้ (ซึ่งตามมาว่าไดเรกทอรี
ที่ใช้งานได้เริ่มต้นไม่ควรเขียนได้) การทดสอบต้องไม่สันนิษฐานว่าส่วนใดก็ตามของ Runfile ที่เขียนได้หรือเป็นของผู้ใช้ปัจจุบัน (เช่น chmod
และ chgrp
อาจไม่สำเร็จ)
โครงสร้าง Runfiles (รวมถึงเส้นทางที่ส่งผ่านลิงก์สัญลักษณ์) ต้องไม่เปลี่ยนแปลงระหว่างการดำเนินการทดสอบ ไดเรกทอรีระดับบนสุดและการต่อเชื่อมระบบไฟล์จะต้องไม่มีการเปลี่ยนแปลงใดๆ ซึ่งจะส่งผลต่อผลลัพธ์ของการค้นหาเส้นทางภายในแผนผัง Runfiles
การทดสอบอาจสร้างไฟล์ตามเส้นทางที่ TEST_PREMATURE_EXIT_FILE
ระบุไว้เมื่อเริ่มต้นทำงาน และนำไฟล์ออกเมื่อออกเพื่อให้ควบคุมการออกได้เร็วขึ้น หาก Bazel เห็นไฟล์เมื่อการทดสอบเสร็จสิ้น ระบบจะถือว่าการทดสอบออกจากก่อนเวลาอันควรและทำเครื่องหมายว่าไม่ผ่าน
รูปแบบแท็ก
แท็กบางรายการในกฎการทดสอบจะมีความหมายพิเศษ ดูสารานุกรมการสร้างบาเซลในแอตทริบิวต์ tags
เพิ่มเติม
ติดแท็ก | ความหมาย |
---|---|
exclusive |
ไม่มีการทดสอบอื่นๆ ในเวลาเดียวกัน |
external |
การทดสอบมีการขึ้นต่อกันภายนอก ปิดใช้การแคชการทดสอบ |
large |
test_suite แบบแผน ชุดการทดสอบขนาดใหญ่ |
manual * |
ไม่รวมเป้าหมายการทดสอบในรูปแบบเป้าหมายไวลด์การ์ด เช่น :... , :* หรือ :all |
medium |
แบบแผน test_suite ชุดการทดสอบปานกลาง |
small |
test_suite แบบแผน ชุดการทดสอบขนาดเล็ก |
smoke |
test_suite ซึ่งหมายความว่าควรเรียกใช้ก่อนที่จะคอมมิตการเปลี่ยนแปลงโค้ดลงในระบบควบคุมเวอร์ชัน |
Runfiles
ในตัวอย่างต่อไปนี้ สมมติว่ามีกฎ *_binary() ที่ติดป้ายกำกับ
//foo/bar:unittest
พร้อมด้วยการขึ้นต่อกันของเวลาทำงานบนกฎที่มีป้ายกำกับ
//deps/server:server
ตำแหน่ง
ไดเรกทอรี Runfiles สำหรับเป้าหมาย //foo/bar:unittest
คือไดเรกทอรี $(WORKSPACE)/$(BINDIR)/foo/bar/unittest.runfiles
เส้นทางนี้เรียกว่า runfiles_dir
การอ้างอิง
ไดเรกทอรี Runfiles จะได้รับการประกาศว่าเป็นทรัพยากร Dependency เวลาคอมไพล์ของกฎ *_binary()
ตัวไดเรกทอรี Runfiles เองก็ขึ้นอยู่กับชุดของไฟล์ BUILD ที่ส่งผลต่อกฎ *_binary()
หรือทรัพยากร Dependency ของเวลาคอมไพล์หรือรันไทม์ใดๆ ก็ตาม การแก้ไขไฟล์ต้นฉบับไม่มีผลต่อโครงสร้างของไดเรกทอรี Runfiles จึงไม่ทริกเกอร์การสร้างใหม่ใดๆ
เนื้อหา
ไดเรกทอรี Runfiles ประกอบด้วยข้อมูลต่อไปนี้
- Symlinks กับทรัพยากร Dependency ของรันไทม์: ExportFile และ CommandRule แต่ละรายการที่เป็นทรัพยากร Dependency ขณะรันไทม์ของกฎ
*_binary()
จะแสดงด้วยลิงก์สัญลักษณ์เดียวในไดเรกทอรี Runfiles ชื่อของลิงก์สัญลักษณ์คือ$(WORKSPACE)/package_name/rule_name
ตัวอย่างเช่น symlink สำหรับเซิร์ฟเวอร์ จะมีชื่อว่า$(WORKSPACE)/deps/server/server
และเส้นทางแบบเต็มจะเป็น$(WORKSPACE)/foo/bar/unittest.runfiles/$(WORKSPACE)/deps/server/server
ปลายทางของลิงก์สัญลักษณ์คือ ExportFileName() ของ ExportFile หรือ CommandRule ซึ่งแสดงเป็นเส้นทางสัมบูรณ์ ดังนั้น ปลายทางของลิงก์สัญลักษณ์อาจเป็น$(WORKSPACE)/linux-dbg/deps/server/42/server
- ลิงก์สัญลักษณ์ไปยังไฟล์ย่อย: ทุกๆ
*_binary()
Z ซึ่งขึ้นต่อกันตามรันไทม์ของ*_binary()
C จะมีลิงก์ที่ 2 ในไดเรกทอรี Runfiles ของ C ไปยัง Runfiles ของ Z ชื่อของลิงก์สัญลักษณ์คือ$(WORKSPACE)/package_name/rule_name.runfiles
เป้าหมายของ symlink คือ ไดเรกทอรี runfiles ตัวอย่างเช่น โปรแกรมย่อยทั้งหมดจะใช้ไดเรกทอรี Runfiles ร่วมกัน