การเขียนการทดสอบหน่วยใน Python: ฉันจะเริ่มได้อย่างไร [ปิด]


534

ฉันทำโปรเจ็กต์แรกที่เหมาะสมใน Python และตอนนี้งานของฉันคือเขียนการทดสอบ

เนื่องจากนี่เป็นครั้งแรกที่ฉันทำโครงการนี่เป็นครั้งแรกที่ฉันจะเขียนข้อสอบ

คำถามคือว่าฉันจะเริ่มต้นอย่างไร ฉันไม่รู้อย่างแน่นอน ทุกคนสามารถชี้ให้ฉันไปที่เอกสาร / กวดวิชา / ลิงค์ / หนังสือที่ฉันสามารถใช้เพื่อเริ่มต้นด้วยการทดสอบการเขียน (และฉันเดาการทดสอบหน่วยโดยเฉพาะอย่างยิ่ง)

คำแนะนำใด ๆ จะได้รับการต้อนรับในหัวข้อนี้


4
ไม่เคยมีคำว่าสายเกินไปที่จะทดสอบถ้าคุณตั้งใจ ดีกว่าที่จะมีบางอย่างสำหรับทุกคนที่บ่น ...
Asken

1
นี่คือหนังสือการพัฒนาที่ขับเคลื่อนด้วยการทดสอบที่ดีซึ่งให้บริการออนไลน์ฟรี: chimera.labs.oreilly.com/books/1234000000754/index.html
Will

4
ทรัพยากรที่ดีฉัน stumbled เมื่อhttps://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ ในฐานะมือใหม่ถึงงูใหญ่ฉันพบว่ามันเข้าใจได้
เรือข้ามฟาก

2
คำแนะนำของ Hitchhiker's to Python มีภาพรวมคร่าวๆของเครื่องมือสำหรับการทดสอบหน่วย: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko

ความคิดเห็นก่อนหน้านี้ควรได้รับการจัดอันดับสูงกว่าเนื่องจากคู่มือนี้มีที่เก็บรหัสตัวอย่างในgithub.com/kennethreitz/samplemodซึ่งเป็นสถานที่ที่เหมาะสำหรับการเริ่มต้นเช่นกัน
setempler

คำตอบ:


101

หากคุณเป็นแบรนด์ใหม่ที่ใช้ unittests วิธีที่ง่ายที่สุดในการเรียนรู้มักจะดีที่สุด บนพื้นฐานที่ว่าพร้อมฉันขอแนะนำให้ใช้py.testมากกว่าการเริ่มต้นunittestโมดูล

ลองพิจารณาสองตัวอย่างนี้ซึ่งทำสิ่งเดียวกัน:

ตัวอย่างที่ 1 (ไม่ตอบ):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

ตัวอย่างที่ 2 (pytest):

def test_starting_out():
    assert 1 == 1

สมมติว่าชื่อไฟล์ทั้งสองtest_unittesting.pyเราจะทำการทดสอบได้อย่างไร

ตัวอย่างที่ 1 (ไม่ตอบ):

cd /path/to/dir/
python test_unittesting.py

ตัวอย่างที่ 2 (pytest):

cd /path/to/dir/
py.test

7
ฉันเคยได้ยินเกี่ยวกับความเรียบง่ายของ py.test ในหลาย ๆ ที่ ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/… ) เหตุใดจึงunit-testยังคงรวมอยู่ในไลบรารีมาตรฐานหากpy.testและnoseให้ฟังก์ชันการทำงานเดียวกันกับอินเทอร์เฟซที่เรียบง่ายกว่ามาก? มันเป็นเพียงเพื่อให้เข้ากันได้ย้อนหลังหรือunittestมีข้อได้เปรียบที่py.testและnosetestไม่สามารถให้?
alpha_989

@ alpha_989 ไลบรารี python มาตรฐานไม่ได้มีไว้เพื่อให้มีเครื่องมือที่ดีที่สุด นั่นคือสิ่งที่ PyPI มีไว้สำหรับ unittestแพคเกจมาตรฐานยังคงดีพอ เป็นมาตรฐานซึ่งหมายความว่ามันรับประกันว่าจะทำงานได้ดี ในที่สุดทุกคนที่ใช้รหัสของคุณไม่จำเป็นต้องติดตั้งแพ็คเกจเพิ่มเติม
Jeyekomon

72

หนังสือ Python ฟรีDive Into Pythonมีบทเกี่ยวกับการทดสอบหน่วยที่คุณอาจพบว่ามีประโยชน์

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

สายไปหน่อยตอนนี้ แต่ตอนนี้คุณรู้แล้วในครั้งต่อไป :)


13
ฉันยังคงบอกว่าถ้าคุณต้องการ refactor code ที่ไม่มีการทดสอบหน่วยคุณควรเขียนการทดสอบหน่วยสำหรับมันก่อน
Hubert Kario

