โดย Juan Altmayer Pizzorno และ Emery Berger จากห้องปฏิบัติการ PLASMA ของ UMass Amherst
CoverUp จะสร้างการทดสอบโดยอัตโนมัติเพื่อให้แน่ใจว่าโค้ดของคุณได้รับการทดสอบมากขึ้น (นั่นคือ เพิ่มความครอบคลุมของโค้ด) CoverUp ยังสามารถสร้างชุดทดสอบตั้งแต่เริ่มต้นได้หากคุณยังไม่มี การทดสอบใหม่จะขึ้นอยู่กับโค้ดของคุณ ทำให้มีประโยชน์สำหรับการทดสอบการถดถอย
CoverUp ได้รับการออกแบบมาเพื่อทำงานอย่างใกล้ชิดกับเฟรมเวิร์กการทดสอบ pytest ในการสร้างการทดสอบ ก่อนอื่นจะวัดความครอบคลุมของชุดของคุณโดยใช้ SlipCover จากนั้นเลือกส่วนของโค้ดที่ต้องการการทดสอบเพิ่มเติม (นั่นคือ โค้ดที่ถูกเปิดเผย) จากนั้น CoverUp จะมีส่วนร่วมในการสนทนากับ LLM โดยแจ้งให้ทำการทดสอบ ตรวจสอบผลลัพธ์เพื่อยืนยันว่าการทดสอบทำงานและเพิ่มความครอบคลุม (อีกครั้งโดยใช้ SlipCover) และแจ้งให้ปรับเปลี่ยนอีกครั้งตามความจำเป็น สุดท้ายนี้ CoverUp จะตรวจสอบว่าการทดสอบใหม่ทำงานร่วมกันได้ดีหรือไม่ และพยายามแก้ไขปัญหาใดๆ ที่พบ
สำหรับรายละเอียดด้านเทคนิคและการประเมินฉบับสมบูรณ์ โปรดดูเอกสาร arXiv ของเรา CoverUp: การสร้างการทดสอบโดยใช้ LLM แบบครอบคลุม (PDF)
CoverUp พร้อมใช้งานจาก PyPI ดังนั้นคุณจึงสามารถติดตั้งได้ง่ายๆ ด้วย
$ python3 -m pip install coverup
CoverUp สามารถใช้กับโมเดล OpenAI, Anthropic หรือ AWS Bedrock ได้ ต้องการให้รายละเอียดการเข้าถึงถูกกำหนดเป็นตัวแปรสภาพแวดล้อมของเชลล์: OPENAI_API_KEY
, ANTHROPIC_API_KEY
หรือ AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
ตามลำดับ
ตัวอย่างเช่น สำหรับ OpenAI คุณจะต้องสร้างบัญชี ตรวจสอบให้แน่ใจว่ามียอดคงเหลือเป็นบวก จากนั้นสร้างคีย์ API โดยจัดเก็บ "คีย์ลับ" (โดยปกติจะเป็นสตริงที่ขึ้นต้นด้วย sk-
) ในตัวแปรสภาพแวดล้อมชื่อ OPENAI_API_KEY
:
$ export OPENAI_API_KEY= < ...your-api-key... >
หากโมดูลของคุณชื่อ mymod
แหล่งที่มาของโมดูลอยู่ภายใต้ src
และการทดสอบภายใต้ tests
คุณสามารถเรียกใช้ CoverUp ได้เป็น
$ coverup --source-dir src/mymod --tests-dir tests
จากนั้น CoverUp จะสร้างการทดสอบชื่อ test_coverup_N.py
โดยที่ N
คือตัวเลข ใต้ไดเร็กทอรี tests
ที่นี่เรามี CoverUp สร้างการทดสอบเพิ่มเติมสำหรับแพ็คเกจ Flask ยอดนิยม:
$ coverup --package src/flask --tests tests
Measuring coverage... 90.9%
Prompting gpt-4o-2024-05-13 for tests to increase coverage...
(in the following, G=good, F=failed, U=useless and R=retry)
100%|███████████████████████████████████████| 92/92 [01:01<00:00, 1.50it/s, G=55, F=122, U=20, R=0, cost=~$4.19]
Measuring coverage... 94.4%
$
ในเวลาเพียงไม่กี่นาที CoverUp จะเพิ่มความครอบคลุมการทดสอบของ Flask จาก 90.9% เป็น 94.4%
ในขณะที่ประเมินการทดสอบที่สร้างขึ้นใหม่แต่ละครั้ง CoverUp จะดำเนินการหลายครั้งเพื่อพยายามตรวจจับการทดสอบที่ไม่สม่ำเสมอ ที่สามารถปรับได้ด้วยตัวเลือก --repeat-tests
และ --no-repeat-tests
หาก CoverUp ตรวจพบว่าการทดสอบที่สร้างขึ้นใหม่ไม่สม่ำเสมอ ระบบจะแจ้งให้ LLM ทำการแก้ไข
CoverUp จะเพิ่มการทดสอบให้กับชุดโปรแกรมที่เมื่อรันด้วยตัวเองจะผ่านและเพิ่มการครอบคลุมเท่านั้น อย่างไรก็ตาม อาจเป็นไปได้ว่าการทดสอบจะ "ก่อให้เกิดมลพิษ" ในรัฐ โดยเปลี่ยนแปลงในลักษณะที่ทำให้การทดสอบอื่นๆ ล้มเหลว ตามค่าเริ่มต้น CoverUp จะใช้ปลั๊กอิน pytest-cleanslate เพื่อแยกการทดสอบ โดยแก้ไขมลภาวะจากการทดสอบ (ในหน่วยความจำ) ที่สามารถปิดการใช้งานได้โดยผ่านตัวเลือก --no-isolate-tests
นอกจากนี้ยังสามารถขอให้ CoverUp ค้นหาและปิดการใช้งานโมดูลหรือฟังก์ชันการทดสอบที่สร้างมลพิษ ( --disable-polluting
) หรือเพียงแค่ปิดการใช้งานการทดสอบที่ล้มเหลว (``--disable-failing`)
ในการประเมินการทดสอบที่สร้างโดย LLM นั้น CoverUp จะต้องดำเนินการเหล่านั้น เพื่อความปลอดภัยที่ดีที่สุดและเพื่อลดความเสี่ยงต่อความเสียหายต่อระบบของคุณ เราขอแนะนำให้ใช้ CoverUp กับ Docker
กราฟแสดง CoverUp เมื่อเปรียบเทียบกับ CodaMosa ซึ่งเป็นเครื่องมือสร้างการทดสอบการค้นหาที่ล้ำสมัยโดยอิงจากเครื่องมือสร้างการทดสอบ Pynguin สำหรับการทดลองนี้ ทั้ง CoverUp และ CodaMosa ได้สร้างการทดสอบ "ตั้งแต่เริ่มต้น" กล่าวคือ ไม่สนใจชุดการทดสอบที่มีอยู่ แถบแสดงความแตกต่างในเปอร์เซ็นต์การครอบคลุมระหว่าง CoverUp และ CodaMosa สำหรับโมดูล Python ต่างๆ แถบสีเขียวที่สูงกว่า 0 แสดงว่า CoverUp ได้รับการครอบคลุมที่สูงกว่า
ตามกราฟที่แสดง CoverUp มีความครอบคลุมสูงกว่า CodaMosa สำหรับโมดูลส่วนใหญ่
นี่เป็นเวอร์ชันแรกของ CoverUp โปรดเพลิดเพลินและขออภัยหากเกิดการหยุดชะงักในขณะที่เราดำเนินการปรับปรุง เรายินดีรับรายงานข้อผิดพลาด รายงานประสบการณ์ และคำขอคุณสมบัติ (โปรดเปิดปัญหา)