มีวิธีระบุการทดสอบ pytest ที่จะเรียกใช้จากไฟล์หรือไม่?


190

มีวิธีเลือกpytestการทดสอบเพื่อเรียกใช้จากไฟล์หรือไม่? ตัวอย่างเช่นไฟล์foo.txtที่มีรายการการทดสอบที่จะดำเนินการ:

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

หรือมีวิธีในการเลือกการทดสอบหลายแบบโดยไม่มีรูปแบบทั่วไปในชื่อการทดสอบจากไดเรกทอรีต่าง ๆ ด้วย pytest หรือไม่?

pytest -k <pattern> อนุญาตให้ใช้รูปแบบเดียว

ทางเลือกหนึ่งคือการpytest.markต่อต้านการทดสอบแต่ละครั้ง แต่ความต้องการของฉันคือการใช้การทดสอบที่แตกต่างกันจากไฟล์ที่แตกต่างกัน

มีวิธีการระบุหลายรูปแบบและชื่อไฟล์ทดสอบสำหรับแต่ละรูปแบบหรือไม่?

หรือ

มีวิธีระบุพา ธ ทดสอบที่แน่นอนในไฟล์และฟีดไฟล์นั้นเป็นอินพุตpytestหรือไม่

หรือ

มีฟังก์ชั่น hook ที่สามารถใช้เพื่อจุดประสงค์นี้หรือไม่?

คำตอบ:


231

คุณสามารถใช้-kตัวเลือกเพื่อเรียกใช้กรณีทดสอบด้วยรูปแบบที่แตกต่างกัน:

py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

สิ่งนี้จะเรียกใช้กรณีทดสอบที่มีชื่อtest_001และtest_some_other_testยกเลิกการเลือกกรณีทดสอบที่เหลือ

หมายเหตุ: นี่จะเลือกกรณีทดสอบใด ๆ ที่เริ่มต้นด้วยtest_001 หรือ test_some_other_test ตัวอย่างเช่นหากคุณมีกรณีทดสอบtest_0012ก็จะถูกเลือก


1
ขอบคุณ แต่ถ้ามีการทดสอบชื่อเดียวกันใน foo.py และ bar.py (พูด test_001) มันจะจบลงด้วยการดำเนินการจากทั้งสองอย่าง
Sharad

2
ใช่มันจะมีสิ่งใดที่ตรงกับรูปแบบจะถูกประหารชีวิตตามที่ฉันได้กล่าวไว้ในหมายเหตุ
supamaze

แต่นั่นเป็นปัญหาสำหรับฉัน ฉันต้องการเลือกการทดสอบที่จะดำเนินการจากไฟล์ใด
Sharad

@NamGVU `-k <ชื่อวิธีทดสอบ>`
supamaze

4
มันควรจะเป็นpy.test path/to/test/file.py -k function_name_test
LittleZero

91

การระบุการทดสอบ / การเลือกการทดสอบ

Pytest รองรับหลายวิธีในการเรียกใช้และเลือกการทดสอบจากบรรทัดคำสั่ง

เรียกใช้การทดสอบในโมดูล

pytest test_mod.py

เรียกใช้การทดสอบในไดเรกทอรี

pytest testing/

เรียกใช้การทดสอบตามนิพจน์ของคำหลัก

pytest -k "MyClass and not method"

สิ่งนี้จะรันการทดสอบที่มีชื่อที่ตรงกับนิพจน์สตริงที่กำหนดซึ่งอาจรวมถึงตัวดำเนินการ Python ที่ใช้ชื่อไฟล์ชื่อคลาสและชื่อฟังก์ชันเป็นตัวแปร ตัวอย่างข้างต้นจะทำงานTestMyClass.test_somethingแต่ไม่TestMyClass.test_method_simpleทำงาน

รันการทดสอบโดยรหัส id ของโหนด

การทดสอบที่รวบรวมแต่ละครั้งจะได้รับการกำหนดให้ไม่ซ้ำกันnodeidซึ่งประกอบด้วยชื่อไฟล์โมดูลตามด้วยตัวระบุเช่นชื่อคลาสชื่อฟังก์ชั่นและพารามิเตอร์จาก parametrization คั่นด้วย::อักขระ

