ขั้นตอนการทดสอบ Haskell


101

ฉันเพิ่งเริ่มโครงการ Haskell ใหม่และต้องการตั้งค่าขั้นตอนการทดสอบที่ดีตั้งแต่เริ่มต้น ดูเหมือนว่า Haskell มีเครื่องมือทดสอบที่ยอดเยี่ยมและไม่เหมือนใครมากมายและวิธีการต่างๆมากมายในการผสานรวมเข้าด้วยกัน

ฉันได้ตรวจสอบ:

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

คำตอบ:


70

การทดสอบหน่วยการครอบคลุมโค้ดและการวัดประสิทธิภาพส่วนใหญ่เกี่ยวกับการเลือกเครื่องมือที่เหมาะสม

  • กรอบการทดสอบเป็นร้านค้าแบบครบวงจรเพื่อเรียกใช้กรณีทดสอบHUnitและคุณสมบัติQuickCheckทั้งหมดของคุณทั้งหมดจากสายรัดเดียว
  • ความครอบคลุมของรหัสถูกสร้างขึ้นใน GHC ในรูปแบบของเครื่องมือHPC
  • เกณฑ์ให้เครื่องจักรเปรียบเทียบที่ยอดเยี่ยม

ฉันจะใช้เป็นตัวอย่างการใช้งานแพ็คเกจที่ฉันเพิ่งเริ่มเปิดใช้งานด้วยการทดสอบหน่วยการครอบคลุมโค้ดและการวัดประสิทธิภาพ:

http://github.com/ekmett/speculation

คุณสามารถรวมการทดสอบและการวัดประสิทธิภาพลงในไฟล์ cabal ของคุณได้โดยตรงโดยการเพิ่มส่วนสำหรับพวกเขาและปิดบังไว้ด้านหลังแฟล็กเพื่อไม่ให้สร้างขึ้นเพื่อให้ผู้ใช้ทุกคนในไลบรารีของคุณต้องเข้าถึงได้ (และต้องการใช้ด้วยตนเอง ) เวอร์ชันที่แน่นอนของเครื่องมือทดสอบที่คุณเลือก

http://github.com/ekmett/speculation/blob/master/speculation.cabal

จากนั้นคุณสามารถบอก cabal เกี่ยวกับวิธีเรียกใช้ชุดทดสอบของคุณ เนื่องจากยังไม่มีการทดสอบ cabal เราจึงมีนักเรียนคนหนึ่งกำลังทำการทดสอบนี้สำหรับซัมเมอร์ปีนี้! - กลไกที่ดีที่สุดที่เรามีคือนี่คือวิธีการใช้กลไกขอเกี่ยวกับผู้ใช้ของ cabal ซึ่งหมายถึงการเปลี่ยนไปใช้งานสร้างแบบ 'กำหนดเอง' ด้วย cabal และตั้งค่า testHook ตัวอย่างของ testHook ที่รันโปรแกรมทดสอบที่เขียนด้วย test-framework จากนั้นใช้ hpc กับโปรไฟล์สามารถพบได้ที่นี่:

http://github.com/ekmett/speculation/blob/master/Setup.lhs

จากนั้นคุณสามารถใช้ test-framework เพื่อรวมการทดสอบ QuickCheck และ HUnit ไว้ในโปรแกรมเดียว:

http://github.com/ekmett/speculation/blob/master/Test.hs

ไฟล์ cabal มีความระมัดระวังในการเปิด -fhpc เพื่อเปิดใช้งานการทดสอบความครอบคลุมของโค้ดจากนั้น testHook ใน Setup.lhs จะรัน hpc ด้วยตนเองและเขียนผลลัพธ์ลงใน dist dir ของคุณ

สำหรับการเปรียบเทียบเรื่องราวเป็นแบบแมนนวลขึ้นเล็กน้อยไม่มีตัวเลือก 'การเปรียบเทียบมาตรฐาน' คุณสามารถเชื่อมโยงเกณฑ์มาตรฐานของคุณเข้ากับตะขอทดสอบของคุณได้ แต่ฉันต้องการเรียกใช้ด้วยมือเนื่องจากเกณฑ์มีตัวเลือกการรายงานแบบกราฟิกมากมาย คุณสามารถเพิ่มเกณฑ์มาตรฐานของคุณไปยังไฟล์ cabal ดังที่แสดงไว้ด้านบนให้แฟล็กการคอมไพล์แยกต่างหากซ่อนไว้หลังแฟล็ก cabal จากนั้นใช้เกณฑ์เพื่อทำการยกของหนักทั้งหมด:

http://github.com/ekmett/speculation/blob/master/Benchmark.hs

จากนั้นคุณสามารถเรียกใช้การวัดประสิทธิภาพของคุณจากบรรทัดคำสั่งและรับหน้าต่าง KDE แบบป๊อปอัปพร้อมผลลัพธ์การเปรียบเทียบ ฯลฯ

เนื่องจากในทางปฏิบัติคุณอาศัยอยู่ใน Cabal ในขณะที่พัฒนาโค้ด Haskell จึงเป็นเรื่องที่สมเหตุสมผลที่จะรวม toolchain ของคุณเข้ากับมัน