9
ใช่ผู้คนจำนวนมากที่มาที่ unittests เป็นครั้งแรกได้ยินสิ่งที่ดูเหมือน "ดีมันสายเกินไปสำหรับโครงการปัจจุบันของคุณ" จากมือเก่า: แม้ว่านั่นไม่ใช่สิ่งที่พวกเขาตั้งใจจะพูดจริงนั่นคือสิ่งที่มือใหม่ได้ยิน . มันเป็นเหมือนภาษิตจีนเกี่ยวกับการปลูกต้นไม้เวลาที่ดีที่สุดในการเริ่มทดสอบคือตอนเริ่มต้นของโครงการ ตอนนี้เป็นเวลาที่ดีที่สุดที่จะเริ่มการทดสอบแล้ว!
JP

4
ดำดิ่งลงสู่ลิงก์ Python เสีย ... :-(
Scott Skiles

40

ในความคิดของฉันมีสามกรอบการทดสอบที่ดีของงูหลามที่ดีในการตรวจสอบ
unittest - โมดูลมาพร้อมมาตรฐานกับ python distributions
จมูก - สามารถรันการทดสอบที่ไม่ได้ตั้งค่าได้
pytest - ยังใช้การทดสอบที่ไม่ซับซ้อนมีสำเร็จรูปน้อยกว่ารายงานที่ดีกว่ามีคุณสมบัติพิเศษที่ยอดเยี่ยมมากมาย

ที่จะได้รับการเปรียบเทียบที่ดีของสิ่งเหล่านี้อ่านผ่านการเปิดตัวไปในแต่ละที่http://pythontesting.net/start-here
นอกจากนี้ยังมีบทความเพิ่มเติมเกี่ยวกับการแข่งขันและอีกมากมาย


35

เอกสารสำหรับunittestจะเป็นจุดเริ่มต้นที่ดี

นอกจากนี้ยังช้าไปหน่อย แต่ในอนาคตโปรดลองเขียนการทดสอบหน่วยก่อนหรือระหว่างโครงการด้วยตัวเอง ด้วยวิธีนี้คุณสามารถใช้พวกเขาเพื่อทดสอบในขณะที่คุณดำเนินการตามและในทางทฤษฎีคุณสามารถใช้พวกเขาเป็นแบบทดสอบการถดถอยเพื่อตรวจสอบว่าการเปลี่ยนแปลงรหัสของคุณไม่ทำให้รหัสที่มีอยู่เสียหาย สิ่งนี้จะช่วยให้คุณได้รับประโยชน์อย่างเต็มที่จากการเขียนกรณีทดสอบ :)


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

27

UnitTestมาพร้อมกับห้องสมุดมาตรฐาน แต่ผมอยากจะแนะนำคุณnosetests

" จมูกยืดได้ง่ายเพื่อให้การทดสอบง่ายขึ้น "

ฉันขอแนะนำให้คุณไพลิน

" วิเคราะห์ซอร์สโค้ดของ Python เพื่อค้นหาข้อบกพร่องและสัญญาณคุณภาพต่ำ "


8

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

ตอนนี้เขียนการทดสอบหน่วยหรือไม่เป็นสายของคุณ คุณเพียงแค่ต้องระวังว่ามันอาจเป็นงานที่น่าเบื่อ คุณอาจเล่นงานนี้เพื่อเรียนรู้การทดสอบหน่วยหรือพิจารณาการทดสอบการยอมรับการเขียน (จบจากท้าย) ก่อนและเริ่มเขียนการทดสอบหน่วยเมื่อคุณเปลี่ยนรหัสหรือเพิ่มคุณสมบัติใหม่ให้กับโครงการ


2
+1 สำหรับ "การทำงานอย่างมีประสิทธิภาพด้วยรหัสดั้งเดิม" มันคือทั้งหมดที่เกี่ยวกับรหัสที่ไม่มีการทดสอบ
David

3

nosetests เป็นโซลูชันที่ยอดเยี่ยมสำหรับการทดสอบหน่วยใน python รองรับทั้งแบบทดสอบและการทดสอบตามที่ตั้งเป้าหมายและช่วยให้คุณเริ่มต้นได้ด้วยไฟล์ปรับแต่งง่าย ๆ


ลิงก์ nosetests ของคุณล้าสมัยแล้ว ดูเหมือนว่าสถานที่ใหม่คือ: nose.readthedocs.org/en/latest
odigity

1
ตามเอกสารใน github และเว็บไซต์ nosetest noseและnose2อยู่ในโหมดบำรุงรักษา เป็นการเริ่มต้นที่ดีกว่าpy.testเพราะมีการสนับสนุนมากขึ้น
alpha_989
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.