ในการรันการทดสอบเฉพาะภายในโมดูล:

pytest test_mod.py::test_func

ตัวอย่างอื่นที่ระบุวิธีการทดสอบในบรรทัดคำสั่ง:

pytest test_mod.py::TestClass::test_method

เรียกใช้การทดสอบโดยใช้เครื่องหมายนิพจน์

pytest -m slow

จะทำการทดสอบทั้งหมดที่ตกแต่งด้วย@pytest.mark.slowมัณฑนากร

สำหรับข้อมูลเพิ่มเติมโปรดดูข้อมูลเครื่องหมาย

ทำการทดสอบจากแพ็คเกจ

pytest --pyargs pkg.testing

สิ่งนี้จะนำเข้าpkg.testingและใช้ตำแหน่งระบบไฟล์เพื่อค้นหาและเรียกใช้การทดสอบ

ที่มา: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests


test_mod.py::TestClass::test_method ทำงานได้ดีที่สุดสำหรับฉัน
StephenGodderidge

1
ควรทำเครื่องหมายว่า anser ที่ยอมรับ
Adam Hughes

13

หากคุณมีชื่อเมธอดเดียวกันในสองคลาสที่แตกต่างกันและคุณต้องการเรียกใช้หนึ่งในคลาสเหล่านี้การทำงาน:

pytest tests.py -k 'TestClassName and test_method_name'

6

วิธีที่ 1 : การทดสอบที่เลือกแบบสุ่ม ยาวและน่าเกลียด

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

วิธีที่ 2: ใช้นิพจน์คำหลัก

หมายเหตุ:ฉันกำลังค้นหาตามชื่อ testcase เช่นเดียวกับชื่อ TestClass

กรณีที่ 1:ด้านล่างนี้จะเรียกใช้สิ่งที่พบ เนื่องจากเราใช้ 'OR'

python -m pytest -k 'test_password_valid or test_no_configuration'

ให้บอกว่าทั้งสองข้างต้นถูกต้องจริงการทดสอบ 2 ครั้งจะเริ่มขึ้น

กรณีที่ 2:ตอนนี้ชื่อที่ไม่ถูกต้องและอีกชื่อที่ถูกต้อง

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

พบและเรียกใช้เพียงหนึ่งรายการเท่านั้น

กรณีที่ 3 : หากคุณต้องการให้การทดสอบทั้งหมดรันหรือไม่มีใครให้ใช้และ

python -m pytest -k 'test_password_valid and test_no_configuration'

ทั้งสองจะทำงานถ้าถูกต้องหรือไม่

กรณีที่ 4:เรียกใช้การทดสอบในโฟลเดอร์เดียวเท่านั้น:

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

กรณีที่ 5:เรียกใช้การทดสอบจากไฟล์เดียวเท่านั้น

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

กรณีที่ 6:เรียกใช้การทดสอบทั้งหมดยกเว้นการแข่งขัน

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'

1

ตามเอกสารเกี่ยวกับการทดสอบการเรียกใช้โดยรหัสโหนด

เนื่องจากคุณมี ID โหนดทั้งหมดใน foo.txt ให้รัน

pytest `cat foo.txt | tr '\n' ' '`

นี่คือคำสั่งด้านล่างเดียวกัน (มีเนื้อหาไฟล์ในคำถาม)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test

1

คำตอบของฉันมีวิธีเรียกใช้ชุดทดสอบย่อยในสถานการณ์ต่างๆ

เรียกใช้การทดสอบทั้งหมดในโครงการ

pytest

เรียกใช้การทดสอบในไดเรกทอรีเดียว

ในการรันการทดสอบทั้งหมดจากหนึ่งไดเรกทอรีให้ใช้ไดเรกทอรีเป็นพารามิเตอร์เพื่อ pytest:

pytest tests/my-directory

เรียกใช้การทดสอบในไฟล์ทดสอบ / โมดูลเดียว