แก้ไข : ขณะนี้มีการรองรับการทดสอบ Cabal แล้ว ดูhttp://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites


2
และcabal benchตอนนี้ก็มีอยู่เช่นกัน
nh2

6
จริง. ฉันจะชี้ไปที่github.com/ekmett/lensเป็นตัวอย่างที่ทันสมัยมากขึ้นของวิธีการจัดการกับcabal testและcabal benchผสมHUnit, doctestและquickcheckการทดสอบตามที่มีcriterionมาตรฐาน รหัสในวันspeculationก่อนcabal testและcabal bench.
Edward KMETT

2
@EdwardKmett: ฉันเห็นว่าแพ็คเกจเลนส์ใช้อินเตอร์เฟสชุดทดสอบ exitcode-stdio-1.0 เท่านั้น คู่มือผู้ใช้ Cabal ระบุว่า `` เป็นที่ต้องการให้เขียนชุดทดสอบใหม่สำหรับอินเทอร์เฟซแบบละเอียด -1.0 '' มีความคิดเห็นเกี่ยวกับเรื่องนี้หรือไม่?
copton

9
@copton พวกเขาไม่เคยใช้มัน เอกสารนั้นจะต้องถูกนำกลับมาและถ่ายภาพ
Edward KMETT

2
น่าเสียดายที่ลิงก์ไปยัง github ทั้งหมดชี้ไปที่สาขาหลักและดูเหมือนว่าทุกอย่างที่เกี่ยวข้องกับการทดสอบจะถูกลบออกจากไฟล์ cabal ดังนั้นลิงก์จึงเสียอย่างมีประสิทธิภาพ
Andrew Thaddeus Martin

52

แนวทางนี้สนับสนุนในRWH ch 11และในXMonadมีค่าประมาณ:

  • ระบุคุณสมบัติทั้งหมดของระบบใน QuickCheck
  • แสดงความครอบคลุมการทดสอบด้วย HPC
  • พฤติกรรมพื้นที่ยืนยันกับโปรไฟล์กอง
  • ด้ายยืนยัน / พฤติกรรมแบบคู่ขนานกับThreadScope
  • พฤติกรรม microbenchmark ยืนยันกับเกณฑ์

เมื่อสร้างค่าคงที่หลักของคุณผ่าน QuickCheck แล้วคุณสามารถเริ่มการปรับโครงสร้างใหม่โดยย้ายการทดสอบเหล่านั้นไปเป็นค่าคงที่ของประเภท

แนวทางปฏิบัติเพื่อสนับสนุนความพยายามของคุณ:

  • เรียกใช้การถดถอย QuickCheck แบบง่ายสำหรับทุกคอมมิต
  • เผยแพร่รายละเอียดความครอบคลุมของ HPC

14

แพคเกจการทดสอบกรอบน่ากลัวจริงๆ คุณสามารถรวมการทดสอบ HUnit และ QuickCheck ได้อย่างง่ายดายและรับไฟล์ปฏิบัติการที่รันชุดโปรแกรมที่ระบุเท่านั้นโดยยึดตามแฟล็กบรรทัดคำสั่งโดยมีเป้าหมายเอาต์พุตหลายรายการ

การทดสอบและการทำโปรไฟล์เป็นสัตว์ที่แตกต่างกัน สำหรับการทำโปรไฟล์ฉันจะตั้งค่าไฟล์ปฏิบัติการแยกต่างหากที่เน้นเฉพาะส่วนที่คุณต้องการสร้างโปรไฟล์และดูผลลัพธ์ของการสร้างและรันการสร้างโปรไฟล์อย่างละเอียด (ด้วย -prof-auto-all สำหรับการคอมไพล์และ + RTS -p สำหรับรันไทม์ ธง).


สืบมากขึ้นการบำรุงรักษาอย่างแข็งขันในการทดสอบกรอบอร่อย
sjakobi

10

สำหรับการทดสอบฉันใช้คุณสมบัติ HUnit และ QuickCheck และใช้Haskell Test Frameworkเพื่อรวบรวมการทดสอบหน่วยทั้งหมดและคุณสมบัติ QuickCheck ทั้งหมดโดยอัตโนมัติ

ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้พัฒนาหลักของ Haskell Test Framework


5
สเตฟานมีเอกสารบางอย่างเกี่ยวกับเรื่องนี้ ฉันเดาว่านั่นเป็นสาเหตุหลักที่ทำให้มันไม่เป็นที่นิยม มีคำถามที่ควรค่าแก่ความสนใจของคุณที่นี่: stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov

2
HTF รุ่นใหม่ 0.9.0.0 มาพร้อมกับเอกสารจำนวนมาก นอกจากนี้ผมย้ายไปพัฒนาเพื่อgithub.com/skogsbaer/HTF ฉันหวังว่านี่จะช่วยให้ผู้คนใช้ HTF และถามคำถามเกี่ยวกับ HTF ได้ง่ายขึ้น อย่าลังเลที่จะทำ!
stefanwehr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.