หากต้องการเรียกใช้ไฟล์ที่เต็มไปด้วยการทดสอบให้แสดงรายการไฟล์ที่มีพา ธ สัมพัทธ์เป็นพารามิเตอร์ไปที่pytest:

pytest tests/my-directory/test_demo.py

เรียกใช้ฟังก์ชั่นทดสอบเดี่ยว

ในการเรียกใช้ฟังก์ชั่นทดสอบเดี่ยวเพิ่ม::และชื่อฟังก์ชั่นทดสอบ:

pytest -v tests/my-directory/test_demo.py::test_specific_function

-v มีการใช้เพื่อให้คุณสามารถดูว่าฟังก์ชันใดทำงานอยู่

รัน Single Test Class

หากต้องการเรียกใช้คลาสเพียงทำอย่างเดียวกับที่เราทำกับฟังก์ชั่นและเพิ่ม::จากนั้นชื่อคลาสของพารามิเตอร์ไฟล์:

pytest -v tests/my-directory/test_demo.py::TestClassName

เรียกใช้วิธีการทดสอบเดี่ยวของคลาสทดสอบ

หากคุณไม่ต้องการรันคลาสการทดสอบทั้งหมดเพียงหนึ่งวิธีเพียงเพิ่มอีก::วิธีและชื่อเมธอด:

pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method

รันชุดการทดสอบตามชื่อการทดสอบ

-kตัวเลือกที่ช่วยให้คุณสามารถที่จะผ่านในการแสดงออกในการเรียกใช้การทดสอบที่มีชื่อบางประการที่ระบุโดยแสดงออกเป็น substring ชื่อการทดสอบ เป็นไปได้ที่จะใช้และ , หรือ , และไม่สร้างนิพจน์ที่ซับซ้อน

ตัวอย่างเช่นเมื่อต้องการเรียกใช้ฟังก์ชันทั้งหมดที่มี _raises ในชื่อ:

pytest -v -k _raises

0

บางทีใช้pytest_collect_file()hook คุณสามารถแยกเนื้อหาของไฟล์.txto .yamlที่การทดสอบระบุตามที่คุณต้องการและส่งกลับไปยังแกน pytest

ตัวอย่างที่ดีแสดงอยู่ในเอกสารประกอบการทดสอบ ฉันคิดว่าสิ่งที่คุณกำลังมองหา


0

ต่อไปนี้เป็นคำตอบที่เป็นไปได้บางส่วนเนื่องจากอนุญาตให้เลือกสคริปต์ทดสอบได้เท่านั้นไม่ใช่แบบทดสอบเดี่ยวภายในสคริปต์เหล่านั้น

และมันก็ถูก จำกัด ด้วยการใช้โหมดความเข้ากันได้แบบดั้งเดิมกับunittestสคริปต์ดังนั้นจึงไม่รับประกันว่ามันจะทำงานกับ pytest ดั้งเดิม

ไปที่นี่:

  1. สร้าง dictory subset_tests_directoryใหม่บอกว่า
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. test_directoryต้องระมัดระวังเกี่ยวกับการนำเข้าซึ่งโดยปริยายถือว่าอยู่ในไฟล์ ฉันต้องแก้ไขหลายอย่างด้วยการวิ่งpython foo.pyจากภายในsubset_tests_directoryและแก้ไขตามต้องการ

  5. เมื่อสคริปต์ทดสอบทำงานอย่างถูกต้องเพียงcd subset_tests_directoryและpytestมี Pytest จะรับเฉพาะสคริปต์ที่พบเท่านั้น

ความเป็นไปได้อีกอย่างหนึ่งคือ symlinking ในสารบบทดสอบปัจจุบันของคุณบอกว่าเป็นแล้วln -s foo.py subset_foo.py pytest subset*.pyสิ่งนี้จะหลีกเลี่ยงไม่จำเป็นต้องปรับการนำเข้าของคุณ แต่มันจะทำให้สิ่งต่าง ๆ ยุ่งเหยิงจนกว่าคุณจะลบ symlink ออก ทำงานให้ฉันเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.